【デジタル採点】採点斬り2021verをPythonで作ってみた

### 2021/11/11追記
紹介用の動画を作りました！細かい機能はさておき実際に使ってみたい場合は、こちらの動画をご覧ください。
<iframe width="560" height="315" src="https://www.youtube.com/embed/zhaWaxFah2g" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# はじめに
* 教員にとって、採点は時間がかかる業務の一つです。高校教員で必修科目を担当する場合には、40人×8クラスの採点を一人で行わなくてはいけません。
* マークシート式で試験を実施すると、採点時間が大きく削減されます。しかし定期試験では作図問題や論述問題も問いたいです。
* 記述採点の効率化のためには、竹内俊彦氏作成の[採点革命](http://www.nurs.or.jp/~lionfan/freesoft_45.html)や島守睦美氏作成の[採点斬り](http://www.nurs.or.jp/~lionfan/freesoft_49.html)などの素晴らしいフリーソフトがありましたが、いずれも2000年代初頭のソフトで開発は中断されているため、実行のためにVBランタイムの導入が必要だったり、いくつかのバグが残っていたりと、2021年現在では課題があるのも事実です。
* そこで、記述問題のデジタル採点を可能にするソフトウェアを作成しました。

# 作ったもの
![icon](https://raw.githubusercontent.com/phys-ken/saitenGiri2021/master/appfigs/icon.ico)[採点斬り2021](https://phys-ken.github.io/saitenGiri2021/)

# できること
* 解答用紙の設問領域をマウスで選択します。
![gazou](https://github.com/phys-ken/saitenGiri2021/blob/master/appfigs/1giri.gif?raw=true)
* それぞれの問題が斬りとられて、採点画面に表示されます。
* 数字キーで点数を入力します。
   * 最新版では、数字の入力規則のためにチェックボックスがあります。
![gazou](https://github.com/phys-ken/saitenGiri2021/blob/master/appfigs/2saiten.gif?raw=true)
* Excelに出力ボタンを押すと、Excelファイルが出力されます。名前領域を画像として出力するので、名前と対応するように横に生徒番号等を入力しておけば、Vlookup関数等で直接データを扱えます。
![gazou](https://github.com/phys-ken/saitenGiri2021/blob/master/appfigs/3xlsx.png?raw=true)
* また、元画像に点数を書き込んだファイルを出力することもできます。
![gazou](https://github.com/phys-ken/saitenGiri2021/blob/master/appfigs/4kaitouyousi.jpg?raw=true)

# 処理の概要
* 初期設定をすると、`setting/input`フォルダと`setting/output`フォルダと、`setting/ini.csv`が作成されます。
* 解答用紙の切り取り範囲は、`ini.csv`に書き込んでいき、範囲確定を押すと`ini.csv`を`trimData.csv`に名前を変えて、切り取る座標を保存します。
* `setting/trimData.csv`の座標データをもとに、`setting/input`の中の画像をPillowで連続トリミングします。
* `setting/output`の下に設問ごとに`Q000X`というフォルダを作成し、切り抜いた画像を保存します。
* 採点作業では、`Q000X`の中に`Q000X/n`(nは点数)という名前のフォルダを新規作成し、画像をその中に振り分けて保存していきます。
* フォルダ構造に基づいて、Excel出力や採点結果画像の出力を行います。

# コードの概要
* TkinterでUIを作成しました。
* Pyinstallerで実行ファイルにコンパイルしました。
* Pillowで画像の読み込み、トリミング、文字の記入を実装しています。
* openpyxlでExcelへの書き込みを実装しています。
* tkinterで画像を表示するためには、pillowのimgオブジェクトはグローバル変数にしないといけないようです。低レイヤは詳しくないですが、切り取った画像などがメモリを圧迫するのは良くない気がしたので、`配列の初期化→.append`で処理を書くようにしてみました。この辺については、詳しい方のアドバイスをもとに高速化を実現したいです。
* 採点の進捗をどう保存していくかについては工夫しました。`ini.csv`にログを残していこうかとも思いましたが、エラー回避を書くのがめんどくさかったので、`ini.csv`への設定の保存は最小限にして、進捗等はフォルダ構造で判別するように工夫しました。Excelに出力や、採点結果画像の出力の際には、flagを立てながら`os.walk`でフォルダ構造を解析して、点数を出力しています。


# 今後の展望
* Pythonで作成しているので、機械学習と相性が良いはずです。`pyocr`等のライブラリと連携して、自動採点ができるといいなあという野望はあります。
* ![icon](https://raw.githubusercontent.com/phys-ken/saitenGiri2021/master/appfigs/icon.ico)[採点斬り2021](https://phys-ken.github.io/saitenGiri2021/)のリンクでは、ソースコードもすべて公開しています。ぜひ、改造、改良をしてください。
* 著作権は放棄していません。改造する場合は、ライセンスをご確認ください。

# 参考にしたサイト
* [【Python】簡易的な仕分け機能付き画像ビューワー作ってみた](https://qiita.com/hisakichi95/items/84b73ba14731bc68608a)
* [【python】マウスドラッグで画像から範囲指定する](https://qiita.com/hisakichi95/items/47f6d37e6f425f29c8a8)
* [How to make a tkinter canvas rectangle transparent?](https://stackoverflow.com/questions/54637795/how-to-make-a-tkinter-canvas-rectangle-transparent/54645103)
* [【python, pyinstaller】画像や音楽などの外部ファイルも一括でexe化して配布する](https://msteacher.hatenablog.jp/entry/2020/06/27/170529)