ユニファ開発者ブログ

ユニファ株式会社システム開発部メンバーによるブログです。

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

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(グリーン)

グッドデザイン賞受賞展に行ってきた

こんにちは。ユニファのエンジニアの田渕です。 最近、急に冷え込んだせいか、周囲に風邪の人が多数!……なんて言っているうちに、私も軽い風邪をひいてしまいました。。。 みなさんにうつさないように、大人しく自宅勤務している日々です。

だんだんとインフルエンザの声も聞かれるようになる秋、人混みは避けた方が……なんて言われますが、そんな中、グッドデザイン賞の受賞展に行って参りました。 今日は受賞展の様子と、ユニファでのものづくりについてお話したいと思います。

グッドデザイン賞とは

「グッドデザイン賞」という名前は、耳にしたことがある方が多いと思います。 知らなくても、あの赤い丸に「G」のマークのロゴは目にしたことがあるのではないでしょうか。 実は私も、自分たちが応募する、となるまでは名前は知っていても詳細は知りませんでした。

www.g-mark.org

今年、ユニファは「ルクミー午睡チェック」で応募し、グッドデザイン賞を受賞することが出来ました。

【最新情報】家族・社会のメディアコミュニケーションサポート|ユニファ株式会社

これまであまり接することもなかったので、いい機会だと思い、受賞展を見に行ってきました。

受賞展の様子

受賞展は、その年のグッドデザイン賞を受賞した製品/サービスを展示するイベントです。 今年の受賞展は東京ミッドタウンで開催されました。 f:id:unifa_tech:20181106143942j:plain ミッドタウン内の各所で、受賞した作品を見られるようになっていました。 私が訪れたのは最終日、11/4の午後でした。日曜日ということもあり、会場は様々な客層の方々で大混雑! 特に大賞や金賞、特別賞を展示していたエリアは、展示を見るにも並ばなければいけないくらいの人の多さでした。 そんな中、広い会場の中を彷徨い、ようやく「ルクミー午睡チェック」を発見! f:id:unifa_tech:20181106165136j:plain f:id:unifa_tech:20181106165159j:plain

グッドデザイン賞は、目に見えるものだけの賞ではない

実は、グッドデザイン賞の審査対象になるのは、目に見えるデザインだけではありません。 かたちのありなしに関わらず、何かの目的のもとに築き上げた製品/サービス全体が審査対象になります。(私も初めて知りました。。。)

www.g-mark.org

例えば上記は、今回受賞した「ルクミー午睡チェック」の作品詳細ページですが、「審査委員の評価」をご覧いただくとわかるように、 プロダクト自体のデザインだけでなく、システムの力を使って保育現場の課題にアプローチしていることを評価頂き、働き方改革につながる可能性にまで言及して頂いています。 この評価コメントの内容は、私たちが開発にあたって焦点を当てた部分そのものであり、それが正しく伝わって評価を頂いたということは、とても嬉しく感じました。

世の中にないものを作ることの難しさと楽しさ

前述ページの「デザイナーの想い」の項目にも記載ありますが、「ルクミー午睡チェック」が一般にサービスとして提供されるまでの道のりは簡単ではありませんでした。 解決したい課題は明確でも、その解決方法が未だはっきりと分からないのが、保育の現場の現状です。 「午睡チェックを助けるプロダクトを」となっても、じゃあどんな風に作ったら助けになるのか?どんな風に作ったら使いやすいのか?誰も答えを知りません。 海外では家庭向けで類似のサービスは色々とありましたが、お昼寝しているたくさんの子どもたちを同時に見守るには独自のUX/UIを考える必要がありました。 当時はまだまだ会社も小さく、現場の声を集められる機会も限られていたので、営業さんに園の先生方の意見を聞いてきてもらったり、園のサポートをしているオペレーションチームに話を聞いたり。 そうやって集めた意見をもとに、デザイナーやエンジニア、QAで形にしたものを、さらに現場に持って行ってフィードバックをもらったり。 初めて作るものなので、色々と途中で手戻りが発生することもありましたし、決して効率の良い開発とは言えませんでした。 しかし、今では正式にサービスを利用してくださっている先生方から「とても助かっている」というお声を頂くこともあり、そのたびにやりがいを感じます。 一方で運用が始まったからこそ分かるプロダクトの課題に直面することもあり、初期開発時に抱いていた悩みより一層複雑で現実味のある課題と日々向き合っています。

まとめ

ものづくりは大変ですが、みんなで頑張って成果が出ると単純に楽しいし、嬉しい。 多分それは、保育園や幼稚園で砂のお城やトンネルをみんなで作るときの感覚と同じような感じなのだと思います。

グッドデザイン賞の応募に関して色々と動いてくださったみなさま、ありがとうございました。(ちなみに私は何もしてません。。。) ユニファでは、一緒にものづくりをしてくださるエンジニア、デザイナー、ディレクターなどを絶賛募集中です!

ユニファ 株式会社の採用/求人 | 転職サイトGreen(グリーン)

気になった方は、ぜひお声がけください!(直接社員のTwitterやらFacebookにメッセージ頂いても結構です!)

