月別アーカイブ: 2025年7月

マウスだけで操作可能な画面の拡大表示ツール “KindLens” のご紹介

「見る力を、やさしく支える」KindLens — ドラッグとクリックだけで、視界のバリアを取り払います。

【もくじ】

1.機能のご紹介
2.ダウンロード
3.お願いとお断り

矢印型 Form をこの位置に置いてクリックすると・・・
予め設定した範囲を、指定した倍率で、図のように枠のない別窓に拡大表示します。
別窓を指定時間後に自動で閉じる設定も可能です。
(デフォルト設定では、幅640×高さ320ピクセル、倍率2倍で、2.5秒間表示後、自動で閉じます)

追記(20250715)

初期バージョンにあった不具合を解消しました。主な改善点は以下の通りです。

(1)矢印型 Form の画面上の位置に応じて、矢印の向きとキャプチャ範囲を自動設定します。
(2)矢印形状(方向)のリアルタイム描画で、より直感的なキャプチャ範囲設定を可能としました。
(3)キャプチャ画面を指定時間後に自動で閉じる機能を追加しました(0.5秒刻みで設定可)

  指定時間経過後に拡大表示画面が自動で閉じる機能はデフォルト ON になっています。

また、上記改善を行った後、マルチモニター環境で行ったテストにおいて、プログラムの設計時、設定 Form の Scaled プロパティの確認を怠り、これを「 True のまま」としたため(なぜ、そうなっているのか、わかりませんが、 Delphi では Form の Scaled プロパティはデフォルト True なのです)、設定 Form に配置した VCL コントロールの配置がモニタの解像度によっては乱れてしまうことを確認し、一旦公開を中止して当該箇所の不具合を修正し、再度公開しました。

プログラムにはバージョン番号の表記等は一切ありませんので、矢印型 Form を右クリックすると表示されるサブメニューから「設定」をクリックして選択し、表示される設定画面が正常でない場合は、当記事のダウンロードリンクより、最新版の KindLens.exe をダウンロードしていただけますよう、伏してお願い申し上げます。

今後も、修正・改善箇所があればこの記事で報告し、修正・改善したプログラムをダウンロードリンク先にアップロードいたします。

追記(20250716)

拡大表示画面の表示位置の微調整を行いました。また、矢印型 Form の初期表示色を「白」、サイズを設計時の50%としました。

1.機能のご紹介

このプログラムは、重い障害のある方が右手でトラックボールマウスを操作して、動画・静止画を問わず、画面上に表示されている細かな文字や図を拡大表示して読めるように Delphi の力を借りて開発したものです。利用規約及び使用条件に同意していただければ、どなたでも無料でお使いいただけます。

PCの画面を拡大表示できるツールは Windows の拡大鏡をはじめとしてさまざまなものがありますが、各種設定変更の必要性がなく、単一の実行形式ファイルのダブルクリックで起動し、マウス操作(ドラッグ&ドロップと左ボタンクリック)のみで画面の拡大表示を実現できる無料ツールはおそらくないのではないかと思います。

使い方は・・・

【初期バージョン】※ 現在、ダウンロードできません。

(1)矢印型の Form を拡大表示したい領域の右下へドラッグして移動します。
(2)ドロップした矢印型 Form 上をクリック(マウスの左ボタンを押し下げ)します。
(3)ドロップした位置の左上方向の画面が、拡大表示されます。

【改良バージョン】

矢印型のFormを拡大表示したい領域へドラッグすると、その位置に応じて矢印の形状(指し示す方向)が変化しますので、拡大表示したい領域(の右上・左上・左下・右下位置)へドロップすると、自動的にキャプチャされた範囲が、予め設定した倍率・大きさで拡大表示されます。

拡大したい領域の右上・左上・左下・右下のどこにドロップしたらよいのかは、矢印の形状から直感的に判断できるように改善しました。

拡大倍率は、デフォルト設定2倍です。表示窓の大きさは、デフォルト設定で幅640ピクセル、高さ320ピクセルです。これらの設定は任意の値への変更と、変更した状態の保存が可能です(ただし、簡単にデフォルト設定に戻す機能は用意してありません — 少々乱暴ですが、exe と同じ場所にある exe と同じ名前の拡張子が ini のイニシャライズファイルを削除すれば、デフォルト設定に戻ります)。なお、イニシャライズファイルは、削除しても「設定」画面の保存ボタンをクリックすれば、exe と同じ場所に再生成されます。

言葉で表現しても動作の様子がイメージしにくいと思いますので、実際の実行例をご覧ください。

拡大表示したい範囲の右下へ矢印型Formをドラッグして移動します。


矢印型 Form 上(内部)をクリック(マウスの左ボタン押し下げ)します。すると、次のように矢印方向左上の画面が拡大表示されます。※ 改良版では、矢印型 Form のドロップと同時に拡大表示されます。

拡大表示された別窓(窓枠はありません)をクリックすれば表示は消えます。
改良版では、指定時間経過後に自動的に消去する設定も可能です。
(ESCキー押し下げでも拡大表示は消えます)


ESCキー押し下げによる拡大表示の消去機能は、当初、計画したプログラムの仕様にはありませんでしたが、このプログラムをお使いになる方の左側に、介助される方がいらっしゃるような場合には役立つことがあるかもしれないと考え、実装しました。

また、矢印型の Form は、常に最前面に表示されますので、動画等を全画面表示している場合でも問題なく動作します。拡大表示は矢印型の Form 上をクリックすることで実行されますので、動画アプリの操作と干渉することはありません(動画を流したまま、その一部の拡大表示が「静止画」として可能です)。

