Reconnaissance optique de questionnaires à choix multiple

Un petit système pour la lecture automatique de questionnaires à choix multiples, que j'avais expérimenté sur mes étudiants de TD d'informatique en 2003.

L'utilisation de questionnaires à choix multiple pour des partiels ou examens finaux dans des domaines nécessitant des capacités cognitives autres qu'automatiques (type code de la route) est discutable. Mais pour le contrôle continu des connaissances, par exemple dans les premières années de l'enseignement universitaire, je pense qu'ils peuvent convenir, ou compléter les pratiques existantes. Leur avantage est, bien entendu, qu'ils sont faciles à corriger. Tellement faciles, qu'on les corrige souvent par lecture optique. De plus, on peut détecter certains types de fraude par tests statistiques, en mesurant l'implausibilité pour deux étudiants voisins de faire les mêmes choix erronnés. Le coup d'un test de contrôle continu pour le moniteur est donc réduit, et les étudiants apprécient également l'objectivité de la note finale.

Ainsi j'ai développé un système simple de reconnaissance optique de questionnaires à choix multiples et je l'ai expérimenté pour un contrôle continu au temps où j'étais allocataire de recherche/moniteur à l'UFR d'Informatique de l'Université Paris VII. Je remercie les étudiants d'IF 241 qui ont participé à ce test.

Description du système

Le principe est simple. Le partiel est constitué de dix questions, chaque question ayant cinq réponses possibles dont une est la bonne. Les étudiants répondent en noircissant des cercles imprimés sur un formulaire.

Pour éviter la fraude, les étudiants sont divisés en quatre groupes A, B, C, D, chaque groupe recevant les mêmes questions mais dont les réponses sont permutées.

Un système de reprise permet, pour chaque question, en noircissant un cercle spécial, de disposer d'un nouveau groupe de cercles pour la réponse. Ainsi on peut répondre au questionnaire au stylo, à condition de ne pas changer d'avis plus d'une fois par question.

/resources/mcq/formulaire3.png.thumb.png

Une page A4 avec un groupe de quatre formulaires au format A6.

/resources/mcq/formulaire2.png.thumb.png

Un formulaire de test annoté avec la sortie de déboguage, montrant les zones reconnues.

/resources/mcq/formulaire1.png.thumb.png

Un vrai formulaire rempli par un vrai étudiant (qui n'a pas souhaité renseigner son nom mais uniquement son numéro d'étudiant), avec les annotations. La reconnaissance se fait sans aucune intervention manuelle. En vert, les cercles reconnus comme étant remplis.

Une fois que les étudiants ont rempli leurs questionnaires, je les numérise à l'aide d'un scanner à plat.

Un programme Ocaml prend en entrée les images, lit les réponses et le numéro étudiant qui est également codé, et calcule la note au contrôle continu. En sortie, il produit également une image annotée, en entourant les cercles qu'il a reconnus; cela permet de s'assurer qu'il fonctionne correctement.

Les formulaires sont au format A6 ce qui permet de les scanner quatre par quatre sur un scanner A4.

Technique

Chaque feuille est munie de six codes-barre, deux verticaux et quatre horizontaux. Une paire de codes-barre de même orientation permet de déterminer une ligne sur l'image numérisée. Les trois paires de codes permettent donc de caler le rectangle d'impression avec une précision suffisante, sachant qu'on a quatre degrés de liberté.

Chaque code-barre est constitué de deux codes superposés, un code "horloge" et un code "données". L'algorithme de reconnaissance est alors simple ; en faisant l'hypothèse que l'angle d'erreur est petit, le balayage suivant deux lignes parallèles et proches permet de lire le code, sachant que la ligne d'horloge est située en haut ou à gauche. Ce schéma est loin d'être parfait mais il a parfaitement convenu pour mon essai initial.

De plus la partie donnée est en fait une séquence binaire à rétroaction linéaire, séquence dont la longueur est bien supérieure à l'ordre de rétroaction. Cela permet, sans même devoir implémenter l'algorithme de Viterbi, de repérer le code dès qu'un nombre de positions consécutives vérifie la relation linéaire du code, ce qui introduit une certaine tolérance aux erreurs.

Remarquons que si on assure que la séquence binaire a des transitions suffisamment fréquentes, on pourrait s'affranchir de la piste horloge en utilisant un PLL numérique.

Une fois le rectangle calé, il suffit de mesurer la noirceur des cercles dont les positions sont connues, et d'effectuer une décision. On peut utiliser un seuillage simple, ou bien trier, pour chaque question, la noirceur des cercles et de choisir le cercle le plus noir comme réponse probable, sauf si les valeurs sont toutes proches. Il s'agit là de choix qui s'imposeront d'eux-même au bout de plusieurs itérations, mais là je n'avais qu'une itération et donc je me suis contenté d'un seuillage simple.

J'aurais pu avantageusement utiliser des blobcodes au lieu des codes-barre, mais à l'époque la démarche de valorisation avait juste commencé et le dépôt de brevet n'avait pas été effectué; l'invention devait donc rester confidentielle.

Implémentation

Le programme de reconnaissance est écrit en Ocaml. Bien qu'il n'ait pas un grand intérêt, si ça vous intéresse, je peux le nettoyer des spécificités de son application et le mettre en ligne.

2003-12-01