-->

2020年12月17日木曜日

マスクをした顔を認識する(OpenCV)

 Ogaki Mini Maker Faire 2020で顔認識を使用した作品を展示しました。昨今のコロナ状況下で顔認識するためには、マスクをした人の顔を認識する必要があるのですが、ここではどのようにそれを実現したのかを記載しておきます。

使用するシステムはRaspberryPi3B+で、ネットワークなしのローカルで完結する構成にしました。持ち運びや設置などの取り回しが容易になるからです。その代わりRaspberryPiではPCなどに比べ処理性能が制限されます。また、フリーで使用できるライブラリということで顔認識にはOpenCVを使用することにしました。

同様にフリーで使用できる顔認識がdlibというものに含まれており、こちらは68点のランドマークを使用した高性能な顔認識が使用できます。しかし、残念ながらマスクなしが前提となっており、今回は候補から外れます。

OpenCVには"haarcascade"というかの有名なHaar-like特徴量を使用した認識モデルが実装されています。同時に学習済みのデータも含まれているのですぐに認識機能を使用することができます。これら学習済みのデータの種類についてはこちらが参考になります。

この学習済みデータには正面の顔を認識するものがあるのですが、これはマスクをしていない顔を学習したデータなので、マスクをした顔を認識しようとすると性能が低下します。ということで今回は両目の認識をすることで顔認識の代替とすることにしました(マスクをしていても両目は見えるので)。目を認識する際に使用できる学習データは「右目」と「左目」があるのですが、正直目を個別に認識をすると統合処理が面倒なのでどうしたものかと思っていましたが、こちらに"haarcascade"に対応した「両目」の学習済みデータがありました。どうやらこれらの学習済みデータはもうすでに不要と判断されOpenCV本体からは削除されているようです(他にも口や鼻がパーツとして認識できるものもあります)。

OMMF2020(屋内)で両目の認識("haarcascade_mcs_eyepair_big.xml"を使用)を動作させてみた雑感を以下に記載しておきます。

  • 認識しやすい人と認識しにくい人に分かれる
    認識しやすい人は顔の向きに関係なく安定して認識するが、認識しにくい人ははっきり正面を向いた顔を映さないと認識できない傾向がある
  • メガネをしている人が認識しにくい
    おそらく目の部分が隠れるからだと思われる
  • 誤認識が発生する
    遠方に全身が映っている複数の人の足元に誤認識が発生した

"haarcascade"で学習済みデータを使用する場合、手軽に認識機能を実現できるのは良いのですが、精度や誤認識が問題となったときに柔軟な対応ができないということがあります。認識の尤度の閾値設定ができず、設定ができるのは結果の重複数閾値と最小サイズぐらいです。あとは認識結果サイズによる誤認識の切り捨てぐらいしかできません。今回の展示は認識できれば良い程度のものであったため、認識しにくいことや誤認識に関しては特に問題とはなりませんでしたが。

2020年10月25日日曜日

コインアクセプタの解析

 この記事は2012年に別のHPで公開した内容です。今は未公開にしているのですが、たまにアクセスされているようなので、こちらで公開します。ここで解説しているコインアクセプタはAdafruitのものですが、おそらく別のコインアクセプタも仕様は同じかと思われます。参考までに。Amazonだと例えば以下のようなものが該当すると思います。


ここではAdafruitから購入したコインアクセプタの使い方を解説しています。 具体的には以下の商品です。

箱の中にはモジュールと説明が書かれた紙が1枚。紙をスキャンしたのが以下です。

サイトの商品ページに乗っている説明書と大差はないようです。
さて、このモジュールができることは以下のことです。
  • 4種類のコインを登録できる
    コインの直径を認識しているみたいなので、登録できるのは直径の違う4種類のコインということになります。ですが、日本硬貨の5円と50円のような穴の開いたコインはうまく認識できないようです。
  • 登録したコインのみを認識して選り分けることができる
    投入したコインが登録されたものだったら後ろの排出口に、登録されていないものだったら前面の返却口に出力できます。
  • 認識したコインの種類を外部にパルスとして出力できる
    これによって何のコインが投入されたか知ることができます。
