ユニファ開発者ブログ

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

FaceNet の学習済みモデルを使って顔画像のクラスタリングを行う

お久しぶりになります、iOSエンジニアのしだです。
開発部ブログも更新する人が多くなって、前回からだいぶ日が空いたように感じます。

今回は、あるまとまった写真から顔を切り出して、FaceNetから特徴量を抽出しクラスタリングを試しました。
以下の FaceNet のトレーニング済みのモデルがあるので使用しています。 FaceNet は、Triplet Loss と呼ばれる基準となる Anchor と Positive の距離を近くに、Negative との距離を遠くにマッピングされるように学習されます。 顔画像から特徴ベクトルとして利用可能なのでクラスタリングなどのタスクに利用できます。

github.com

続きを読む

R&D エンジニアが考えていること

こんにちは。今年からユニファに新設されたR&Dチームで画像やバイタルデータの分析を行っている浅野です。今日は現在携わっている仕事の内容やその背後にある想いをご紹介したいと思います。

弊社で提供しているサービスのひとつに「ルクミー午睡チェック」があります。加速度センサーを使って園児が午睡(=お昼寝)中の身体の向きをチェックして自動で記録するものです。うつぶせ寝や動きの停止を検知してアラートを出す機能もあります。

f:id:unifa_tech:20180911123251p:plain 「ルクミー午睡チェック」公式サイト

このサービスは、5分おきに手書きで園児の様子を記録していた保育士さんの手間と、命を預かることの心理的負担を軽減することに役立っていますが、実はセンサーから得られる波形データ(例:下図)には身体の向きや動きの他にもたくさんの情報が含まれていると考えています。睡眠中にどれだけ寝返りや体動があったか、呼吸の深さや速さはどのように変化したか、いつもと傾向は同じかどうか。「息が荒くなる」という表現があるように、体調の変化が呼吸に表れることもあり、園児がどのような状態で午睡をしていたかをより深く理解することで大きな価値につながる可能性があります。どんな情報を誰にどのように提供するとサービス向上に役立つのか、日々考えながら分析を行っています。

f:id:unifa_tech:20180911111423j:plainf:id:unifa_tech:20180911111430j:plain
私が実際にセンサーを身につけて得られた波形。左: 1分間に15回のペースで呼吸した場合。右: 1分間に30回のペースの場合。右の方が波の山と谷の間隔が短くなっています。乳幼児は大人と比べてかなり呼吸が速いのが特徴です。

人生に寄り添うデータ分析

ところで、私はたくさんの午睡データを眺めてきたおかげで、 最近では加速度センサーの値の推移をみただけで園児の状況がリアルに想像できるようになってきました。例えば、下図のような波形(実例をもとにして作成した仮想データ)をみると、この子は最初なかなか寝付けなかったけど、保育士さんに抱っこしてもらったことで安心してすやすやと眠れたんだな、よかったなぁ、と少しほっこりした気持ちになります。

f:id:unifa_tech:20180911111437j:plain
とある園児の午睡ものがたり。データからここまで想像(妄想)できれば一人前(笑)

データ分析で大事なのは技術的なことだけでありません。ドメインの知識も総動員してデータの背後にある人生に寄り添う。そこから見えてくる仮説をまたデータや理論に戻って検証する。想定と異なる結果が出たら、それが実世界で何を意味するのかをまた考える。常に複眼で物事を捉えることでまだ誰も手にしていないインサイトを引き出すことが可能になります。

また、ユニファでは午睡データ分析だけでなく、保育園内の日常を撮影したたくさんの画像データから様々な技術をつかって有用な情報を引き出すことにも挑戦しています。園児の安心安全と豊かな学びの場をつくりたい。園での様子を保護者にフィードバックすることで家族コミュニケーションを豊かにしたい。そんな想いでデータと向き合っています。

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

弊社では一緒に働く仲間を大募集中です。少しでも興味を持たれた方はぜひ声をかけてください!

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

ユニファ株式会社の採用/求人一覧 - Wantedly

経験者採用の裏側。

こんにちは。エンジニアの田渕です。

暑くなったり寒くなったりやけに台風が多かったり……。。。今年の夏は体調管理が難しいですね。 しかしながら、延々と続くかに思われた猛暑も最近は少しマシになり、夜には秋の虫が鳴くようになりました。 このまま涼しくなってくれるといいなあ。

最近、各種求人サイト等でユニファのエンジニアの採用情報を色々と掲載しております。 ご応募頂く前にこちらを見て頂いている方もいらっしゃるようですので、 今日は募集している私たちがどんなことを考えているか、その裏側を書いてみたいと思います。

※募集状況等は刻々と変化していきますので、ご興味をお持ち頂いた方は各種求人情報等で最新の情報をご確認ください。

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