私のPC環境では、TEAMSで配信した動画や、YouTube の動画は静止画として拡大表示できましたが、PC環境や通信方法によっては動画を静止画として取得できない場合があるかもしれません。また、このプログラムは Microsoft 社の Windows11 で開発し、同 OS 上で動作確認を行っています。他社製 OS 上での動作は未確認ですので、間接的な方法やエミュレーション技術を利用されて本プログラムを Windows 以外の OS 上で実行される場合は、プログラムそのものが動作しない可能性があることに十分ご注意ください。

【プログラムの開発環境(ご参考まで)】

・デバイスの仕様

 デバイス名	XXX
 プロセッサ	11th Gen Intel(R) Core(TM) i7-1185G7 @ 3.00GHz (3.00 GHz)
 実装 RAM	32.0 GB (31.7 GB 使用可能)
 デバイス ID	
 プロダクト ID	
 システムの種類	64 ビット オペレーティング システム、x64 ベース プロセッサ
 ペンとタッチ	10 タッチ ポイントでのペンとタッチのサポート

・Windowsの仕様

 エディション	Windows 11 Pro
 バージョン	24H2
 インストール日	‎2024/‎10/‎05
 OS ビルド	26100.4652
 エクスペリエンス	Windows 機能エクスペリエンス パック 1000.26100.128.0

・開発環境

 Embarcadero® Delphi 12.3 (バージョン 29.0.55362.2017)
 Professional with Mobile

当初は、拡大対象が動画であった場合は、拡大表示の映像も動画そのものをリアルタイムで拡大して表示する実装でプログラミングしていたのです・・・が、よくよく考えますと、このプログラムは、その前提として、定点に固定されたビデオカメラで写した映像を視聴する場合を想定しており、特に、「ビデオカメラ自体による画面のズームや向きの変更がない」状態で配信された映像中の文字や図表等を確認したい場合のヘルパーとして役立つ(使える)ように開発しましたので、「読めること」を何よりも優先し、動画も静止画として拡大表示する実装に途中から設計方針を変更しました。

また、矢印型 Form の大きさはデフォルト設定よりさらに大きくすることもできます。ただし、大きくした場合は、矢印内でのクリック位置により、意図した表示範囲と拡大画像の範囲が若干ずれることがあります。

【設定の変更方法】

設定を変更するには、矢印型の Form 上を右クリック(マウスの右ボタン押し下げ)して、表示されるサブメニューから「設定」を選んでクリックします。

「閉じる」をクリックするとプログラムは終了します。


設定画面が次のように表示されます。矢印のサイズは設計時の設定を100(%)としてあります。その他の項目は直感的に意味を御理解いただけると思います。

実行時のイメージをキャプチャしました。


矢印型 Form の色と大きさを変更してみました。

色を水色に、サイズは40%に縮小してみました。


矢印の色に「白」を設定した場合は、矢印の輪郭を黒で描画して白背景の画面でも矢印 Form の位置がわかるように工夫してあります。ただし、白以外の淡色を指定した場合は、このような黒い輪郭の描画は行われません。くれぐれもご注意ください

色を「白」に設定した場合、矢印の輪郭が黒い線で描画されます。


もし、矢印 Form の色を白以外のごく薄い淡色に設定して、矢印型 Form の表示位置がわからなくなった場合は、タスクバーに表示されている KindLens のアイコンを右クリックして表示されるメニューから「ウィンドウを閉じる」を選択(クリック:マウスの左ボタン押し下げ)する方法で、プログラムを終了することができます。

設定状態を保存していない場合は、次回起動時には矢印型 Form の色は以前の状態に戻ると思いますが、ごく薄い淡色の設定状態を保存した場合は、KindLens.exe と同じ場所にある KindLens.ini を削除してから KindLens.exe を起動してください。矢印型 Form は初期設定の赤い状態で表示されます。その後、必要に応じて各種設定を変更してください。設定変更後、「保存」ボタンをクリックすれば、拡張子が ini のイニシャライズファイルが再作成され、新しい設定がこのファイルに保存されます。

タスクバーのアイコンを右クリックした状態です。


上の図で、本来「 KindLens 」と表記されるはずの部分が「 Project1 」と表示されているのは、開発環境である Delphi の最初の保存時のプロジェクトファイルの名称が「 Project1 」であったためかと思われます。

開発が軌道に乗った後、プロジェクトファイルの名称を「 KindLens.dproj 」に変更したのですが、この部分の表記は変更されませんでした。これは Delphi の仕様かと思われます。

【設定の保存】

設定値の変更をデフォルト状態として保存します。


設定画面左下の「保存」ボタンをクリックすれば、イニシャライズファイルに設定内容が記録され、次回起動時は保存された設定内容に従って起動します。

「保存」ボタンをクリックすると、KindLens.exe と同じ場所に KindLens.ini が自動的に作成されます。この拡張子が ini のファイルは設定が記録されているファイルなので、誤って消去しないよう十分にご注意ください(ini ファイルを消去した場合、プログラムはデフォルト設定で起動します)。

また、キャプチャする幅と高さは任意の値を直接指定するか、ComboBox の選択肢から選べます。

//キャプチャ画面の幅と高さの実装コード
cmbCW.Items.AddStrings(['240', '320', '400', '480', '560', '640', '720', '800']);
cmbCH.Items.AddStrings(['240', '320', '400', '480', '560', '640', '720', '800']);

上のコードからわかる通り、選択肢から選べる値は、80の倍数としてあります(80の倍数とした理由は特にありません。480とか、640という数字に対して、僕がうまく言葉に出来ない懐かしさを感じることが、その最大の理由であるように感じます)。

この KindLens と題したプログラムには、自分で考えた最低限の「あったらいいな!」と思う機能はすべて搭載しましたが、今後、実際に使用して判明した問題点等があれば速やかに改善したいと思います。その際は、この blog にバージョンアップ版を掲載いたします。