妄想をカタチにしたい

こんにちは。新規事業部開発の柿本です。

突然ですが、皆さんは妄想してますか?!

  • 今日の夕飯の妄想
  • 週末のデートの妄想
  • 口にするのもはばかられるような妄想

色々な妄想がありますが、私たちのように物作りに携わるエンジニアにとっても、妄想することはとても大事です。

このエントリーでは物作り、いわゆる“妄想をカタチにする”ことについて書きたいと思います。

子供の妄想力

私はかねてよりCoderDojo 横浜という小中学生向けのプログラミング道場でメンターをさせていただいています。

CoderDojoでは、メンターはニンジャ(=生徒)に何かを教えるのではなく、ニンジャが主体的に「◯◯を作りたい!」と言って、それをサポートするのが役割です。

CoderDojoに参加するたびに感じるのですが、子供たちの妄想力は絶大です。

ふつーのエンジニアでは思いつかないロジックでやりたいことを実現していたり、「これは3次元画像なのかな?」と錯覚するような迷路ゲームScratch(教育用のシンプルなプログラミング言語)で作ってみたり、逆にニンジャから教えられることもあるくらいです。

そんな中で子供たちをよく見ていて気づいたのは、作ってはみたものの最初にイメージしていたものとは違うものができて悩む子は意外と多いことでした。(まあそれはそれで満足している子も多いのですが 笑)

妄想のひとつ先

妄想を抱いて行動を起こしたまでは良いが途中で行き詰まる、ということは大人になってもよくあることだと思います。

私は小さいWEBサービスやアプリを作ることが好きなのですが、「これはいいアイデアだ!」と思って作り始めても、ほとんどの場合すぐに行き詰まります。ひどい時は1時間も経たずにサジを投げることもあります。

何がいけなかったのでしょうか?

答えは簡単です。「計画」がないからです。

「妄想」をカタチにするために次にしないといけないのは「行動」ではなくて「計画」です。

大人である私は理屈ではそのことを理解しているので、ニンジャ達にそのことを伝えるためにCoderDojoで会の最初にあるメンターによるLTで以下の物を発表しました。

scratch.mit.edu

制作物の稚拙さなどのツッコミは置いておくとして、この発表で最も重要な箇所は右下の【完成までの道のり】の記述です。

実はこのLTは全3回に渡って行われており、ここの記述は以下の通りに変遷しておりました。

1回目のLT2回目のLT3回目のLT

つまり、この程度の制作物でも最初に計画を立てて、その通りに実装を重ねていく必要があるんですよ、というメッセージを込めておりました。(ニンジャたちはキャットを飛ばすことに夢中でここの記述は一切読んでいないと思いますが 涙)

おわりに

大人としてすごく当たり前のことをそれっぽく書き綴りましたが、皆さんは計画を立てていますか?!

美味しい夕飯を作るには、献立と買い物の計画が必要です。

デートで成果を得るには、入念な下調べが必要です。

口にするのもはばかられるような妄想は、妄想にとどめておきましょう。計画も行動も不要です。

物作りに関わらず、日常生活で妄想を実現しないといけない状況はたくさんあると思います。

皆さんもしっかり計画を立てて、妄想ライフを楽しんでください!

isaax 勉強会でラズパイ監視カメラ作ってみました

 こんにちは、赤沼です。以前アスキーの展示会でサービスについてご紹介いただいたのをキッカケに、 isaax の勉強会に参加してきましたので、内容についてご紹介させていただこうと思います。

isaaxug.connpass.com

 会場はヒカリエ内の、KDDI株式会社 旧∞Labo(むげんラボ)でした。

f:id:akanuma-hiroaki:20181025092301j:plain:w300

isaax とは

 isaax とは、一言で言うと IoT デバイスの管理プラットフォームで、死活監視やファームウェアのアップデートに利用することができます。対象としているデバイスは Raspberry Pi などの Linux ベースのデバイスで、 GitHub リポジトリと連携させておくことで、 GitHub へのプッシュをトリガーにして登録されている全てのデバイスのファームウェアをアップデートすることができます。 IoT デバイスを用いたサービスでは通常の Web サービスと違い、ハードウェアを遠隔地に配置することになるので、その状態監視やファームウェアの管理については課題が多いところです。 isaax のようなサービスを使うことで運用を効率化できるのではないかと思います。

f:id:akanuma-hiroaki:20181025091340p:plain

ハンズオン内容

 isaax では isaax camp という情報共有サイトを公開されていて、今回のハンズオンの内容もそこで公開されているので、詳細な手順はそちらを参照いただくのが良いかと思います。

camp.isaax.io

 主なポイントは下記のようなものになります。

  • Raspberry Pi + Camera モジュールと OpenCV を用いた人数検出
  • isaax のプロジェクト作成、デバイス登録
  • GitHub と isaax を連携させたファームウェアアップデート

 それぞれ簡単にご紹介します。

Raspberry Pi + Camera モジュールと OpenCV を用いた人数検出

 使用機材については Raspberry Pi 3 Model B だけ持ち込みましたが、それ以外は貸し出していただき、下記の写真のように Raspberry Pi にカメラモジュールを接続したものを使用しました。