募集要項の裏側

私は、ユニファに来るまでは比較的大きな会社のエンジニアでした。 稀に採用に携わることもあったのですが、私に決定権はなく、人事の方が中心で進められている採用活動でした。 その後、初めての転職活動を行いユニファに入社した訳ですが、転職活動自体が初めて、右も左も分からず。。。 応募用書類を用意するにもどんな情報が欲しいのか今ひとつ分からずあたふた……な感じでした。 そこからユニファに来て、エンジニア自身で採用活動を行う形になりました。 「採用される側」から「採用する側」になって、かなり転職活動や採用というものに対しての見方が変わったのを感じています。

新卒採用と違い、経験者採用では「これまでにやってきた仕事の実績、持っているスキル」をお伺いして検討していく形になります。 そのため、応募をして不採用になった場合は、あたかもこれまでのキャリアを否定されたかのように捉えがちですが、実は違います。 例えば、私はWebエンジニアですが、一口にWebエンジニアと言ってもその働き方は業界や会社の規模などによってまちまち。 きっちり設計が完了したものを形にするエンジニアもいれば、思い描く絵すら無いところから作り始めるエンジニアも居ます。 10の会社があれば、10通りのエンジニアの働き方があると考えて良いと思います。 それに加え、ベンチャーのような状況変化の早い会社では(まさに現在のユニファの様な感じですが)「今のタイミングではこういう人が欲しい」という求人が殆どです。

ここでポイントなのは、「今のタイミングでは」というところ。 もともと働き方に幅のあるエンジニアという仕事に対し、更に時限制の条件がついているのです。 ここまで来ればなんとなくお分りかと思いますが、つまり「来て欲しい」と思っている人物像が、結構ピンポイントだということになります。

そんなに条件がはっきりしてるなら応募条件とかに書けばいいじゃないか?とお思いかもしれません。 が、あまりに細かすぎる応募条件は、そもそも読んで貰えなかったり(苦笑)応募の意欲を削いでしまうことにも繋がります。 書いたことによって誤解を与え、応募の機会さえ奪ってしまうこともあるでしょう。 また、文字で表現することが難しい部分(例えば現在のメンバーとの相性や、人柄の部分だったり)もあるため、どうしても募集要項等に完璧に反映することが出来ません。

これは恐らく弊社に限ったことではなく、「募集要項の内容満たしてると思って応募したのに断られたよ!」ということが起こるのはそういうことです。

ご縁がなかった!?事情は色々。

せっかくご応募頂いたのにお見送りにさせて頂く、あるいは逆にお断り頂くこともありますが、その理由をいくつか書いてみたいと思います。

今のユニファにはマッチしない

私もこれまでにお会いした方の中で「ああ、来年だったら一緒に働きたかった。」とか「三年後だったら……」などと感じたことは多々ありました。 現時点では必要とされているスキルや経験が不足していても、「あと一年後だったらきっと条件を満たしていただろうな」と言ったパターンです。 弊社にそういった経験をゆっくりと積ませてあげられる土壌があれば良いのですが、残念ながらまだまだ発展途上の弊社では、ゆっくりとは時間が作れないのが現実です。 ご入社頂いて、弊社の事業スピードの中で無理なくその方の良い部分を伸ばしていけるかどうかを確認させて頂いております。

その方の描いているキャリアプランがユニファの今後とマッチしない

面接においては、応募頂いた方のこれからのキャリアプランや、実現したいこともお伺いしています。 仮に現時点のその方が現在のユニファで求めているスキルをお持ちだったとしても、お話を伺った結果、今後のユニファでそのキャリアを実現することが難しいと判断した場合には、面接の結果としてご本人にその旨をお伝えした上で次に進むかどうかを検討頂いています。 その結果、「それも込みでぜひユニファに」、と言ってくださる方もいらっしゃいますし、残念ながら応募者の方からのお断りとなることもあります。

「採用されなかった=
これまでのキャリアの否定/今後の可能性の否定」ではない。

ユニファにおけるエンジニアの経験者採用は、ご応募頂いた方が現在の弊社の「今のタイミングではこういう人が欲しい」という人物像にマッチしているか、ということを見ているものです。 したがって、お見送りは「これまでのキャリアの否定」でも、「今後の可能性の否定」でもありません。 単に「現在のユニファの状況と応募者の方の状況がマッチしていなかった」それだけのことです。

ですから仮にご縁がなかった場合でも、必要以上に落胆して頂く必要はありません。 単にちょっとタイミングが合わなかった、ただそれだけのことです。

さいごに

転職というのは応募頂く方の人生の中でそれなりに大きな決断だと思っているので、妥協や迷いのある中で採用の通知をお出しすることはお互いにとって良くないことだと考えています。 採用活動を通し、自分自身が転職活動をしていた頃に不採用の通知を頂いた会社さんに対しても、ちゃんと向き不向きを見てくれたんだなという感謝の気持ちが強くなりました。