KindLens に関する操作の説明は以上です。たいへん申し訳ありませんが、取扱説明書やヘルプファイルの準備はございません。仕様・操作方法の説明につきまして、その必要がありましたら、この記事をご参照いただけますよう、お願いできましたら(また、ご案内等いただけましたら)幸いです。

2.ダウンロード

KindLens は、次のリンクからダウンロード可能です。ただし、ご利用に当たっては、利用規約及び使用条件への同意が必要です。

ダウンロード後、ダウンロードした KindLens.zip を右クリックし、表示されるサブメニューから「すべて展開」を選んでクリックしてください。次の画面が表示されます。

展開する場所を指定される場合は「参照」をクリックして、任意のフォルダを指定します。
zip ファイルと同じ場所に展開する場合は、そのまま「展開」をクリックしてください。


無事、ファイルが展開(いまだにこの表現に慣れません。どうしても解凍と言いたくなります)されると、次の3つのファイルがエクスプローラーに表示されます。

Windowsの設定によっては、exe 等の拡張子は表示されません。
(License.txt の内容は必ずご確認ください)


ルーペの中にハートの描かれたアイコンが KindLens の実行形式ファイル( exe )です。

このファイルをダブルクリックしてプログラムを起動してください。
(いきなりダブルクリックせず、このアイコンを右クリックすると表示されるサブメニューから「プロパティ」を選んで、Windows Defender SmartScreen による警告画面の表示を回避することもできます:後述)

【初回起動時に表示される警告について】

プログラムの起動に成功すると、初期状態では赤い矢印型 Form がお使いの PC の画面中央に表示されますが、ダウンロード&展開直後の最初の実行(プログラム起動)時には Windows の保護機能が働いて、次に示す Windows Defender SmartScreen による警告画面が表示されます。

「詳細情報」をクリックします。


次の画面が表示されます。

「実行」をクリックしてください。


これは KindLens.exe が悪意のあるプログラムであるために表示される警告ではなく、Windows に搭載されたセキュリティ機能に「未知の発行元や信頼性の低いファイルに対して警告を出す仕組みがある」ために表示されるものです。

ダウンロードされたファイルに「 Zone.Identifier 」という「ゾーン識別子」が付加されていると、Windows はこの識別子を見て「インターネット経由で取得されたファイル」と判断し、SmartScreen が警告を表示します。

【Windows Defender SmartScreen による警告画面を回避する方法】

ダウンロード&展開直後の最初の実行(プログラム起動)時には Windows の保護機能が働いて、上記 Windows Defender SmartScreen による警告画面が表示されますが、これを回避する方法もあります。以下、その手順です。

(1)KindLens.exe をいきなりダブルクリックせず、KindLens.exe のアイコンを右クリックすると表示されるサブメニューから「プロパティ」を選んでクリックしてください。

(2)次の画面が表示されますので、「全般」タブのいちばん下にある「セキュリティ:」部分を図に示した順にクリックしてください。

この作業を行うと、Zone.Identifier が削除され、警告は表示されなくなります。


上記作業を行うと、KindLens.exe に付加されていた「 Zone.Identifier 」という代替データストリーム(ADS)が削除され、警告の表示が出なくなります。「 Zone.Identifier 」はファイルの「本体(メインストリーム)」とは別の Windows の NTFS ファイルシステムの隠れた領域に付加されるメタ情報で、隠しストリームです。

上記のどちらかの方法で Windows の警告が表示される仕組みを解除してください。ADS の削除に成功すれば、次回の実行時から警告は表示されなくなります。

3.お願いとお断り

このサイトの内容を利用される場合は、自己責任でお願いします。記載した内容(プログラムを含む)を利用した結果、利用者および第三者に損害が発生したとしても、このサイトの管理者は一切責任を負えません。予め、ご了承ください。

手書き答案の「デジタル採点補助プログラム」のつもりで作った僕のAC_Reader に自動採点機能みたいなモノを搭載しました!

今回ご紹介するプログラムで、自動採点できるかもしれない(?)手書き答案の解答は・・・

カタカナ「ア・イ・ウ・エ・オ」のいずれか1文字、それから
数字の「1・2・3・4・5」のいずれか1つ、そして
記号の「〇 ・ × 」のどちらかです。

この・・・ わずか 12 個の、文字・数字・記号に限定したお話ですが、僕が行ったテストでは各種パラメータの微調整を行うことなく、デフォルト設定のまま、テストデータ(少ないですが)をほぼ正しく推論できました。※ 制作の最終段階での検証結果です。

「自己責任・サポート無し」という条件付きですが、もし、よかったら、お試しください。

どなたにもお待ちいただいておりませんが、2年ぶりにバージョンアップした解答欄リーダーです。

【もくじ】

0.注意事項
1.論より証拠
2.自動採点機能の使い方
3.推論用画像データの確認
4.プログラムのダウンロード
5.お願いとお断り

【注意事項】

初回の自動採点実行時にPCがフリーズしたような状態になることがあります(正しく動作している状態であっても、Python Engine の初期化には数秒を要します)。特に、ダウンロードした Zip ファイルを展開(解凍)した直後の初めての実行時や、インターネット接続が切れた状態で使用した場合、この初期化作業にかなりの時間を要する場合があることを実際に確認しました(常に、この現象が起きるわけではありません)。この現象発生時に、内部的に呼び出して実行している組み込み Python 環境はエラーメッセージを出しません。つまり、プログラムは単に Python Engine の初期化完了を待つ「待機状態」であることは明らかなのです・・・ が、「プログラムで使用しているどのライブラリがこの待機状態を作り出しているのか」という、はっきりした原因の特定まで現在至っておりません。

この現象は、自動採点実行時、最初の1回に限って発生します。2回目以降は、採点終了まで滞りなく(素人が作ったプログラムなので実行速度は遅いですが)動作すると思います。

