ユニファ開発者ブログ

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

物体間の関係性の認識

こんにちはR&Dチームの宮崎です。ユニファアドベントカレンダーの7日目となります。どうぞよろしくお願いします。

はじめに

DeepLearningの発展に伴い、画像分類や物体検出はかなりの精度で行えるようになってきました。 そこで、近年は画像からより高レベルな情報を抽出しようと、画像の要約を生成するImage Captioningや検出した物体間の関係性を認識するVisual Relationship Detectionなどの手法が提案されています。

今回は、このVisual Relationship Detectionの手法の一つであるBAR-CNN (Box Attention Relational CNN)[1]を試してみましたので、ご紹介したいと思います。

なお、Image Captioningについては下記にて紹介されておりますので、是非そちらも参照ください。

tech.unifa-e.com

Visual Relationship Detectionについて

Visual Relationship Detectionとは、検出した物体を<主語 - 述語 - 目的語>の3要素で表すことを目的としたタスクになります。ここで主語と目的語には検出した物体が入り、述語には2つの物体の関係性を表す言葉が入ります。 例えば下記の画像のように人物がバイクに乗った画像を入力としたとき、物体の座標とともに主語: person、述語: on、目的語: mortorcycleとしてラベルを出力することが目的となります。

f:id:unifa_tech:20191125135407p:plain
Visual Relationshipの例 (引用元: [2])

これによって、画像から物体の位置や種類だけでなく、物体間の関連性まで認識できるようになります。 ちなみに、このVisual Relationship DetectionのタスクはKaggleのコンペになったりもしています。

www.kaggle.com

続きを読む

Making a 3D Snowman with Zdog

By Robin Dickson, software engineer at UniFa.

Because it's almost Christmas I thought I'd try out something new and make it Christmassy.

Zdog is a round, flat, designer-friendly pseudo-3D engine for canvas & SVG and some of the work being made with it is really inspiring. I wanted to see what I could make quickly as a non-designer with no experience in 3D.

A snowman is built from various parts so I thought it seemed like a good fit. Also I may have heard a song about building a snowman somewhere...

f:id:unifa_tech:20191203153610p:plain

I used the Zdog documentation, tutorial and examples on the official Zdog website which is a fantastic source of information.

Setup

To use Zdog all you need is HTML, CSS and JavaScript. The HTML and CSS setup is very minimal.

<canvas class="zdog-canvas" width="400" height="400"></canvas>
.zdog-canvas {
  background: skyblue;
  cursor: move;
}

Making a Basic Snowman

The snowman is built using an Illustration object as the foundation for the illustration.

const illo = new Zdog.Illustration({
  element: '.zdog-canvas',
  zoom: 4,
  dragRotate: true
});

The first thing needed for a snowman is a body, which luckily is quicker in Zdog than real life. A sphere can be created using Shape and controlling the size with the stroke property.

let body = new Zdog.Shape({
  addTo: illo,
  stroke: 40,
  translate: { y: 5 },
  color: 'white'
});

The head shares properties with the body, and in Zdog items can be copied. So the body can be copied, and then certain properties overwritten.

let head = body.copy({
  stroke: 25, // make the head smaller than the body
  translate: { y: -25 }, // move it higher
})

Now we have the basic snowman!

f:id:unifa_tech:20191206145410p:plain

To make the face, the eyes and mouth are both made from coal so they can be copied.

Adding Details

let leftEye = new Zdog.Shape({
  addTo: head,
  stroke: 3,
  translate: { x: -4, y: -4, z: 10 },
  color: 'black',
  backface: false,
});
let rightEye = leftEye.copy({
  translate: { x: 4, y: -4, z: 10 }
})

Loops like forEach can be used to make the code more concise.

let mouth = new Zdog.Shape({
  addTo: head,
  stroke: 2,
  translate: { x: 0, y: 6, z: 10 },
  color: 'black',
  backface: false,
});

[[-6, 3, 9], [-4, 5, 10], [4, 5, 10], [6, 3, 9]].forEach(coal => mouth.copy(
  { translate: { x: coal[0], y: coal[1], z: coal[2] } }
))