面接では弊社のことも色々とお話させて頂いております。 また、これだけ色々堅苦しく書いておりますが、おそらく面接自体はかなり緩い雰囲気で実施しています。

もしも今、応募しようかどうしようか迷っている方がいらっしゃったら、「ちょっとユニファのエンジニアの顔見に行ってやる!」くらいの気持ちでお話だけでも聞きに来て頂けると嬉しいです。

ではでは!

テクトモ #5 で私と Python について話してきました

 先日 8/23(木)に、テクトモという勉強会シリーズの第5回に登壇させていただきました。

techtomo.connpass.com

 このシリーズではエンジニアやデザイナー向けに、未来×希望×キャリアをテーマに情報発信を中心としたイベントを開催されていて、以前 R&D チームの志田がこのシリーズの第3回に登壇しました。

techtomo.connpass.com

 この時私は一参加者として参加していたのですが、懇親会で主催者の方とお話しさせていただく中で、登壇させていただくこととなりました。

プレゼン資料

 第5回のテーマは「Pythonエンジニアが描く未来と希望〜キャリアを中心に考えるLT大会〜」ということで、私はこれまで業務のメイン言語としては Python を使っていたことはなかったのですが、必要に応じてツールとして Python を使っていたことはそれなりにあったので、これまでのキャリアを踏まえてどんなシーンで Python を使っていたかということを、多少の Ruby との比較を交えてお話しさせていただきました。

 当日使用した資料はこちらです。今回は Prezi で資料を作成しました。

わたしとPythonの出会い、別れ、再会、そしてこれから

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

まとめ

 当日は私を含む4名のLTがあり、その後その4名でパネルディスカッション形式で会場の参加者からの質問に答えるという形で進みました。アットホームな雰囲気で、参加者の方にも楽しんでいただけたようです。

 Python については AI系技術や IoT などの領域で中心的に使われている言語であり、今後さらに利用範囲が拡大していくと思っています。現状のユニファでのメインの言語は Ruby ですが、 R&D チームでは Python をメインとして使用し始めていますし、ユニファの業務でもさらに活用されていくものと思われます。

 ユニファでは Python を活用してAI系技術領域で活躍したいエンジニアを募集しておりますので、興味のある方はぜひご連絡ください。

【サーバサイドエンジニア】家族×ITで家族コミュニケーションを変革する自社サービスのAI系技術サーバサイドエンジニアを募集!

PlantUMLで状態遷移図を書いてみた🌱

こんにちは、ビールが大好きなQA/ディレクターの鶴岡です。

先日WACATE2018 夏 ~もちもちモ・デ・リングで、もぐもぐテスティング~ 開催概要 - WACATE (ソフトウェアテストワークショップ)に参加して、モデリングについて勉強してきました。

