前書き
こんにちは。ソフトウェア・エンジニアの迫田です。
今回はKYLA社のうち有志で集まっているロボット部での活動を紹介します。
ロボット部では「ロボットに関連するハードウェア・ソフトウェアの知見を貯める」ことを目的として、それぞれが気ままに開発しています。今回はそのうちの一つである『顔識別と体温チェック』のプロジェクトについて紹介します。
このプロジェクトでは仮想的なユースケースとして
『作業場所にカメラを置き、登録された人の顔を検出して、体温を確認する』
ということを想定し作業を進めています。前述した通り、この部での目的は主に知見を貯めることであるため、実際に役に立つ良いものを作ることよりも、作る過程を通じて今まで触ってこなかったものへの知識を深めることを重視しています。
今回だと主に
- ソフトウェア的側面としてROS2
- ハードウェア的側面としてJetson nanoやサーモグラフィーのマイコン
について馴染みを得ることを目標としました。当記事の筆者はこれまで基本的にソフトウェアで完結するものしか学んできていないため、これらは完全に0から学習する機会でした。
今回はソフトウェア編ということで「(1)ROS2を使ったソフトウェア開発」のところを紹介します。
完成物紹介
早速ですが、できたものを示します。
ROS2で通信して動画を処理し、できるだけリアルタイム的に「顔識別」と「体温表示」を行っています。今回では6~7FPSほどで動作しています。
顔識別:すでに登録済の人に対してはその人の人名を表示し、未登録の人に対してはunknown表示をしています。
体温表示:体温の方はまだセンサが準備できていないのでダミーとして常に36℃として表示しています。
ROS2について
ROS2(Robot Operating System 2)は、ロボットアプリケーションの開発に特化したオープンソースのフレームワークです。(https://docs.ros.org/en/foxy/index.html)データの受け渡しや処理タイミングの制御などROSに任せることで、処理に関するアルゴリズム部分に集中して開発することができます。
ROS2は、パブリッシャー/サブスクライバー、サービス/クライアント、アクション/サーバーなどのコンポーネントを提供しています。今回はリアルタイムに毎フレーム同じ形式で処理を続けていくような想定をして、パブリッシャー/サブスクライバー方式でノードを作成し、機能を実現していきました。
設計概要
作ったプログラムの構成としては、以下のようになります。今回作ったのは4つ青いノードとなります。
サーモグラフィノード
見える画角での温度をH_2 ×W_2のサイズで出力します。現状ではダミーとして常に一定値36℃を画像全領域について出しています。後編のハードウェア部分で主に扱っていきます。
顔領域抽出ノード
カメラノードから得た画像を入力として、MediaPipeを用いて顔領域を抽出します。Mediapipeとは、Googleが開発したオープンソースのマルチプラットフォームの機械学習フレームワークであり、顔領域抽出なども学習済みモデルが手軽に扱えます。(https://google.github.io/mediapipe/solutions/face_detection.html)
カメラノード
カメラから得た画像をPublishするノードです。デバッグ時には動画ファイルを読み込んでフレームごとに出力するようにもし、再現性が状況で検証できるようにしていました。
個人識別ノード
カメラノードから得た画像と、顔領域抽出ノードで得た顔領域と、サーモグラフィノードの結果を集めて、各顔矩形が誰であるか、またその体温はいくつかといった情報を処理します。個人の特定には、深層学習のinsightface(https://github.com/deepinsight/insightface)のArcFace学習済みモデルを利用して画像を特徴量に変換し、登録済みの人物画像と近ければその人であると特定します。insightfaceは顔認識技術に特化したオープンソースのリポジトリであり、様々な学習済みモデルを公開しています。
場合によってはこういった深層学習部分の方が難しく感じられるかもしれませんが、筆者自体はもともとこういった分野に馴染みがあり、また今回はかなり「学習済みモデルを利用するだけ」でもあったため、これらモデルについての詳細は割愛させていただきます。
所感
まだソフトウェア部分のみで、完成度としても全然洗練されていないものですが、ROS2のパブリッシャー/サブスクライバー型の仕組みである程度のプログラムが作れてよい経験になりました。
ROS2は、C++やPythonから簡単に使えるようになっており、今回は手軽さを重視してPythonからの利用を行いましたが、PythonであるとDeepLearning系のライブラリも利用しやすく、スムーズに開発できたと感じます。
今回のROS2利用は入門も入門といった部分なので、今後はより深い開発へ進んでいければと思います。
次回、ハードウェア編に続く。