Lilliput Steps

小さな一歩から着実に. 数学やプログラミングのことを書きます.

株式会社 ABEJA のインターンに参加しました.

8 月 11 日 (月) から 8 月 29 日 (金) の間, 株式会社ABEJAインターンを行いました.
3 週間の間, インターン業務中のサポートにとどまらず, 宿泊先を提供していただいたり, 美味しいランチを一緒に食べに行けて本当に幸せでした. (でも何故かインターン期間中で痩せたみたいです).
本当に貴重な経験をすることが出来た 3 週間でした.

この記事では, インターンへ行くに至った経緯や, インターン中に何を行ったかをまとめたいと思います.
3 週目のことを書き始めようとした時点で 4000 字 を超える長編になってました; 間にある 2 つのスライドが本編をまとめている内容になっていると思うので, 忙しい方はスライドと最後のまとめを読んで貰えれば僕がインターンで何をしたかは完璧に分かるはずです(?)


インターンへ行くに至った経緯

僕が通っている沖縄高専では, 4 年生の必修科目の 1 つにインターンシップがあります.
基本的には学校が指定している企業を学生が選びインターンへ行くのですが, 自分で企業を探してインターンへ行くことも可能です.

ぼくの場合は, 知り合いの先輩方が過去に逆求人フェスティバルに参加したこともあり ABEJA を知っていて,

  • 機械学習や画像処理を取り入れた開発をしている
  • 実際に論文を読んで事例を取り入れている

などという点を聞いておすすめされました.

僕は高専プロコンや授業で画像処理をやっていたのと, 機械学習に興味を持っていた(2 年生のときに参加した情報オリンピックの春合宿時の講義ナドで)ということだったり, 論文をこのタイミングで読み始めるのは後々のアドバンテージに繋がりそうということもあり, 今やってみたいと思っていること が実際に経験できる良い機会だと思い ABEJA にインターン希望を出しました.

そこから, CEO の岡田社長との Skype 面談や, CTO の緒方さんとの Skype 面談を経て, ABEJA でのインターシップの参加が決定しました. この面談もとてもスムーズに進み, 周りが企業とのマッチングが終わる 1 ヶ月前の 6 月初旬には参加が決定していました.

参加前の取り組み

早くインターンへの参加が決まったこともあり, 前もってインターン期間中にやることと, やるにあたって必要な事前課題を教えていただきました.

インターン期間中は, 人物の表情認識 に挑戦することになりました. また, その課題に挑戦するにあたって, 理解の助けになる本を推薦していただきました.「はじめてのパターン認識」という本で, 筑波大学の先生が書かれた本だそうです.

はじめてのパターン認識

はじめてのパターン認識

パターン認識の諸分野のことや, SVM などの頻出手法についてわかり易く書かれていましたが, 確率統計と線形代数がゴリゴリ使われていて最初のうちは面食らっていました. カジュアルに固有値問題を解いているのが本当に面白かった.

実際にインターンに参加するまで, 教えていただいた本と表情認識がどのようにマッチしていくのか感覚が掴めていなくて結構不安でした(笑)

実際のインターン業務

1 週目

8 / 10 (日)

2 ヶ月近くあった準備期間は意外と早く過ぎてしまい, 夏休みが始まると同時にインターンの為に東京へ飛びました.
当日入りは怖かったのでインターンの前日から東京入りしたのですが, その日は会社の移転作業をしていた様なので僕もお手伝いさせてもらいました.
会社のメンバーの方とは移転作業中や作業後の打ち上げ会でちょっとずつ話し, 個人的には結構早く溶け込めたと思います. とは言え最初の方は高専プロコンなどで知り合った id:natrium11321 さんとばかり話していました.

8 / 11 (月) ~ 8 / 13 (水)

会社の移転作業が終わった翌日から出勤でした. インターン期間中は id:natrium11321 さんと緒方さんがメンターをしてくれていましたが, 他のメンバーの皆さんにも色々と教えて頂きました.
オリエンテーションを行った後は, 開発環境の準備... といったものの, これがうまく行かずに最初の 3 日間苦労しました.
結局自 PC で環境構築が出来なかったのは残念でしたが, 別の PC でうまく行ったので良かったです. でも 3 日かかるとは思わなかった.
ちなみに, 月曜の昼は立食パーティで火・水曜はおごってもらっていました. 美味しかったです.

8 / 14 (木), 8 / 15 (金)

ようやく環境が整ったので, 実際に表情認識を試すために色々試し始めました.
本を読んでいた時に全然意識してなかったこととして, 学習データを整備したり整形するのが大変だなあということを実感しました.
それらの過程で細かい unix テクも一緒に勉強できたので嬉しかったです. あとエディタへの思い入れが皆さん強くて面白い.
生データは実際に識別していく顔画像ですが, これを学習データにするまでのステップが結構多くて面食らいました.
頑張って学習データを作るところまでは機械化できたので, まずは k 近傍法を使って表情を識別しましたがあまり精度が出ず. 最初の週の進捗はこんな感じで終わりました.

また, 金曜日に「月曜日にインターンの中間発表をするように」と伝えられたので, 週末でプレゼン資料を作っていました.
用意されたテンプレートを見ると, インターンの中間発表の他に人生の目標発表という項目もあってびっくり.
結局翌週の月曜の朝くらいまで何を話そうか悩んでいました...

仕事の合間にはメンターさんやメンバーの皆さんと昼食や夕食に行きました.

2 週目

8 / 18 (月)

この日からは先輩である くま先輩インターンに合流しました.