お試しいただける方には、たいへん申し訳ありませんが、そのような現象が発生することがあることをご理解いただいた上で、ご試用していただけますよう、伏してお願い申し上げます。

また、このプログラムの動作には「Microsoft Visual C ++ ランタイムライブラリ」のインストールが必要です。お使いのPCに「Microsoft Visual C ++ ランタイムライブラリ」が入っていない場合は、下記 Web サイトから「VisualCppRedist_AIO_x86_x64.exe」をダウンロードし、ダウンロードしたプログラムを管理者権限で実行し、動作に必要なライブラリをPCにインストールしてください。なお、インストール時には Windows のユーザーアカウント制御(UAC) が起動し、管理者用のID とパスワードの入力を求められます。インストールでは、exe の名称からわかるように 32 ビット版と 64 ビット版それぞれの VC++ランタイムライブラリがお使いの PC にセットアップされます。なお、インストール後は(僕のPC環境では)再起動なしで、そのまますぐに AC_Reader.exe を実行できました。

「VisualCppRedist_AIO_x86_x64.exe」の入手先:

https://www.majorgeeks.com/files/details/visual_c_redistributable_runtimes_aio_repack.html

2025年6月11日現在、バージョンは「0.91.0」でした。上記 Web サイトの Download (64-Bit EXE) というリンクをクリックすればインストールプログラムをダウンロードできます。

1.論より証拠

自動採点実行時の画面のハードコピーを以下に示します。なお、テスト用データの手書き「文字・数字・記号」は、すべて「お手本」を参照しながら、僕自身が「お手本」を真似て書いたものです。

まず、最初にカタカナの「アイウエオ」5文字の推論結果です。

正解ラベル:「ア」の場合です。(全体を表示するため、解答欄画像は縮小表示しています)

サンプル画像は、画面の表示倍率を81%に設定しているため、細部が霞んでいます。


正解ラベル:「イ」の場合です。


正解ラベル:「ウ」の場合です。


正解ラベル:「エ」の場合です。


No,1とNo,12の画像に縦方向の直線状の汚れがありますが、推論用画像作成の前段階の処理でその除去に成功しています(これを除去しておかないと、例えばNo,12の画像の推論用データは空白の画像ではなく縦線「|」が入った画像になり、学習モデルは間違いなくこれを「1」と推論してしまうはずです)。

解答欄の切り出し直後の画像では、No,1とNo,12の画像の左側に薄い灰色の直線状の汚れがあります。


推論用データ(文字の輪郭を検出して縦横28ピクセルの画像として解答欄の画像から切り出す)を作成する前段階で、これらの汚れを除去する処理を入れています。

No,1とNo,12の画像にあった汚れはキレイに消えています。


この「文字を消さずに汚れのみ除去する」処理はけっこう苦労しました。が、なんとか工夫を重ねて実現できました。「エ」の構成部品である「|」を消さずに、左側の汚れの「|」のみ除去するのは大変でしたが、線状の汚れと判断する基準にその高さ(長さ)を採用して、それが画像の高さとほぼ等しい場合は汚れと見なすことで、この問題はクリアできました。

以下、そのスクリプトです(ご参考まで)。

# 画像内の灰色の直線状汚れを除去

import cv2
import numpy as np
import os
from glob import glob

folder = r".\GrayLine"
image_extensions = ["*.png", "*.jpg", "*.jpeg"]
image_paths = []
for ext in image_extensions:
    image_paths.extend(glob(os.path.join(folder, ext)))

tolerance = 20  # 画像の高さとの誤差許容範囲(ピクセル単位)

for image_path in image_paths:
    image = cv2.imdecode(np.fromfile(image_path, dtype=np.uint8), cv2.IMREAD_COLOR)
    if image is None:
        continue
    height, width = image.shape[:2]
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    edges = cv2.Canny(gray, threshold1=20, threshold2=80, apertureSize=3)
    lines = cv2.HoughLinesP(edges, rho=1, theta=np.pi / 180, threshold=50, minLineLength=50, maxLineGap=5)

    if lines is not None:
        for line in lines:
            x1, y1, x2, y2 = line[0]
            angle = np.degrees(np.arctan2(y2 - y1, x2 - x1))
            line_length = np.hypot(x2 - x1, y2 - y1)

            # 垂直線かつ画像の高さとほぼ同じ長さのみ除去
            if (abs(angle - 90) < 1 or abs(angle + 90) < 1) and abs(line_length - height) < tolerance:
                cv2.rectangle(image, (x1-5, 0), (x2+5, height), (255, 255, 255), 2)
                cv2.rectangle(image, (x1-4, min(y1, y2)-5), (x2+4, max(y1, y2)+5), (255, 255, 255), -1)

    cv2.imencode(".png", image)[1].tofile(image_path)

正解ラベル:「オ」の場合です。


カタカナ「アイウエオ」の5文字は間違えずに推論できました。イイ感じです。
次は数字の「12345」。何となくイケそうな気がしてきました☆

正解ラベル:「1」の場合です。


あ・れ・?

なんで「2」に〇が・・・

夢なら覚めてくれ・・・ T_T

一瞬。そう思いましたが・・・

大丈夫。転ぶのには慣れています。これまでだって さんざん・・・、

ここまで来て、あきらめるなんて、そっちの方が無理です。

急いで推論用の画像を確認。

何の問題もなく、解答欄画像からの切り抜きに成功している・・・


・・・ ということ は、学習データに問題があった ってコトか?

左へ 微妙に傾いているように見えます・・・

よくよく考えてみると、このような左に傾いた「2」は、利き腕が右の場合、なんとなく書きにくいような気もします。このことから、つまり、推論をミスした原因は、学習用データとして用意した画像の中に、左に傾いた「2」が少なかったため(?)ではないかと思えてきました。