Next a carrot for the nose which can be a cone shape.

let nose = new Zdog.Cone({
  addTo: head,
  diameter: 5,
  length: 9,
  translate: { x: 0, y: 0, z: 10 },
  stroke: false,
  color: 'orange'
});

Coal buttons were added in the same way as the eyes and mouth.

f:id:unifa_tech:20191206145415p:plain

The arms were the most difficult part so far. The base branch was created using a Shape item. Then copied for the smaller branches.

let arm = new Zdog.Shape({
  addTo: body,
  color: 'brown',
  stroke: 2,
  path: [ { x: 0, y: 0 }, { x: 12, y: -10 } ],
  translate: { x: 18, y: -8 },
});
let finger = arm.copy({
  addTo: arm,
  path: [ { x: 0, y: 0 }, { x: 3, y: -7 } ],
  translate: { x: 5, y: -5 },
  stroke: 1.5
});
finger.copy({
  path: [ { x: 0, y: 0 }, { x: 7, y: 0 } ],
  translate: { x: 3, y: -2 } 
})

For the other arm the copyGraph function can be used to copy the arm item and the attached items. So all that is needed is to move it into place an rotate it.

arm.copyGraph({
  translate: { x: -18, y: -8 },
  rotate: { y: Zdog.TAU/2 }
})

A scarf was added and the snowman is complete!

Animation

It's also possible to add animations to Zdog creations so I added a little inspired by the many demos on the official website.

let isSpinning = true;
let direction = 'right'
function animate() {
  if (illo.rotate.y < -1) { direction = 'left' }
  if (illo.rotate.y > 1) { direction = 'right' }
  if (isSpinning && direction === 'right') {
    illo.rotate.y += -0.005;
  } else if (isSpinning && direction === 'left') {
    illo.rotate.y -= -0.005;
  }
  illo.updateRenderGraph();
  requestAnimationFrame( animate );
}

animate();

f:id:unifa_tech:20191206151752g:plain

(This is a gif, and the created SVG looks much better!)

Overall it was easy to get started due to the great documentation and examples and I am looking forward to trying to make more complex designs.

初めてのre:Invent3日目 (Hands-OnとJam)

ラスベガスからこんにちは。 異国の地で眠気と戦ってるユニファのインフラ見ているすずきです。 書くのが遅れに遅れて周回遅れ中ですが頑張ってブログ書きます。

