(本記事はMENOUフォーラム1周年記念企画の技術コラムです)
こんにちは、MENOUで開発と営業を担当している中田です。
今回はAIにクラウド経由で照明を点けたり消したりさせてみました。
今回開発するプロジェクトは大きく2つのパートから構成されます。
- 照明が点いてるか消えてるかをAIで判別する
- クラウドのWebサービスを呼び出して照明をOFFまたはONする
[1. 照明が点いてるか消えてるかをAIで判別する]
うちのダイニングテーブル兼仕事机の頭上にある照明。
この電気がついてるかどうか判別するAIをまずは作っていきます。MENOU-TE(メノート)を使っている方にはおなじみの方法ですが、AIタスクの「領域検出タスク」を使ってまず照明がある領域を検出し、次にその領域をAIタスクの「分類タスク」を使って「点いてる」または「消えてる」のいずれかのクラスに分類します。
領域検出タスク「ダイニング照明」は消えてる状態と点いてる状態の両方を検出できるように学習させます。だいたいの位置が検出できれば良いので丸ペンでポンと照明の辺りを塗りました。学習枚数は2枚だけです。数分で学習が終わり、予定通りおおよその位置が推論できることを確認しました。
次に上記の推論結果を囲う矩形の解析領域が入力として渡される分類タスク「点いてる・消えてる」を作ります。といっても、やることは2つのクラスを定義して、与えられた解析領域をラベル付けによりアノテーションして学習するだけです。
判別のAIはこれで完成です。ここまでの開発時間が撮影も含めて15分。
[2. クラウドのWebサービスを呼び出して照明をOFFまたはONする]
先日、ハムスターを検出してみた のコラムでお伝えしたとおり、我が家はSwitchbotという製品で家電がIoT化されています。ダイニングの照明も赤外線リモコンで操作できるよう、引掛シーリングの間に挟めるオーム電機のリモコン受信機を付けた上で、Switchbot Hub miniからリモコン操作できるようにデバイス登録した上で、ONとOFFのリモコン操作を学習させてあります。
こうしてIoT化された家電は、通常は専用のSwitchbotアプリから操作するのですが、開発者向けにREST APIで操作する手段も用意されています。
上記記事のようなREST API呼び出しはcURLでもPythonでも行えますが、実はMENOU-TEからもREST APIが呼び出せるのです。MENOU-TEにはスクリプトタスクという機能が用意されています。スクリプトタスクは全タスク実行後に実行されるタスクで、その挙動をC#で記述することができます。典型的な使い方は複数のタスクの結果から何か計算をして検査結果を総合判定により導くことです。例えばこちらの記事では、物体同士の位置関係をスクリプトタスクで判定する方法が紹介されています。
上記のようなユースケースの他に、C#が記述できるという利点を生かして、何か別の処理を行わせることもできるのです。例えば、アプリを起動したり、PCのブザーを鳴らしたり、ネットワーク通信したり、などです。今回は、このようなスクリプトを記述し、Switchbotのクラウドサービスが提供するREST APIを呼び出しています。
// 検査をしない場合はnull 条件に一致する場合はtrue 条件に一致しない場合はfalse
bool? result = null;
var taskResult = GetPredictionTaskResult("点いてる・消えてる");
if (taskResult is IClassificationTaskResult classificationTaskResult)
{
string json;
if (classificationTaskResult.InspectionValue == "点いてる")
{ // 点いてたら消す
json = "{\"command\": \"turnOff\", \"parameter\": \"default\", \"commandType\": \"command\"}";
}
else
{ // 消えてたら点ける
json = "{\"command\": \"turnOn\", \"parameter\": \"default\", \"commandType\": \"command\"}";
}
using (var client = new System.Net.Http.HttpClient())
{
var url = "https://api.switch-bot.com/v1.0/devices/●●●●●●/commands";
client.DefaultRequestHeaders.Add("Authorization", "92708●●●●●●fbf8ae7d9a2ab3b9768b96eb13fb9");
var content = new System.Net.Http.StringContent(json, System.Text.Encoding.UTF8, "application/json");
var response = client.PostAsync(url, content).Result;
}
}
// resultは必ず最後の行に記述してください
result
今回は、「照明が点いてたら消す、消えてたら点ける」というスクリプトを悪ふざけで書いてみました。そうです、このようにスクリプトを書くとMENOU-TEは無限ループに陥り、照明のON/OFFを永遠にし続けます
AIの判別速度は約100msec、API呼び出しで照明がON/OFFされるまで約1.5秒かかるのでこれぐらいのスピードでピコピコと照明が点滅します。
【まとめ】
AIで照明が点いてるか消えてるかを判別し、その結果に応じてクラウド経由で照明を消したり点けたりするプロジェクトについてご紹介しました。実世界のアナログな情報をデジタルで認識しそれを元に別のデジタル制御を行って実世界を変化させる、というのはIoTというジャンルにおける大きな魅力です。
私たちのMENOU AI開発プラットフォームは、AIの検査結果を元に排除コンベアを制御したりする機能を標準搭載していますが、今回のようにスクリプトタスクを使えば手軽に様々な装置を制御することができます。「こんな装置も制御できますか?」「こんな処理を実行できますか?」などアイデア相談やご質問がありましたらお気軽にフォーラムやMENOUホームページにお問い合わせください