見たところ、この「2」の画像には極端なシミも汚れもなく、色の濃さも十分、形状もちょっと縦に伸びてるかなって感じもしますが、まぁ、これは一般的にどう見ても「2」です。輪郭検出にも間違いなく成功して期待通りに切り出せている以上、やはり推論ミスの原因は「その傾きにある」としか思えません。

そこで・・・ ナニをしたかというと、

微妙に傾きの異なる画像を50枚作成


取りあえず、1~20°の範囲で、0.5°ずつ傾きに変化をつけ、推論をミスした「2」を左に回転させた画像を上のように50枚用意(処理する際に名称は関係ないので、ファイル名に一貫性はありません)して、さらに「2」の学習データは全体で約7000枚あるので、その1割にあたる700枚を抜き出し、ランダムに5°、10°、15°、20°のいずれかの角度で左に回転させ、先に用意した50枚と合わせて水増し学習データを合計750枚作りました。

「水増し」なんて言うと(文脈にもよりますが)どちらかと言えばネガティブな意味を含むことが多く、なんだか、とてもずる賢い・よからぬことをしているように感じますが、機械学習で使われる「水増し」という言葉は、 データ拡張(Data Augmentation) という概念を表すもので、基本的に悪い意味はないようです。むしろ、このテクニックは、モデルの汎化性能を向上させ、過学習(Overfitting)を防ぐために重要な技術とされているようです。十分な学習データがない場合に、画像の回転・拡大・ぼかし・ノイズ追加などを行うことで、実質的にデータ数を増やせますし(=過学習の防止という意味でもこれは有効)、既存の学習用データに回転(やりすぎは禁物!)や、サイズ変更して作成した水増し学習用データを加えて学習モデルを作れば、異なる角度やサイズの文字にも対応できる、より頑健なモデルにすることができます。

※ 過学習(Overfitting):学習用データが少なかったりすると、学習モデルがそのデータに最適化されすぎてしまい、汎化性能が低下してしまうことを言うそうです。つまり、見たことがあるデータしか、推論に成功しなくなる(見たことがないデータに対して非常に弱くなる)わけですね。

こうして作成した水増し学習用データをを元の約7000枚に追加し、画像をランダムに並び替えて、連番の名前を付け直し、約7800枚の「2」の画像データを作り、そのうち1/3のデータは余白「4」、1/3のデータは余白「5」、1/3のデータは余白「6」を設定(余白の取り方を変更してモデルの汎用性を高めるため)して再学習用の縦横28ピクセルの画像データに変換し、1、3、4、5の各学習用データと合わせて、カタカナ「アイウエオ」の学習モデルを再度構築し直しました。

実際は、再度ではなく、再々々々・・・度の「構築し直し」ですが。
夢は、きっと、叶えるために、あります。

基本的な考え方としては(間違っているかもしれませんが)、学習用データの余白分布が4~6ピクセルであれば、モデルはその範囲内の「平均的」な状態、すなわち中央値に近い値(つまり5ピクセル)に合わせた特徴抽出を学習する(=最も代表的な状態に合わせて内部の重みが調整される)と仮定して・・・

(推論用データの余白の設定を中央値にすると正解率が良いように経験的に感じたのです)

この仮定がもし正しければ、推論用の画像データはそのすべてを「検出した輪郭の周囲に余白5を指定して作成」することで、モデルは最も慣れている条件下で推論動作を行える=最も良い正解率を示すはずだと・・・

実は、この輪郭検出(=文字認識)後、その周囲にどの程度の余白を設定するかについて最初は適当に「8」とか指定していたのですが、モデルの汎用性を高めるためには、学習データの余白の設定は一律に同じ設定としない方が良いはずなので、ある時、ふとその1/3に余白「8」、1/3に余白「9」、1/3に余白「10」を設定して学習モデルを作成し、推論の成否を確認していたところ、推論用データの余白を「9」に設定した場合に正解率がよくなるように感じました(正確に統計をとったわけではありません)。それと最終的には、学習用データ・推論用データともに縦横28ピクセルの画像とすることから、中央に配置した文字が実質縦横20ピクセル程度の領域に入る余白「4・5・6」あたりが最も適当であろうと考えたわけです。MNISTの作りを見ても、この考えは正しいように思われました。

もちろん、学習用データの余白を3・4・5として、推論用データの余白を中央値の4とする設定も考えましたが、余白が3ピクセルではさすがに小さすぎるのではないかと思い直し・・・ つまり、ちょっとした輪郭抽出のズレでも、文字がフレームに近づきすぎて、文字の上下左右の位置のバラつきが大きくなり、モデルが位置変動に過敏になる可能性が大きいと考えました。

逆に余白が6ピクセルと大きい方が、余白を3ピクセルとした場合よりも、文字が中央に安定しやすく、多少のズレがあっても特徴が大きく変わらなくなるはずです(機械学習においては、機械が覚え込んだ特徴量に近い特徴量を示す推論対象が正解とされるわけですから、このことは非常に重要です)。解答欄画像から輪郭検出を行って推論用データを作成する際の余白の設定を様々に変えて試行している際に、わずか1ピクセル、余白の設定を変更しただけで、正解になったり、不正解になったりする事実(プログラムのテストを繰り返す中で、この現象に気づいた当初は本当に不思議に感じました)は、まさにこの推測が正しいことの証明ではないかと思われました。

最終的には、すべて縦横28ピクセルの画像データとするわけですから、このあたりの判断がコトの成否を分ける、言わば「運命の分岐点」であったと、今、ここまでの歩みを振り返って思います。