f:id:akanuma-hiroaki:20181025092348j:plain:w400

 コードについても Python でベースの部分は用意していただいていたので、リポジトリを fork して、ハンズオンのテキストに従って処理を追加します。カメラモジュールで撮影した画像を OpenCV で処理して人数を検出し、検出した人物に枠をつけるという内容です。また、画像内に一人以上の人物を検出した場合は、1分間隔で画像を Slack に Post します。最終的には下記のように Slack に画像が表示されるようになります。

f:id:akanuma-hiroaki:20181025092553j:plain:w400

isaax のプロジェクト作成、デバイス登録

 isaax を使い始めるには isaax にログインしてプロジェクトを作成します。作成時には連携する GitHub のリポジトリを指定する必要があるので、あらかじめ作成しておきます。今回はサンプルのリポジトリを fork したリポジトリを指定しました。

f:id:akanuma-hiroaki:20181026075342p:plain

 プロジェクトを作成するとプロジェクトトークンと、デバイスを登録するためのインストールスクリプトが表示されるので、それを Raspberry Pi で実行します。

$ curl -fsSL get.isaax.io | sh -s stable <プロジェクトトークン>
No previous isaaxd installation

### Download and unpack stable artifact version v0.5.0
================================================================================
--2018-10-25 23:01:16--  http://cdn.isaax.io/isaaxd/stable/linux_armv7/v0.5.0.gz
Resolving cdn.isaax.io (cdn.isaax.io)... 152.195.38.225
Connecting to cdn.isaax.io (cdn.isaax.io)|152.195.38.225|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3245446 (3.1M) [application/octet-stream]
Saving to: 'isaaxd.gz'

isaaxd.gz                                                   100%[=========================================================================================================================================>]   3.09M  1.09MB/s    in 2.8s    

2018-10-25 23:01:19 (1.09 MB/s) - 'isaaxd.gz' saved [3245446/3245446]

installed successfully

### isaaxd installation complete
================================================================================
        Version:         v0.5.0
        Built:           Mon Jul 2 05:21:50 2018
        Go version:      go1.10
        OS/Arch:         linux/arm
        RPC port:        1226
        Update URL:      https://isaaxartifacts.blob.core.windows.net/isaaxd/
        Working dir:     /var/isaax/
        Project dir:     /var/isaax/project
        Log dir:         /var/log

 これでデバイスがプロジェクトに登録されます。今回は用意していただいたリポジトリを使いましたが、ゼロから作る場合は isaax.json という設定ファイルを作成する必要があります。

GitHub と isaax を連携させたファームウェアアップデート

 デバイスの登録まで成功していれば、あとは isaax と連携させている GitHub リポジトリにコードをプッシュすればその内容がデバイスにデプロイされます。アップデートの受信やログの出力内容は isaax のコンソールから確認することができます。

f:id:akanuma-hiroaki:20181026081157p:plain

 また、コンソールからは環境変数も設定できますので、登録されているデバイス全てに一括で環境変数を設定することが可能です。

f:id:akanuma-hiroaki:20181026081321p:plain

まとめ

 最近ではデバイスを管理するプラットフォームも AWS IoT や Mbed Cloud、 Arduino Cloud など様々増えてきました。 isaax は Mbed や Arduino 等のマイコンには対応していませんが、 Raspberry Pi などの Linux デバイスのみが管理できれば良いのであれば、最初の設定も簡単なので、選択肢として検討してみても良さそうに思います。まずは無料枠内で色々と試してみようと思います。

VTuberっぽくLT発表してみた

こんにちは、rightgo09です。

開発部 Beer Bash

ユニファ開発部では、毎月末に「開発部 Beer Bash」という自由LT会を行っています。過去には他社と合同で開催したこともありました。

ここ半年ほどは私はエンタメ枠(自称)で参加しています。
このエントリーでは前回の発表を紹介します。

発表中の様子

f:id:rightgo09:20180930224957j:plain
f:id:rightgo09:20180930225019j:plain

続きを読む

練習問題

こんにちは、ヘルスケア事業部のちょうです。最近並列処理の勉強で「 The Art of Multiprocessor Programming」という本をひたすら読んでいます。どうやらこの本はコンピューターサイエンス修士の教科書として使われるらしく、宿題も付いています。第一章の練習問題の中で、一問を選び、みなさんと一緒に検討しようと思います。

第一章なので、何を前提に学ばないと解けない程度ではなく、かつ選んだ一問は並列処理に詳しくなくても問題ないのでご安心ください。

続きを読む

Railsでメール送信方法を自作してみる

Webエンジニアの本間です。 昨日、Rails 6で追加される予定の Action Text の概要をDHHが紹介している 動画 を見て、「おぉ、なんかすごい!」と思い紹介しようかと思ったのですが、いかんせん時間が少ないのであきらめます(^_^;)

今回は、少し前にRailsのメール送信を独自に実装したいケースがあり、その時に調査、実装した内容をサンプルコードを交えて紹介しようと思います。

続きを読む