3日目ともなるとホテルの中も覚えてきて迷わなくなりますね。
もう怖いものはない(嘘です英語怖い

さて3日目もイベントとしてはKeynoteからスタートですが、 内容がパートナー向けのイベントのため私は見ないで別のことしていました。

Hands-on Labs

AWS re:InventはAWSのサービスの説明、企業の事例の話などいろんなセッションはありますが、
それ以外にもAWSの資格試験を受けれる会場や、DeepRacerという機械学習で走らせる車の大会(日本からはDNPさんなどが参加されてます)が開かれているなど様々なイベントがあります。

そんな中で3日目最初はHands-On Labs会場に行って来ました。
その会場では、AWSのオンライン学習を体験できるようになっています。(AWSだけではなく他のクラウドサービスなどの学習もありました。

※ 学習に利用するサービス Qwiklabs - Hands-On Cloud Training

会場入場の際に学習チケットをもらい、有料の学習サービスはそのチケットを使うことで受けられるようになっています。

以下のような感じで学習していきます。 f:id:mominosin:20191204081455j:plain

学習開始すると、専用のAWS環境がデプロイされ接続できるようになります。
試しに無料の1つと有料の1つを体験しました。 追加でに有料の学習をもう1つやろうとするとチケットが使えませんでした、引き続きやりたい場合は再入場になるのだと思います。

Hands-Onをやってみて、できることはしってるけどやったことないことなどを、一通り学べてよかったです。
調べながらやるほうが身につきやすいかとは思うのですが、決まった手順にそって学ぶとさくっと頭に情報がいれられて楽ですね(不要な学習が減る 暇なときはHands-On受けに来くると良さそうです。

Jam Lounge

AWS re:Inventのイベントの中で、先程挙げなかったものにハッカソンと、なにか問題が起きている又は起こる環境を直していくものがあります(Game Day、Security Jam) とても面白そうですが、英語でチーム戦ということでとてもハードルが高いので遠慮していました。

しかし Jam Loungeという場所がEXPO会場(いろんな企業が出店してるところ)にあり、Security Jamの内容とは異なるそうですが同じようなことが1人でも体験できるようなのでやってきました。

ちなみにこれは、AWSが用意した環境にセキュリティ的に問題があるので、シナリオに沿って直していきましょうというものです。

難易度もいろいろ用意してあるし、ヒントもあるので初心者の方でも問題なく体験できるのではないかなと思います。

私は時間の都合上2問くらいしかできませんでした(全部で15問前後

セッション

セッションはSageMakerの新しいサービスのWorkshopを受けてきました。

GitHub - aws-samples/reinvent2019-aim362-sagemaker-debugger-model-monitor

これは実際の問題なので興味がある方はLab1,Lab2と進めていただけたらと思います。 私が受けたのは昨日アップデートのあった、SageMaker Debuggerとmonitorでした。

とりあえず受けて、手順通り動作は確認できましたが、今回のアプデ前の状況を理解してないので、 嬉しいものなのかどうなのかがよくわかっていません…

予めSageMakerの入門的なWorkshopを受けておいたほうが良かったなと今になって思います。

AWS資格認定者イベント

AWSの資格を持っていれば参加できるイベントがあったので参加してみました。

会場は洒落たボウリング場です。 f:id:mominosin:20191204192346j:plainf:id:mominosin:20191204192443j:plainf:id:mominosin:20191204192249j:plain

ビュッフェスタイルで飲み食べ放題で、後で知ったのでですが神戸牛のハンバーガーとかもあったらしい…!!

終始日本の方と固まって喋ってましたが、今までの期間で一度もあったことなかった人ばかりで、過去に仕事でお世話になっていた会社さんもいたのでその件で盛り上がることができました。

3日目も最後は盛り上がって終わりました。
残すところ後1日ですが、もうゆっくりしましょう体力が…

すずき

初めてのre:Invent2日目 (DeepComposerとったどー)

ラスベガスからこんにちは。 異国の地でなんとか生き残りながらユニファのインフラ見ているすずきです。

毎夜毎夜交流会で睡眠時間が足りてませんが、今日も頑張ってブログです。
去年のre:Inventの報告会イベントでどなたかがre:Inventに一番必要なものは体力と言っていたのが身にしみています…

2日目はみんなお待ちかねAndy JassyのKeynoteからのスタートですね。

続きを読む

業務効率化の進め方失敗談

気がつけばいつの間にか12月に入っており、見渡せばどこもかしこもクリスマスモードですね。

初めまして。ディレクターの木曽です。 今回は、過去(ユニファ入社以前の会社)に自分が行った社内の業務効率化について失敗したなと思うことがあったので、振り返ってみたいと思います。

何をやったか

これまで手作業&目視確認というワークフローで行なっていた業務を、GoogleAppsScriptと元々社内で用意されていたAPIを使用した自動化ツールを作成することで、作業の大部分を自動化しました。 それにより、オペレーションミスのリスクを下げ、作業工数を減らすことができました。

何を失敗したか

オペレーションミスのリスクを下げ、作業工数を減らすことができたため、「業務効率化」については成功したと思っています。

明らかに作業も楽になるし、ミスも減らせるツールを作った!と自負していたため、他のメンバーにも歓迎されるものとばかり思っていたのですが、いざ自動化ツールを展開した際、自分が予想していた以上にやり方を変えることへの反発があることが判り、進め方をもう少し工夫すればよかったと反省しました。

なぜ進め方を失敗してしまったか

チーム内の反応は2つに分かれており、その手があったか!と歓迎してくれる人と、そうではない人がいました。 業務効率化ツールに抵抗を持った人たちに話を聞くと下記のような意見が出てきました。

  • これまでのやり方の方が慣れ親しんでいるので安心
  • 技術的なことはよくわからないからプロダクト自体に不安
  • 仕組みが理解できないから知らないワードが出てきた時点で拒絶
  • やり方が変わることで、一時的に作業工数が増えることが不満
  • そもそもそのツールで課題が解決できるのかわからない
  • これまでのやり方のどこに課題があるかわからない

歓迎してくれた人と、そうではなかった人との大きな違いは、やり方を変えることへの抵抗もありますが、一番は「課題を課題として認識しているか」というところだったように思います。

どう進めればよかったと思うか

いくらメリットを伝えても、そもそもそこに課題を感じていない人にはそのツールで課題が解決できるのか?という疑問が残ったことから、課題に対しての共通認識を持つということが最も重要だったのではないかと思いました。

課題を共通認識するためには、作業工程ごとに「何をやるのか」それは「何のためにやるのか」「どの状態になっていればOKとみなすか」を一つずつ洗い出し、そのあとに「どこにどれくらい時間がかかるのか」「どこでミスをするリスクがあるのか」を整理することで、課題を課題として共通認識できたのではないかと思います。

さらに、その作業工程ごとにツールの機能を照らし合わせ、最終的なメリットを提示できれば、もう少し心理的ハードルを下げることができたのではないかと思っています。

まとめ

自分の感覚と、すぐに理解してくれる人たちだけを巻き込んで進めるのではなく、実際にツールを使う現場の人たちに寄り添った進め方をすることが大事だと思いました。 この経験は、ユニファのサービスを保育の現場に取り入れてもらう際にも役立つのではないかと思っています。

初めてのre:Invent1日目

おはようございます、こんにちは、こんばんわ。 ユニファのインフラ見てるすずきです。

最初に宣伝、弊社もアドベントカレンダーをやっているのでぜひ見ていってください。(このブログはアドベントカレンダーとは関係ない) adventar.org

海外も2度目で英語もとても微妙な私ですが、 AWS最大のイベント re:Invent に初めて参加しています。

0日目ラスベガスと新デバイス

日本時間で12月1日の17時頃に成田を発って、ラスベガスの現地時間で12月1日の15時頃に到着しました。

ラスベガスって空港にもスロットとかあるんですね! f:id:mominosin:20191204192014j:plain

見慣れない光景にドキドキしつつ、その後翌日のイベントに向けて準備しました。 したのは下の2つ(準備じゃないのもある)

  • re:InventのRegistration
    • このイベントではセッションを受けたり、お土産もらう際にもユーザチェックが必要で、その際に首からかけたカードで行います。そのカードを受け取っていました。
  • Midnight Madnessという前夜祭みたいなもの

以下の写真は会場の様子です。お祭りみたいですよね。 f:id:mominosin:20191204015623j:plainf:id:mominosin:20191201223224j:plain

その会場で発表された新サービスがありました DeepComposer です. 機械学習できるキーボードというのでしょうか…? f:id:mominosin:20191202000459j:plain

さて本題のre:Invent初日体験した話をしようと思います。

続きを読む

ヒューマンエラーとは?

みなさんこんにちは。午睡チェックのディレクターをしている保坂です。

LINEの返信をしようとしたら、スマホをどこかに置き忘れた。 電車に乗ろうとしたら定期券が無いといった、困った経験はないでしょうか? さらにそういった失敗から、大事な商談ができず、大きな損害に繋がる、時すでに遅しになってしまうこともあります。 今回はそういった「ヒューマンエラー」とはなんなのか調べてみました。

ヒューマンエラーとは次の意味があります。

「ヒューマンエラー(英: human error)とは、人為的過誤や失敗(ミス)のこと。 JIS Z8115:2000[1]では、「意図しない結果を生じる人間の行為」と規定する。」

出典:ウィキペディア

期待していた結果と異なる結果になってしまった、ということがヒューマンエラーと言えそうです。言葉の定義がわかったところで、次に、ヒューマンエラーの種類と原因を見ていきたいと思います。


続きを読む