また、この各数字の画像が約7000枚ずつあるというのは、僕の制作環境においては学習モデルを作成可能な制限ギリギリの値であったようで、学習モデル作成にあたってはまずPCそのものを再起動し、他のアプリが一切動作していない(メモリが十分に空いている)状態を作ってから、学習モデルを作成するスクリプトを実行する必要がありました。

ちなみに僕のPC環境(仕様)は、以下の通りです。

【デバイスの仕様】
プロセッサ	11th Gen Intel(R) Core(TM) i7-1185G7 @ 3.00GHz   3.00 GHz
実装 RAM	32.0 GB (31.7 GB 使用可能)
システムの種類	64 ビット オペレーティング システム、x64 ベース プロセッサ
ペンとタッチ	10 タッチ ポイントでのペンとタッチのサポート

【Windowsの仕様】
エディション	Windows 11 Pro
バージョン	24H2
インストール日	‎2024/‎10/‎05
OS ビルド	26100.4351
エクスペリエンス	Windows 機能エクスペリエンス パック 1000.26100.107.0

様々なアプリを使用した後や、Webブラウザを開いたままの状態で学習モデルを作成するスクリプトを実行すると、必ず「メモリが足りません!」というエラーメッセージが表示され、学習モデルの作成に失敗してしまうので、「再起動直後に実行する」という手を思いつく前は、「もはやこれまで」とせっかく作った学習データを減らそうかと思ったりもしました。

誰も教えてくれる人はいませんので、すべてが手探り状態で、後から考えれば実に様々な「それくらい最初から気がつけよ!」みたいな「プロから見れば当たり前のこと」に気づくまでに、試行錯誤を繰り返し、膨大な時間を費やしつつ、一歩一歩前進するしかありません。

昼間は仕事があるし・・・、夜はあたまの回転がトロくなるし・・・、なんや・かんやで、
だいたい日付が変わる頃に目を覚まし、あとは朝が来るまで、ちいさな灯りをともして・・・
僕の人生の中で、いちばん充実した「時」を過ごします・・・

自動採点を、あきらめない以上は・・・ その時々で、僕に出来る最善を尽くすのみ です。

何はともあれ、左に傾いた「2」を新しく学習したモデルが出来ました!

このモデルを用いて「1」の推論に再チャレンジした結果です。


やった! やった!!

なせばなる!!!

もちろん、余白の設定は「5」としてあります。

画像はプロトタイプのものです。

正解ラベル:「2」の場合です。

No,10の画像の「2」が正解となっていることもうれしいことです。
実は、No,11の画像は、検証用にわざと誤りのデータを他の画像から切り貼りして作成したものです。
つまり、正解ラベル「1」のNo,11の「2」と、上のNo,10の「2」は同じデータと思われます。


正解ラベル:「3」の場合です。


正解ラベル:「4」の場合です。


正解ラベル:「5」の場合です。


数字も正しく読めるようになりました☆


次は、記号の「 ○ と × 」です。

正解ラベル:「 ○ 」の場合です。


正解ラベル:「 × 」の場合です。



・・・・・・・


2025 年 6 月 15 日 午前4時
とうとう・・・
夢がかないました!


とても静か・・・

まだみんな
眠っています。

これも夢かもしれません。

夢なら、どうか・・・

覚めないでください。

2.自動採点機能の使い方

ダウンロードした zip ファイルを展開すれば、すぐにお試しいただけるよう、次に紹介する採点サンプルデータを同梱してあります。記事の説明を参照しながら、操作していただけますよう、お願い申し上げます。

この記事の冒頭にも書きましたが、プログラムの動作には「Microsoft Visual C ++ ランタイムライブラリ」のインストールが必要です。お使いのPCに「Microsoft Visual C ++ ランタイムライブラリ」が入っていない場合は、下記 Web サイトから「VisualCppRedist_AIO_x86_x64.exe」をダウンロードし、ダウンロードしたプログラムを管理者権限で実行し、動作に必要なライブラリをPCにインストールしてください。なお、インストール時には Windows のユーザーアカウント制御(UAC) が起動し、管理者用のID とパスワードの入力を求められます。インストールでは、exe の名称からわかるように 32 ビット版と 64 ビット版それぞれの VC++ランタイムライブラリがお使いの PC にセットアップされます。なお、インストール後は(僕のPC環境では)再起動なしで、そのまますぐに AC_Reader.exe を実行できました。

「VisualCppRedist_AIO_x86_x64.exe」の入手先:

https://www.majorgeeks.com/files/details/visual_c_redistributable_runtimes_aio_repack.html

2025年6月11日現在、バージョンは「0.91.0」でした。上記 Web サイトの Download (64-Bit EXE) というリンクをクリックすればインストールプログラムをダウンロードできます。

【採点の準備】

AC_Reader.exe をダブルクリックしてプログラムを起動したら、「採点作業」ボタンをクリックします。ここで「Windows によって PC が保護されました」と書かれた青い画面が表示された場合は、当 blog の過去記事に対応方法の詳細な説明を載せてありますので、そちらをご参照ください。

「採点作業」ボタンをクリックすると、次のメッセージが表示されます。


「はい」をクリックすると、既存の採点設定を選択できるようになります。


採点設定ファイルを選択するには、ComboBox の右側の ∨ マークをクリックします。すると候補の選択肢として採点サンプルファイルが1つだけ表示されますので、これをクリックして選びます。


案内メッセージが表示されます。


フォルダ選択」用のダイアログが表示されますので、解答用紙画像の入っている「フォルダを選択」してから OK をクリックしてください。

【重要】 選択するのは「フォルダ」であって、「ファイル」ではありません!


案内メッセージが表示されます。よく読んで OK をクリックしてください。

【採点設定ファイルとフォルダの関係】

最初に選んだ「採点設定ファイル」は、試験で使用した解答用紙の解答欄の座標他が登録されています。ですので、同じ解答用紙を使用して行った試験であれば、すべて同一の採点設定ファイルで採点作業を行うことができます。

