# 自己紹介
初めまして、LINEの冬インターンシップに参加した宋海越（ソウ カイエツ）です。二月と三月のインターン期間にData LabsのMachine Learning チームに入って、主にDeep Learningの技術を使って業務を行いました。
# 背景
LINEのスタンプショップには、数百万点にも及ぶ、ユーザーが作った個性豊かなスタンプがあります。このたくさんのスタンプをユーザーが作って楽しむことを支えている、LINE Creators Studioというアプリがあります。LINE Creators Studioを使うと、スマホで撮った写真から簡単にスタンプを作ることができます。
現在LINE Creator Studioアプリで実装しているのはGrabCutという方法です。この機能を使うと、ユーザーがスタンプにしたい部分の少し外側を指でなぞって囲むだけで、自動的に切り抜くことができます。細かい部分は消しゴムで調整できます。
スマホなどの小さい画面でユーザーが消しゴムを使う場合、髪の毛などの微細な領域を切り抜くには多少不便があるだろうと考え、ユーザーにもっと便利にスタンプを作ってもらうために、自動切り抜き機能の実現に関する検証を行いました。
# 関連研究
最近のニューラルネットワークの技術は画像系のタスクに適しています。新しい手法が開発されており、精度が年々改善されています。
- Mask R-CNN
- 物体認識とセグメンテーションのタスクで使われています。
- 学習済みのモデルで試してみたら、精度が出ませんでした。
- ニューラルネットワークでフィーチャーを抽出して、色の類似度と組み合わせて処理します。
- 精度がMask R-CNNよりよくなったが、一つの画像は30秒ぐらいかかってちょっと遅い気がしています。
- セグメンテーションだけで前景のだいたいの形が認識できるが、前景と背景の境界のところが上手く認識できなさそう。境界を上手く処理するため、セグメンテーションのネットワークの後ろにマッティングネットワークが必要です。
- 精度がよくなって、スピードも速いです。
# モデル
前の部分はT-Netというネットワークで、画像をセグメンテーションする部分です。このネットワークによって元の画像から前景、背景と未分類の三つの部分が出力されます。この三つはtrimapと呼ばれます。
後ろの部分はM-Netというネットワークで、元の画像とtrimapをインプットして、抽出した未分類の部分（だいたいは輪郭）を中心に処理して、切り抜かれた画像を生成します。
スマホで動作させるために、T-netはMobileV2というサイズが小さくてスピードが早いネットワークに基づいて作って、M-Netのレイヤの数などの調整も行いました。
# データセット
検証実験用のデータセットはこちらの論文のデータセットを使いました。左側が元の画像、右側が正解データで、白い部分が前景で黒い部分が背景です。
背景のバリエーションを増やすために、複雑な背景の中でも上手く前景を抽出できるように、VOCという数万枚の画像が含まれているデータセットを背景として、一枚の前景と数枚の背景をランダムに組み合わせて以下のような新しいデータセットを用意しました。
# 学習
トレーニングは、一つのGPU(Tesla P100)を使って学習しました。
具体的には、
- まず物体を認識するT-Netを30エポックでプレトレーニングします。
- その後T-Netのパラメータを固定してM-Netを30エポックでプレトレーニングします。
- 最後にEnd-to-Endという手段でT-netとM-Netを一緒にトレーニングします。
テストデータのIoUは96.81%です。この論文によると、同じ前景のデータセットで、FCN(Person Class)のIoUが73.90%、PortraitFCNが94.20%, PortraitFCN+が95.91%です。テストデータの分割が異なるため単純には比較できませんが、十分匹敵する精度を出すことができました。
今の方法がAlpha(Float 0~1)を予測しているため、適当にIoUの計算法を直したもの：
# 結果
テストデータセットの結果が以下のようです、左側がテスト画像で、右側が予測の結果です。
テストデータセットはトレーニングデータセットに含まれていないデータで構成されており、未知のデータに対しても結果がいいと言えます。
StyleGANで生成した画像と処理した結果は以下のようになりました。
全身の画像や横向きの画像では使えるような精度が出ませんでした。これは、トレーニングデータセットが正面で上半身のデータばかりで構成されているためではないかと考えられます。
# 今後の課題
もっといろんな種類の画像にも上手く処理できるように、もっと質が高くてバリエーションが多いデータセットが必要だと考えられます。今は質が高くてバリエーションが少ないデータセットと、質が普通でバリエーションが多いデータセットを組み合わせてトレーニングデータセットとして使っています。今後は社内で保持しているデータを使って試していく必要があると思います。
スマートフォンに実装するためには、ニューラルネットワークのサイズとスピードも重要です。今後はネットワークの構造も実験していきたいと思います。
# まとめ
以上のようにインターンのタスクについて紹介させていただきました。研究室ではDeep Learningを使って自然言語処理に関する研究をしています。この二ヶ月間のインターンで今まで学んだDeep Learningの知識を生かしながら、画像系の知識が身につき、とても貴重な経験をしました。自分がまだまだ勉強すべきところがいっぱいあると感じながら、優秀なチームメンバーから学ぶことも多くありました。この経験を将来の研究と仕事に生かして精進していきたいと思います。
仕事以外にもMLチームの社員の人と一緒に近くのレストランに行くことも多くて、趣味と生活のことを話しあって、人生に役に立つこともいろいろ勉強しました。私以外には他の７名のインターン生がいて、チームが違うけど、懇親会とかで知り合って、そのうちの一人とご飯とかよく一緒に食べたり、昼の休憩時間に会社のフリースペースでダーツをやったりして、仲良くなりました。
最後にLINEで有意義で楽しい二ヶ月を過ごすことができて本当にありがたいと感じます。国際的で自由な雰囲気が好きな人はぜひ次のインターンを応募してみてください！