上にもあるようにインターンの中間報告を行いました. 社長・CTO・COO に見守られながらのプレゼンは結構プレッシャーでした. その時の資料を載せます.

資料中のインターンの中間発表についてはあまり聞かれなかったものの, 人生の目標発表やインターンの志望動機については

  • ビジネスのことを知りたいって書いてるけど, 具体的に今行動を起こしてるか?
  • 本当に大学で教えることが人生の大きな目標なのか?
  • そもそも, 何かを教えることは大学でしかできないのか?

...等, 結構フィードバックを頂けました.
一緒に話を進めていってわかったのは, 僕自身の視野の狭さでした. 自分の思い込みや決め付けで進路まで狭めているのはもったいないと思い, ここにいる間に考えを整理しようと考えました.
また一番最初のフィードバックに関して, 社長に相談した所アポイントメントへの同行をすることが許可されました. 本当に良い機会を作ってもらえました.

インターン課題の方では, この日からは k - 近傍法 ではなく LBP(Local Binary Pattern) と SVR(Support Vector Regression) を使った表情認識の機構を実装していくことになりました. この日はそれらを使って実際に表情認識をしている論文を読んでいました.
これらについては後述の資料でちょこっと解説します.

8 / 19 (火), 8 / 20 (水)

この 2 日間はひたすら論文に書かれているアルゴリズムの実装や, 学習用データおよびテストデータの準備を行いました.
また, 木曜から 4 日間インターンが空くのでメンバーの方がぼくの手元のマシンでも作業できるよう VM を用意してくれたのですが, ぼくのマシンのスペックが足りずに満足に操作が出来ませんでした...
性能が良いマシンが欲しいなあと思いつつ, 休みの 4 日間は少しだけ作業を進めました.

3 週目

8 / 25 (月), 8 / 26 (火)

ここでもアルゴリズムの実装などを行っていました. ほとんど完成形にはなってきて, この頃は笑顔の検知精度がだいぶ高くなってきていました.
ただ, 表情によって精度が出ないものもあるようで, その原因を突き止めるところや, 定量的にどの程度精度が出ていないかをまとめるところまで時間を避けなかったのが残念です.
この段階での多クラス分類は精度的に厳しかったので, 今あるテストデータを使って「ある表情 X である」か「X でない」のどちらである確率が高いか?という 2 クラスの識別の精度を上げていこうと考えました.

8 / 27 (水)

この日の午前中は上述の 2 クラス識別の精度改善を行っていました.
笑顔の推定はうまく行っているようなので, 識別クラスに「ほほえみ」を入れて 3 段階の識別にすると更によい推定が出来るのではないかと思い「ほほえみ」のクラスを追加してみましたが, 逆に精度が落ちてしまいました.

午後は, 先週の月曜に決まったアポへの同行がありました. 社長が, 先方様に持っている技術を伝えるときの姿勢や熱意に圧感されました.
僕が同じエンジニアのメンバーと多く話していた分, 社長が相手の目線に合わせてプロダクトやソリューションの提供をしていて(当然なんだろうけど)凄いと思ったし, 作る側と提供する側の 2 面性を知っているのはとても強みになるというのを体感しました.

アポに同行した後は書いているプログラムのデバッグなどをしていました. ほとんどこの日までで完成しました.

8 / 28 (木)

この日は書いたコードの整備を行いました.
これまでオブジェクト指向らしいことは何一つやって来なかったので, モジュール化をするのにとても手間がかかりました.
あと初めて git に触れました. 中々操作に慣れなくて結構迷惑を掛けてしまいましたが, 使いこなせると便利なのかなあと思いました(正直まだわかっていない).

8 / 29 (金)

いよいよインターンの最終日. ということで, 最終発表を行いました. 中間発表にいた三人に加えて, natrium さんと id:m_kyoujyu がいたので服を反対に着てくるくらいには緊張していました...

最終発表時のスライドはこちらです.

成果発表時には技術面についても, 人生目標についても多くフィードバックを頂けました.
とくに, 「思想を持って, やりたいと思ったことで周りを引っ張っていく」というメッセージが心に残っています.
今やりたいことは色々あるものの, 強く「これがやりたい!」と言い切れるほどのものがないので, ちゃんと向かい合っていきたいと思います.
ここで得たフィードバック結果を活かして今後も活動していきたいです. 途中までやった表情認識の精度も上げていければと思っています :).

最終発表後にはメンバーの皆さんと一緒に昼食会をしました. 美味しいご飯を頂けました. 本当に舌が肥えちゃいました.
それだけでなく, メンバーの皆さんから色紙まで頂けました. 本当に嬉しかったです.

午後にはコードの整理を続けて, 僕の ABEJA でのインターンが終わりました.

まとめ

ここに書いたことはインターンで行ったことの氷山の一角ですが, それでも 4000 字近くになってしまいました.
書いたこと以外でも, 多くのメンバーさんにいろんな側面でお世話になりました. 短い間でしたが, 僕を受け入れていただき本当にありがとうございました!
この記事を見てくれている (?) 沖縄高専生の後輩も, もし興味があれば是非 ABEJA でのインターンにチャレンジしてみてください! 本当に多くのことが得られ, 視野が広がることを僕が保証します.

言える範囲であれば質問には答えたいと思うので何かあれば聞いて下さい :)

おまけ(書きたかったけど本文にどう盛り込めばいいか分からなかった事たち)

  • めっちゃ MacBook 欲しくなった. かっこいいだけじゃなくてマシンスペックも抜群そう. ぼくもスタバでコード書きたい.
  • どこでも宗教戦争(エディタ)はあるんだなあ... emacs こわい... GUI エディタ激推しこわい...