ユニファ開発者ブログ

ユニファ株式会社プロダクトデベロップメント本部メンバーによるブログです。

手形のサイズを自動で計測する

R&Dエンジニアの浅野です。先日ユニファの仲間から「手形の写真からサイズは自動的に分からないの?」と相談を受けました。最近のスマートフォンにはAR技術を使って長さなどを測る機能がありますが、始点終点を定める手間があるのと精度がまだ不安です。大きさの参照となるものが一緒に写っているなら写真だけ撮っておけば後は自動で測定できるはず、ということで今日はその仮説を検証してみたいと思います。

準備

f:id:unifa_tech:20181109150725j:plain:w180:right
前提として、大きさの分かっている紙(今回はA4用紙)に手形が押してあるとします。娘に協力してもらい、手の縁取りをして色鉛筆などで塗りつぶしてもらったものを撮影しました。サイズをできるだけ正確に測る上でポイントとなりそうなのが、手形が必ずしも真上から撮影されるわけではないことと、手の向きが必ずしも台紙に対して真っ直ぐではないことです。

処理開始

AI全盛の時代なので、深層学習で手形の部分をセグメンテーションして・・・といきたいところですが、基準となる性能を理解する上でも最初はできるだけシンプルな方法でやってみるのが得策です。まずはカメラの角度によって用紙が台形に見えてしまっている部分に対処していきます。このままでは縮尺が歪んでいるため正しく大きさを知ることができないからです。基本方針として、用紙の四隅がどこにあるかを検出してそれを長方形に補正することにします。

人間は簡単に四隅を見つけることができますが、ソフトウェアでそれを実現するにはいくつかのステップを踏む必要があります。具体的には、まず画像をグレースケールに変換した後に二値化という処理を行います。二値化とは、ある閾値以上の輝度をもつ画素を白に、下回る画素を黒に強制的に変換することをいいます。そうすることで台紙の輪郭を抽出することが容易になります。

f:id:unifa_tech:20181109155239j:plainf:id:unifa_tech:20181109155258j:plainf:id:unifa_tech:20181109155310j:plainf:id:unifa_tech:20181109155324j:plain
グレースケール変換から2値化を経て台紙の輪郭が検出できた。

台形補正から手形領域の検出へ

f:id:unifa_tech:20181109162339j:plain:w300:left 輪郭がわかると四隅の座標を計算で求めることができます。するとその座標から射影変換という手法を使って台形に写っていた部分を長方形に補正することが可能となります。これで縮尺が正しくなったので、続いて手形の部分を検出してその大きさを推定するという作業に移っていきます。

手形の輪郭抽出には先ほどと同様にグレースケール変換や二値化を活用していきます。二値化処理は単純なように見えますが、実は輝度ムラやノイズの影響を受けやすいため、様々な環境で撮影された画像に対して精度良く働くようにする部分はエンジニアとしての腕が試されるところです。さて、うまく輪郭を捉えることができると手形の大きさの推定まであと一歩です。

f:id:unifa_tech:20181109160457j:plainf:id:unifa_tech:20181109160721j:plainf:id:unifa_tech:20181109160508j:plainf:id:unifa_tech:20181109160516j:plain
台形補正から上記と類似の変換を経て手形の輪郭が抽出できた

いよいよサイズ推定へ。

f:id:unifa_tech:20181109160732j:plain:w200:right 最終段階になって立ちはだかるのが、最初に挙げたポイントの二つ目です。手が台紙に対して真っ直ぐである保証はないため、単純に縦方向の座標の最大値から最小値を引けばよい、というわけにはいきません。主成分分析やパターンマッチングなどを使って手の向きを推定するという方向性もありますが、ここは検出した輪郭の外接円を描き、その直径を手形のサイズとする、という方針にしたいと思います。そうすることで手の向きを気にする必要がなくなります。後は得られた直径を台紙の大きさと比較して実際のサイズを算出します。この方法で推定された大きさは14.0cm。それに対して自分で定規で実測した値は約13.8cmでした。なかなか良い精度です!

人間が測るときにはどこに定規をあてればいいのか結構迷いますし、だからこそ人によって結果にばらつきがでそうです。それを考えるといつも同じ尺度で計測できるというのもソフトウェアで実行する利点の一つですね。

最後に

当初の目的であった仮説の検証は無事できましたが、もし仮にサービス化まで見据えると技術的な部分だけでも引き続き考えたいことはたくさんあります。

  • 絵の具を使った手形で指と手の平が 離れたり部分的にかすれたりしたときにどう処理すべきか?
  • この手形が誰のものかどうやって対応づけるか? 名前を一緒に書いてもらって文字認識をする?
  • そもそも所定の大きさの台紙を使うというのは許容されるのか? 切り取ったり飾りつけた後に写真を撮りたいのでは?
  • 写真に手形が写っていると(それこそ深層学習で)認識して、サイズ計測モードに自動で移行できたらかっこいい!

どれも簡単なものではありませんが、だからこそやりがいがある内容です。技術的にできる/できない、お客様に刺さる/刺さらない、ビジネスになる/ならない、様々な葛藤を乗り越えて世に送り出したものが受け入れられて役に立ったときの言葉にならない喜び。これがあるからエンジニアはやめられません。

保育の世界を変えるエンジニア募集中

弊社では一緒に働く仲間を大募集中です。少しでも興味を持たれた方はぜひ声をかけてください! ユニファ 株式会社の採用/求人 | 転職サイトGreen(グリーン)