次はモジュール周りのインタフェースを見てみます。周辺部の写真を掲載します。
  1. 外部ピン(4本)
    名称説明
    DC12V+12V
    COIN認識したコインの種類をパルスで出力
    パルスの数はプログラム可能(任意数が出力できます)
    パルスはTTL?(5Vレベル)っぽいです
    パルスについては後に掲載あり
    GNDGND
    COUNTER不明
    謎です
    ※接続するコネクタはワイヤ付きで同封されています
  2. 2接点スライドスイッチ
    "NO"と"NC"の記載あり(ノーマリーオープン/コネクタ?)。よくわからないのでデフォルトの"NO"から触らず。
  3. 3接点スライドスイッチ
    - Fast
    - Medium
    - Slow
    上記3つの設定から出力パルスの長さを選択できます(後述)
  4. "SET"ボタン
  5. ”ADD"ボタン
  6. 7セグ
  7. ”MINUS"ボタン
    ※4から7は使用前の設定で使用します
使うにあたってはコインのパラメータ設定とサンプリングをする必要があります。パラメータ設定とは使用するコインの種類の数や出力パルス数の設定で、側面のボタンと7セグで行います。サンプリングは実際に使用するコインを投入してコインの種類を覚えさせる工程です。これらの手順は前述のAdafruitのサイトや同封されているマニュアルに掲載されています。

ここからは使用前の設定を解説していきます。電圧を印加すると1秒ぐらい経過した後、ブザーが鳴ってLED(表示灯)が点灯します(ブザーは結構大きな音ですので、びっくりします)。
まずはパラメータの設定を行います。電源を入れた状態で以下の手順を実行します。
  1. ”ADD”ボタンと”MINUS”ボタンを同時に1秒以上押す
    ボタンを離すと7セグに”A”が表示されます。
  2. ”A"が表示されたら”SET"ボタンを1秒以上押す
    ”SET"ボタンを離すと7セグに”E"が表示されます。
  3. ”E"が表示されたら”ADD"ボタンと”MINUS"ボタンで認識するコインの種類を決め、”SET"ボタンを1秒以上押す
    このモジュールは4種類のコインを認識できるので1から4が設定可能です。”SET"ボタンを離すと”H1"が表示されます。”H1"の”1”はコインの1種類目を意味していると思います。
  4. ”H1"が表示されたら”ADD"ボタンと”MINUS"ボタンでサンプル数を決め、”SET"ボタンを1秒以上押す
    サンプル数とはこのパラメータ設定の後に行うコインのサンプリングを行う回数です。設定できる最大は30で、15以上を設定するとより正確性が増すとマニュアルにあります。 ”SET"ボタンを離すと”P1"が表示されます。”P1"の”1”は"H1”と同様にコインの1種類目を意味していると思います。
  5. ”P1"が表示されたら”ADD"ボタンと”MINUS"ボタンで出力パルス数を決め、”SET"ボタンを1秒以上押す
    このモジュールは認識したコインの種類をパルスの数で出力します。ここではそのパルス数を設定します。マニュアルによると最大は50だそうです。 ”SET"ボタンを離すと”F1"が表示されます。”F1"の”1”は"H1”と同様に (略)。
  6. ”P1"が表示されたら”ADD"ボタンと”MINUS"ボタンで正確度を決め、”SET"ボタンを1秒以上押す
    正確度とは所謂”あそび”に関連しているものだと思われます。1から30まで設定可能で、1であれば最も正確、30であれば曖昧になります。通常は5から10が最適だとマニュアルにあります。似た形状のコインを認識したい場合は小さくしたほうが良いとのこと。 ”SET"ボタンを離すと”H2"が表示されます(2種類以上の設定を行った場合)。
  7. "6"の手順が終わると"4"へ戻るので、"3"で設定したコインの種類の数だけ"4"から"6"の設定を繰り返す
  8. ”A"が表示されたら”SET"ボタンを1秒以上押す
  9. ”E"が表示されたら電源をOFFにする
