FileMaker
機械学習
DeepLearning
画像認識
Darknet

FileMakerで機械学習(会議室の利用状況を画像認識で調べる)

More than 1 year has passed since last update.

はじめに

こちらの記事でDarknetという、高性能なのに扱いやすい機械学習フレームワークが存在することを知りました。
これだけ簡単なら、普段業務で使っているFileMakerからでも機械学習が行えるんじゃないかと思い、実際にやってみました。
https://pjreddie.com/darknet/

目標

とりあえず元記事と同じように、会議室の利用状況取得を目指します。
Mac Book Airひとつで処理を完結させようと思い、内蔵カメラで自動撮影する方法から調べてみました。
課題は以下のとおりです。

  • Mac Book Airの内蔵カメラで自動撮影する。
  • 写真に写っている人を自動認識し、人数をカウントする。
  • 人数と解析結果をFileMakerに取り込む。

開発環境

Mac Book Air(Early2015、High Sierraにアップデート済み)
FileMaker Pro 14
たぶん多少バージョンが違っても問題なさそうです。

Darknetのインストール

Darknetのインストールはとても簡単です。
わずか3ステップで完了してしまいました。

Step1.
git clone https://github.com/pjreddie/darknet
Step2.
cd darknet
make
Step3.
wget https://pjreddie.com/media/files/yolo.weights
  1. GitHubから取得し
  2. Makeして
  3. 学習済みデータをダウンロード

たったこれだけです。
configureすら必要ありません。

インストールが終わったらサンプル画像で動作確認してみましょう。

./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg

標準出力はこうなりました。

data/dog.jpg: Predicted in 12.805825 seconds.
dog: 82%
truck: 64%
bicycle: 85%

predictions.pngに認識結果の画像が保存されます。
predictions.png

内蔵カメラで自動撮影

Macに標準で入っているAutomatorで作りました。
カウントダウンの音が鳴らないように音量を0にしてからビデオスナップショットを実行し、JPEGに変換しています。
設定内容は下図を御覧ください。
アプリケーション形式で保存しましょう。
実行すると内蔵カメラの撮影結果がDarknetをインストールしたフォルダにroom01.jpgというファイル名で保存されます。
スクリーンショット 2017-09-28 15.55.27.png

画像解析して人数をカウント

Darknetの解析結果はテキストファイルにしてFileMakerに取り込むことにしました。
まずはシェルスクリプトを作ります。

darknet.sh
#!/bin/bash
cd 「Darknetが格納されたフォルダ」
./darknet detect cfg/yolo.cfg yolo.weights room01.jpg | tee results/result_room01.txt | grep person | wc -l > person_room01.txt
rm room01.jpg

少し解説します。

tee results/result_room01.txt
teeコマンドは標準入力を標準出力とファイルに出力します。
Darknetの実行結果はresult_room01.txtに保存されるとともに、次のgrepコマンドに渡されます。

grep person | wc -l > person_room01.txt
grepで解析結果から「person」のある行だけが抽出され、wcでその行数がカウントされます。
これが画像に写っている人数ということになり、リダイレクトでperson_room01.txtに保存されます。

rm room01.jpg
Automatorで写真を撮ると、同一ファイル名がある場合は上書きせずに、別名で保存します。
繰り返して処理する場合は別名で保存されると都合が悪いので、ここで削除しています。

解析結果をFileMakerにインポート

テーブルはこんな感じにしてみました。
スクリーンショット 2017-09-28 18.02.23.png

スクリプトです。
スクリーンショット 2017-09-28 15.46.37.png
AutomatorとシェルスクリプトはそれぞれAppleScript経由で呼び出しています。
Automator実行時は処理の終了を待たずに抜けてしまうので5秒間のスリープを入れています。
シェルスクリプトの実行時は処理の終了を待ってから次の処理が行われます。
念のため0.5秒のスリープを入れています。

インポートは3回に分けて行っています。

まず人数は通常のインポートで、これにより新規レコードが作られます。

解析結果は改行を含んだテキストファイルなので、通常のインポートでは複数レコードに分割されてしまいます。
そこでresultsフォルダに対するフォルダごとのインポートを用いています。
こうすることで改行を含んだ1ファイル分の内容がひとつのフィールドに格納されます。
resultsフォルダには単独のファイルだけ格納する必要があります。

最後に解析結果の画像をオブジェクトとして保存しています。

適当にレイアウトを作ってみました。
スクリーンショット 2017-09-28 19.27.31.png
こんな風に顔が写っていなくても、かなりの精度で人として認識してくれます。

最後に

cronやスケジューラを使って、このスクリプトを一定間隔で動かせば、会議室の利用状況を取得することができます。

FileMakerでも簡単に画像認識ができるようになったので、いろいろ応用できそうですね。