そこで、テキストベースで簡単にUMLを書けるツール、PlantUML(http://plantuml.com/)を教えてもらったので使ってみたお話です。

セットアップはこちらのブログを参考にしました。 (とてもわかりやすかったです^^)

qiita.com

なんならこのブログを見てもらえば十分なような

やってみた!🌱

ということでPlantUMLで状態遷移図を書いてみました!

こんな感じでテキストで書いていくとプレビューにごりごり反映されます。 f:id:unifa_tech:20180815120547g:plain

画像ファイルとして出力もできます!

出力形式はpng, svg, eps, pdf, vdx, xmi, scxml, htmlから選べます。

pngで出力してみたものがこちら f:id:unifa_tech:20180815114043p:plain

Confluence上でも書けます!

インフラエンジニアにお願いしてConfluenceにPlantUMLのプラグイン(無料版)をいれてもらったら

  1. PlantUMLを選択してf:id:unifa_tech:20180815131257p:plain
  2. テキストベースで書いていくf:id:unifa_tech:20180815131720p:plain
  3. 「⇒」を押すとプレビューが見れますf:id:unifa_tech:20180815131242p:plain
  4. 完成!🎉f:id:unifa_tech:20180815131306p:plain

あとがき

  • この状態遷移図はブログ用に書きましたが、もちろん仕事用のまじめな状態遷移図もちゃんと書いてます(`・ω・´)

  • 状態遷移図を書くのは楽しい!PlantUMLを使うともっと楽しい!(WACATEに感謝)

  • このブログ用の状態遷移図はエンジニア勢みんなでレビューしてくれました。

f:id:unifa_tech:20180815134328p:plain

そんな弊社ではQAマネージャ候補やRubyエンジニアやデザイナー等々を募集しております!!!

www.wantedly.com

最後まで読んでいただきありがとうございました!

ママエンジニア1年目

こんにちは、Androidエンジニアのあいばです。 昨年7月に第一子を出産し、今年4月から職場へ復帰しました。今回は子育てと仕事の両立をするために、私がユニファで選択したワーク&ライフスタイルをご紹介したいと思います。

ワークスタイル

業務内容

産休育休前はAndroidエンジニアとして働いていましたが、復帰後はiOSアプリの開発を多く担当しています。

時短勤務

復帰時は8:30-17:30のフルタイムを選択しましたが、現在は9:00-16:00の時短勤務にしています。
勤務時間が以前の3/4になったため集中力を高める工夫は必要になります。毎日定時直前はシンデレラ気分です。
また、作業時間が減った上に子供の体調不良も割り込んできます。そのため、思うように仕事が進まずに周囲に迷惑をかけて口惜しく感じることもあります。

最近はタスクを15分か30分区切りで管理するようにしていますが、どちらかというと自分の作業スピードを把握するのに役立っています。(育休明けは色々な負い目から適切な工数を出せない病を患っていたためこれから役に立つかもしれません)
そのためこの点に関してはまだまだ課題を感じています。

リモートワーク

ユニファ ではエンジニアの自宅勤務が可能です。主に以下のツールを利用してコミュニケーションを取っています。

  • Slack
  • zoom

私も通勤に1.5hかかるため主にリモートワークをさせてもらっています。夫の勤務先も週1回はリモートワークができるため、週1回は夫に子供を託して出社しています。
保育園からの呼び出しがあった場合も自宅からならすぐに駆けつけられ安心ですし、帰りに小児科、買い物に行く時間もあります。

ライフスタイル

0歳児を保育園に預ける

子供を保育園に預け始める時期についても悩みましたが、1歳児の保活はかなりハードとのことでやむなく0歳児で入園しました。
しかし、保育園に預けてみるとメリットも大きいように感じています。それまでは親子の閉じた空間で悶々と育児の悩みに向き合っていましたが、一緒に子供を見守ってくれるプロフェッショナルの存在に助けられました。
また、子供と離れ社会との関わりを持つ時間が生まれたことでストレスの発散にもなりました。

1日のスケジュール

だいたいこのようなスケジュールで生活しています。

6:00-8:00 起床、朝食、準備
8:00-9:00 登園
9:00-16:00 業務時間
16:00-17:00 お迎え
17:00−18:00 必要なら買い物、遊ぶ
18:00-20:00 お風呂、夕食、遊ぶ
20:00-21:00 寝かしつけ
21:00- 残った家事、自由な時間

リモートワーク&時短勤務のおかげで時間にも気持ちにも余裕が生まれました。
今のスタイルになるまでは子供と遊ぶ時間が確保できなかったり、離乳食を用意できなかったり、毎日タスクをこなすのに精一杯で保育園の連絡帳に書くネタが無かったり、このままでは子供の成長を見逃すことになるのではとかなり焦っていました。

フルタイムも不可能ではありませんが0歳児は初めての保育園にとても体力を使っていることを認識し、一緒に過ごす時間を充実させるために余裕を持つのは大事なことだと思います。

最後に

周囲の理解、サポートがあって現在の状況にあった働き方を見つけることができました。
とはいえ毎日バタバタ過ごし、自身のキャリアプランにも頭を悩ませています。
ただ、子供はいつまでも0歳児でいるわけではないので、子供の成長と共にこれからも柔軟に働き方を選択していけたらいいなと思います。

なぜ違う値を見たのかーーMemory Barrier

こんにちは、ヘルスケア事業本部のちょうです。前回

tech.unifa-e.com

CPUレベルでなぜ並列プログラムはなぜ思った通りに動いてないのを分析しました。要するに、CPUのキャッシュ間でMESIなどのCache Coherenceプロトコルがあるものの、Store BufferとInvalidate Queueなど最適化するための仕組みによって、命令がreorderされたように見えます。

違う値を見ただけでまだいいですが、reorderにより並列プログラムの動作は予測できなくなり、つまりundefined behaviorは一番の問題です。reorderを制御するには、memory barrierという仕組みがあります。CPUアーキテクチャによって命令が変わるのですが、目的は一緒です:前後命令の実行に制限をかけます。

https://en.wikipedia.org/wiki/Memory_barrier

前回のプログラムで、 a = 1f = true の間に smp_mb() (symmetric multiprocessing memory barrier)を入れてみます。結果はどうなるでしょう。

CPU 0にfのキャッシュがあり、CPU 1にaのキャッシュがあるとする

int a = 0;
bool f = false;

void cpu0 {
  a = 1;
  smp_mb();
  f = true;
}

void cpu1 {
  while(!f);
  printf("%d\n", a);
}
続きを読む