通常、テストは「クラス単位」で実施されますが、採点設定ファイルはどのクラスに対しても共通で利用しますので、クラス名を入れない名称を付けて保存(例:R7_考査①_数学Ⅰ)するよう、ユーザーの皆さまにはご案内しています。

解答用紙の画像は、通常であれば「クラス名を付けたフォルダ(例:R7_考査①_数学Ⅰ_1A)」に保存するのが一般的であると思います。

ですので、このプログラムの実際の運用に当たっては、「採点設定ファイルにはクラス名を入れず、解答用紙の画像を保存するフォルダにはクラス名を含めた名前を付けてください。」とユーザーの皆さまへご案内しております。

【採点方法】

自動採点は、次の GUI で行います(僕は「フローティングパネル」と呼んでいます)。いろいろ考えてデザインしましたが、使い勝手がよくないと感じられる方もいらっしゃるかもしれません。そうだったら、ほんとに、ごめんなさい。

上部のタイトルバーに相当する部分を左クリックして、
そのまま(左ボタンを押したまま)ドラッグすると、
フローティングパネルを任意の位置へ移動できます。
(閉じるボタンは無効化してあります)


まず、現在、採点しようとしている設問への配点を設定します。


以下、手動採点時の採点方法の説明です。

手動採点時には、このまま、配点設定欄の下にある入力ボタンをクリックすると、配点設定欄が「0」であれば、現在表示されているすべての解答欄に不正解の「×」が、配点設定欄が「1以上」であれば、現在表示されているすべての解答欄に正解の「○」が(設定によっては配点の数字も)自動で入力されます。

これは、つまり、手動採点時には、初めに解答欄全体の出来栄えを見て、全体的によく出来ているような場合は一括して正解とし、不正解の解答欄だけを手動で採点、逆に全体的に出来がよくない場合には、一括して不正解とし、正解の解答欄だけを手動で採点した方が、効率よく採点できると考えて、このような仕様としました。

もちろん、自動採点時には、この入力ボタンをクリックする必要はありません。

また、配点を設定する ComboBox の右隣りの CheckBox「□する」にチェックを入れると、手動採点時に入力ボタンをクリックして、一括採点操作が行われる前に確認メッセージが表示されるようになります(誤入力を防ぎたいという、ユーザーからの要望で追加した機能です)。

【ここから自動採点の実行方法の説明です】

配点を入力後、自動採点を行う場合は、「□自動採点」にチェックを入れます。
次に、その下にある ComboBox からその設問の正解を選び、実行ボタンをクリックします。

正解として指定できるのは・・・

・カタカナの「ア・イ・ウ・エ・オ」のいずれか1文字、
・記号の「○・×」のどちらか1つ、
・数字の「1・2・3・4・5」のいずれか1つです。

これ以外のカタカナ(例えば「カ」)、記号(例えば「△」)、数字(例えば「6以上の数字」)は指定できません(決まりとして指定できないだけで、正解ラベルとしてComboBoxの入力欄に入力することはできます・・・が、正しく採点することは絶対に不可能です)。ただ、数字のゼロは、たぶん記号の「○」で代用が可能かと思われます・・・ ので、数字については、もしかしたら「0・1・2・3・4・5」の6種類が採点可能かも?しれません(試していませんが)。

また、正解ラベルに指定する文字・記号・数字は、直接入力せず、ComboBox の選択肢から選択してください。記号の「○:まる」に誤って漢数字の「ゼロ:〇」を指定しないようご注意願います。漢数字のゼロは「まる」の変換でも IME の変換候補の選択肢に表示されるので十分注意してください。

「チェック」→「正解ラベル選択」→「実行」です。


採点が完了すると、解答欄の画像の左上に、採点記号(自動採点を利用した場合は、○ or × のいずれか)と、先に設定した配点が赤く表示されます(表示位置は任意の位置に変更できます。変更方法は上で紹介しました当 blog の過去記事をご参照ください)。

自動採点実行直後の状態

お願い
ここで、全ての解答欄について、機械の採点結果を目視で必ず確認してください。

※ このプログラムは、添付した学習モデルの性能が及ぶ範囲で「正解・不正解」のいずれかを判定する自動採点を実行しますが、自動採点結果について、それが常に 100 %「正しい」ことを保証するものではありません。自動採点を行った結果につきましては、必ず、ご自身の責任で、直接、目視によって、その成否をご確認いただけますよう、お願い申し上げます。この使用条件に完全に同意し、かつ確実に目視による確認作業を実行していただける方のみ、このプログラムをお使いいただけますことを申し添えます。このプログラムに搭載した手動及び自動の採点機能を利用した結果、利用者および第三者に損害が発生したとしても、このサイトの管理者は一切責任を負えません。予め、ご了承ください。

【修正が必要な場合】

もし、修正が必要な場合は、修正対象の解答欄の画像をまずクリックします。

・正解に修正する場合は、配点に相当する数字キー(その設問の配点が「2」なら「2」のキー)を押下げします。

・不正解に修正する場合は、「B」キーを押下げします。ちなみに「B」は「 ×:Batsu 」の頭文字で、右手でマウス・左手で手動採点する際に「B」キーは押しやすい位置にあり、また、機能を覚えやすいんじゃないかと考え、「B」を不正解の入力キーとしました。

【採点結果の保存方法】

採点結果を保存(=書込み)しないと、次の解答欄を表示することはできません。実行の左隣にある「書込」ボタンをクリックしてください。採点結果が保存されます。

3.推論用画像データの確認

プログラム設計時の動作検証用に作成した機能ですが、解答用紙画像から切り出した解答欄画像と、その解答欄画像から切り出した推論用画像データの状態を確認することが出来ます。