次は実際にコインを投入するサンプリングの手順です。複数回(同種類の複数枚の)コインを投入する必要がありますが、同一のコインを複数回投入しても大丈夫です(たぶん)。
  1. ”SET”ボタンを1秒以上押す
    ボタンを離すと7セグに”A1”が表示されます。
  2. ”A1"が表示されたら1種類目のコインをパラメータ設定で設定したサンプル数の回数分投入する
    コインを投入すると7セグに投入した回数がカウント表示されます。設定回数分投入すると7セグに”A1"が点滅表示されます。
  3. ”SET”ボタンを1秒以上押す
    ”SET"ボタンを離すと”A2"が表示されます。
  4. "3"の手順が終わると"2"へ戻るので、"2"から"3"の設定を4回繰り返す
    ここではパラメータ設定で設定したコインの種類の数によらず4回行わなければならないようです。ただし、"SET"ボタンを1秒以上押すことでコインのサンプリングをスキップすることが可能です。
    例:2種類のコインを使用したい場合、"A3"と”A4"はスキップします
  5. すべて終わると自動的に再起動します
※設定後、設定したコインを投入すると一瞬だけそのコインの出力パルス数が7セグに表示されるので何を認識したかはモジュール単体でもわかります

実際の日本硬貨を使用する際の設定例を以下に掲載します。残念ながら穴の開いている5円と50円はうまく認識できません(事実サンプリング時に投入するとカウンタが1ではなく2ずつ増えるので認識できていないと考えられます)。ですので使用するのはその2種類を除いた4種類の硬貨です。5円はいいのですが50円が認識できないのは正直微妙なところです。
設定後動かしてみましたが正しく認識できました。
  • 設定値
    10円100円500円1円
    サンプル数15151515
    出力パルス5101520
    正確度5555
注意点としては、モジュールを水平に設置しないとうまく認識しません。コインの直径を見ているとは思うのですが、どのようにセンシングしているのか興味深いです。

では、COINから出力されるパルスを見てみます。パルスはロジアナを使用して観測しました(ZEROPLUSの安いロジアナ使用->これ)。スライドスイッチは"Fast"を選択しています。
  • 出力パルス設定"5"のコインを認識した波形
    プルアップされていてローのパルスが出力される模様。
  • 上の波形を少し拡大して時間を表示したもの
    約30msのパルスが出力されているようです。この出力幅はスイッチで変更できます。
その他のスライドスイッチの設定も試してみました。以下にまとめておきます。
  • スライドスイッチの設定と出力パルス長の関係
    スライドスイッチ設定出力パルス長
    "Fast"約30ms
    "Medium"約50ms
    "Slow"約100ms
解析は以上です。

2020年4月22日水曜日

Air umbrellaの話

以下、HACKADAYより引用(意訳)。

Failed: Air Umbrella | Hackaday
https://hackaday.com/2020/01/25/failed-air-umbrella/
約5年前、kickstarter(クラウドファンディングサイト)で"Air umbrella"というプロジェクトが発足した。当初はクラウドファンディングという形態の目新しさも相まって、プロジェクトは資金を集めることに成功した。しかし、紆余曲折を経て結局はプロジェクトは失敗に終わった。
"Air umbrella"は、頭上に落ちてくる雨を圧縮空気を使って弾き飛ばすことにより、コンパクトな傘を実現しようとした。
雨滴の最終的な落下速度は約時速20マイル(32キロ)と言われる。となると、傘のような広い範囲の雨を防ごうと思うと、少なくとも時速25マイル(40キロ)で空気を噴射する必要がある。
頭のすぐ上でそんな空気の噴射をしたい人がいるのだろうか?このような空気の噴射は持ち運びできる小型バッテリーでどのくらい持つのだろうか?
現実的ではないこのプロジェクトは結局失敗した。投資をした人の中には物理学者はいなかったのだろうか?

このプロジェクトが開始された当時、クラウドファンディングが流行っていたが、思いの外お金が集まっていてびっくりしたことを覚えている。このような空気の噴射は実はものすごくエネルギーを必要とする(身近でいうとドライヤーがいい例)。所長は昔、スカートをめくるためにブロアファンを使用した作品を作ったことがあるが、電力を食う割には弱い風しか発生させられなかった記憶がある。