その1 サーモカメラの調査
2次元のサーモパイルセンサ(AMG8833)を使って熱画像を作る報告をしましたがhttps://twinkletec.org/2023/06/01/thermal_camera/ 8×8の分解能のため温度分布は捉えられても温度測定には役不足でした。犬の体温を測定では、眼球温度を使用しますが、8×8のセンサで繰り返し+最大値検出のアルゴリズムを使ってみましたが使えませんでした。(分解能が低いことが原因)
そこで、今回はもう少し分解能の高いサーモカメラを調査することにしました。
サーモパイルセンサとそれらを使ったサーモカメラを購入してみました。数千円から数万円の範囲で解像度も様々です。機能としては静止画保存、さらに上位の機種では動画保存ができます。解像度の高いものはFLIR社のLepton3.0以降のモジュールが使われていて、RGBカメラ画像との合成表示が可能で発熱位置の特定を高精度でおこなうことができます。
購入したカメラを並べてみました。サイズ感が判りやすいと思います。
ラズパイ5の発熱している画像をそれぞれのカメラで撮影しました。最大温度と最大温度箇所を比較できると思います。
解像度の低い、KKMoon(8×8)では、27.0℃、Vrttlkkfe(32×24)では34.7℃と低い温度が示されます。HIKMICRO(200×200)で38.9℃、HIKMICRO(256×192)で40.8℃、GOYOJO(256×192)で45.7℃でした。GOYOJO製品は自社でアプリ開発できてなくハードはHIKMICROの模倣品と思われます。HIKMICROは、自動キャリブレーション機能などがあり、犬の体温測定でも絶対値精度があることを確認しています。
縦画面(256×192)のHIKMICRO B10とGOYPJO GW256は、動画録画が可能で本体のメモリにmp4として保存する機能があります。動画や静止画取り出しはUSBメモリと同じようにPCに接続しコピペする必要があります。一方で、HIKMICRO E03には動画撮影機能は無く静止画像をメモリに保存する機能だけです。ただしスクリーンキャストというアプリケーションを使うことができます。サーモカメラをオンライン化するには非常にありがたいアプリです。スクリーンキャストはOBS studioのようなアプリですがHIKMICRO専用アプリです。(OBS studioとサーモカメラは繋がりません) また、GOYOJOはカメラ側にスクリーンキャスト機能はありません。
次回は、HIKMICRO E03をスクリーンキャストを使ってWindows-PCと接続し定点観察を行う試験を行います。
その2 サーモカメラによる定点観察
HIKMICRO E03とスクリーンキャストアプリを使用して定点観察を行う検討をしました。スクリーンキャストはサーモカメラの液晶画面をPC画面に映し出すアプリです。なので、Windows側から何かのコマンドを送って操作するというようなことはできません。(シャッターボタンのような機能はありません)
定点観察でできることは、Windowsの画面を定時間間隔でスクリーンショットして、熱画像部分だけを切り出し、タイムスタンプ名で画像保存することです。これだけではあんまりなので、画面に表示される最大温度をキャプチャし文字認識して、ログファイルに保存する検討をしました。
カメラ側の設定のため、HIKMICRO_E03の説明書から、画像データの取り出し方とスクリーンキャスト設定について書かれた部分を抽出しました。
定点観察の準備として、カメラ本体の設定とWindows-PCへのアプリ導入方法を説明します。カメラ側でローカル設定>接続>USBキャスト画面をONにします。
Windows-PC側では、HIKMICROのHPから「UVC_Alarm_App_EN_V1.0.0.exe」をDLしインストールします。
アプリを起動するとデバイスを探し接続するとサーモカメラ画面が現れます。
スクリーンショットするPythonのライブラリには、「Autopy」と「PyAutogui」があります。アプリケーションWindowを選択して使用す場合は、PyAutoguiが有利なようでしたのでPyAutoguiを採用しましたが、Windowの選択はできませんでした。
スクリーンショットのテストプログラムとテスト結果を示します。
その3 画面文字の認識について
文字画像を文字に認識するPythonライブラリには、大きく2種類があります。古典的なPytesseract(tesseractベース)とNNによる画像認識を応用した EasyOCR(pytorchベース:画像認識に近い)があります。それぞれ一長一短があります。Tesseractは名刺文字認識などに古くから使われていますが、文字が少し傾斜していた利すると読めません。
一方で処理時間は非常に速いです。EasyOCRはPytorchベースで認識精度は高い一方で処理時間が長い(CPU環境では数十秒)です。別な方からの相談で金属刻印文字認識で両者を比較した結果を示します。数秒間隔で定点観察する場合もあることを考えpytesseractを採用することにしました。
Tesseractを使用するためには、WindowsのProgramFileにtesseractをインストールしておく必要があります。そんなに厄介なことはないので我慢してインストールしてください。インストール方法を以下に示します。
Pytesseractライブラリを使用する場合の留意点を以下に纏めました。
実際にE03のキャスト画像から最大温度を読み取るプログラムを書いてみました。
キャスト画面から「26.2」という値を読み取ることができました。Tesseractでの認識時間は1秒程度でした。次は定点観察プログラムを作り、はんだごてを観察します。
その4 サーモカメラ定点観察テストプログラム
スクリーンキャストアプリが起動している環境で、CUIベースのpythonコードを起動し、時間間隔と測定回数を入力して測定開始。温度認識したログをファイルの保存します。 テストプログラムのコードを示します。
半田ごての電源を入れて切った状態の熱画像を、2秒間隔で30回の測定してみました。
熱画像の変化を示します。測定温度上限は、160℃となっており上限に達したため。途中ではんだごてのSWを切りました。
ログデータを確認しました。途中で誤認識や欠損している箇所がありました。手作業でデータを補完してエクセルでグラフを描いてみました。160℃までは15秒程度で上昇しSWを切ってからはゆっくり温度が効果していることが判りました。
その5 サーモカメラ定点観察プログラム
文字の誤認識を対策すること、スクリーンキャストアプリを自動起動しGUI操作画面がキャスト画面の邪魔にならないようにプログラムを修正する必要があります。まず、文字認識精度が低い原因調査と対策についてまとめました。原因は測定途中のキャリブレーション表示が原因でした。対策として熱画像画面でない温度表示部で文字認識を行うことにしました。
スクリーンキャストアプリの起動は、pythonのsubprocess.Popen()を使用しました。スクリーンキャストが起動して10秒後に、GUIが起動します。パラメータを入力するGUI画面は全体画面の右下に出現させます。
GUIプログラムの操作手順を示します。
熱画像は、タイムスタンプ名で保存されます。また、ログファイル(log.txt)には、タイムスタンプ、温度のコンマ区切りでデータが保存されます。誤認識や欠損は発生しませんでした。時間間隔を5秒に設定しましたが、実際には6~7秒でした。