【解答欄画像の確認方法】

まず、次のように、正解ラベルが「空欄」の状態で確認作業を実行した場合、解答用紙画像から切り出した解答欄画像を確認することが出来ます。

正解ラベルは「空欄」のままにしておきます。


正解ラベルが「空欄」のままであることを確認した後、「設定」→「推論用画像を確認する」の順にクリックしてください(元々、開発時に推論用画像を確認するために設けた機能なので、ボタンの名称が「解答欄・・・」ではありません)。

画像はプロトタイプのものです。


【重要】 設定画面表示中は、Form の「閉じる」ボタンは無効化されます。

解答欄画像が表示されます。


解答用紙から切り出した解答欄画像のクリーニングは、採点作業補助用の GUI (フローティングパネル)の CheckBox 「□自動採点する」をチェックして、さらに正解ラベルが空欄ではない状態で、実行ボタンをクリックすると行われる(ように設定してある)ので、クリーニング前の状態を確認したい場合は、自動採点を実行する前の段階、すなわち、「◀」もしくは「▶」ボタンをクリックした直後の、まだ「□自動採点する」をチェックせず、正解ラベルも指定していない状態で、「設定」ボタンをクリックして、「推論用画像を確認する」をクリックすれば(クリーニング前の解答欄画像を)表示できます。

リリース版では、上のプロトタイプの状態にさらに画像のクリーニング機能を追加、パラメータが増えたため、ボタンのキャプションは単に「推論用画像」としています。

採点エンジンは2系統あります。
Version1 を選択した場合は、各パラメータを調整できます。
(デフォルト設定は、パラメータを調整済みの Version2 としてあります)

プログラムは、「実行」ボタンをクリックすると、まず、解答用紙から切り出した解答欄画像のクリーニングを行って、それから自動採点を行います。初回のみならず、2度目、3度目の見直し採点時であっても、プログラムは「修正等を一切加えていない無加工の解答用紙画像」から解答欄を切り抜いて解答欄画像として表示しているので、汚れのある解答欄が毎回表示されます。クリーニングが行われるのは、実行ボタンをクリックした後であることにご留意ください。

【点状汚れの除去の例】

画像の左下隅に点状の汚れがあります。


クリーニング後の画像は・・・

よーく見ると、微かにうすいシミが残っていますが・・・まぁ、消えたと言えるんじゃないかと。
(ここは後日、さらに改良してより白くなるように修正しました)

【線状汚れの除去の例】

クリーニング前の画像の例(1番目と12番目の画像左端に線状の汚れがあります)


クリーニング後の画像は・・・

線状の汚れは消えました!

【推論用画像の確認方法】

自動採点を実行すれば、推論用に解答欄画像から切り出した、縦横28ピクセルの推論用画像を確認できます。自動採点時、実際に機械が見ているのは、この推論用画像になります。

正解ラベルが指定されている場合は、推論用画像を確認できます。


上の図のような状態で、「実行」ボタンをクリックした後で、「設定」→「推論用画像」の順にクリックします。

推論用画像が表示されます。


縦横28ピクセルの、この小さな画像を思った通りに切り出せるようになるまで、いったいどれくらいの試行錯誤を繰り返したか、今はもうそのすべてを思い出せませんが、自分の中に「あきらめる」という選択肢だけはなかったように思います。

これまでの経験から、ただひとつだけ言えることは、機械学習の成否はこの機械が見る(機械に見せる)画像にあるということです。

学習用データとまったく同じ手法で作成した推論用画像を自分では「ブレない画像」と呼んでいますが、画像中の汚れ・シミ等も含めて輪郭検出した部分の面積を計算し、その大きな部分を組み合わせた範囲を文字として切り抜き、中心位置を計算し、最適な余白を設け、汚れ・シミを除去し、白い部分はより白く、逆に薄い灰色は黒く(濃く)する等、文字の特徴量抽出を阻害する要素をできるだけ取り除いた、わずか縦横28ピクセルの、このちいさな文字。その「作り方」として、僕のとった方法が正解であったかどうかの答えを AC_Reader が出してくれると信じています。

もりろん、手書き文字にひとつとして同じ文字はありませんから、そのような意味で「正しいア」は存在しません。ただ、これまでの経緯から、特徴量抽出で機械が学んだ「ア」こそ、もしかしたら「正しいア」に最も近い「ア」なのではないかと思うようになりました。

ひとことで言えば、「正解がないのに、正解を探す旅」それが今、僕が思う機械学習のイメージです。

4.プログラムのダウンロード

自動採点機能みたいなモノを搭載した手書き答案の採点補助プログラム AC_Reader.exe 及びその関連プログラム一式を同梱した AC_Reader_v3.0_AutoGrading.zip は、次のリンクからダウンロードできます。なお、ダウンロードとご使用にあたっては、免責事項及び使用条件への同意が必要です。免責事項及び使用条件の詳細は付属の Readme.txt をご覧ください。

5.お願いとお断り

このサイトの内容を利用される場合は、自己責任でお願いします。記載した内容(プログラムを含む)を利用した結果、利用者および第三者に損害が発生したとしても、このサイトの管理者は一切責任を負えません。予め、ご了承ください。

追記_返却用答案の印刷方法について

元々、この AC_Reader には簡易的な合計点の計算と返却用答案の印刷機能があったのですが、高等学校現場における観点別評価の導入に伴い、返却用答案の印刷プログラムは、マークシートリーダーと共用の別プログラム(ReportCard_2024.exe)としました。

AC_Reader.exe から ReportCard_2024.exe を呼び出して実行できます。ReportCard_2024.exe の操作方法は、当ブログの過去記事をご参照ください。


こちらの過去記事にも ReportCard_2024.exe の操作方法の解説があります。上の記事と合わせてご参照ください。