May the Neural Networks be with you

ニューラルネットワークと共にあらんことを

ChainerCVを用いた皮膚障害検出システムの構築

こんにちは。shunk031です。NIPS改めNeurIPSが開催されてるということは12月ですね。この記事は Chainer/CuPy Advent Calendar 2018 12日目の記事です。

f:id:shunk031:20181210095921p:plain

昨今はGoogleの本格的な医療分野への進出*1もあってか、医療xAIの分野に盛り上がりを感じます。 医療の現場では医師が目視で大量の診断画像を確認することが非常に多いです。 そこで今回は大量の診断画像から簡易的に病変部位を検出すべく、ChainerCVを用いた皮膚障害検出システムを構築していきたいと思います。

以降に皮膚障害画像等が含まれますので、苦手な方は 閲覧に注意して いただければ幸いです。

はじめに

近年Faster-RCNN*2やYOLO*3SSD*4など、深層学習ベースの物体認識手法が高い認識精度を記録しています。今回はこうした物体認識手法のうち、SSD (Single Shot Multibox Detector) を用いて悪性度の高い皮膚障害であるメラノーマの領域を自動で検出するシステムをChainerCVを用いて実装しました。

なお、今回実装した結果は shunk031/chainer-skin-lesion-detector にて公開しております。

github.com

皮膚障害について

皮膚がんは皮膚障害の一種で、アメリカでは毎年5,000,000症例以上診断がなされています。特に悪性黒色腫「メラノーマ」*5は皮膚がんの最も深刻な形態で、皮膚がんにおける死亡率の多くを占めています。

2015年には、世界的なメラノーマの発症率は35万人を超えると推定され、約6万人が死亡したという報告があります。死亡率はかなり高いですが、早期発見の場合は生存率95%を超えています*6。したがって初期病徴を迅速に捉え、早期発見することが重要になってきます。

使用するデータセット

医療分野におけるデータ分析にする際に一番ネックとなるのがデータセット少なさです。特に深層学習ベースの識別器を用いる際はとてもクリティカルな問題になります。今回のタスクである 皮膚障害検出 に対するデータセットも、「公開されていてそのまま使える」といったものは探した限りではありませんでした。

幸いながら、皮膚障害全般のデータセットISIC 2018 | ISIC 2018: Skin Lesion Analysis Towards Melanoma Detection という皮膚障害認識のコンペティションで用いられた、HAM10000*7*8という比較的規模の大きいデータセットがあります。

このHAM10000をベースに、今回のタスクである皮膚障害検出に対するデータセットを簡易的に作成することにしました。

以下の画像はHAM10000に含まれる、Lesion Segmentation (病変部位の輪郭検出) に用いられるデータの例です。

f:id:shunk031:20181210071919p:plain
from Task 1: Lesion Boundary Segmentation | ISIC 2018 https://challenge2018.isic-archive.com/task1/

こうしたground truthに対して病変領域におけるバウンディングボックスを構築し、病変領域の検出を行おうと考えました。

皮膚障害検出データセットの作成

皮膚障害検出データセットを作成する際には以下2つのステップが必要です:

以下順を追って説明します。

バウンディングボックスの生成

セグメンテーション用のground truthから皮膚障害検出用のバウンディングボックスを取得します。PILのImage.getbbox*9を用いることで、画像内の非ゼロ領域のバウンディングボックスを計算できます。

In [1]: from PIL import Image

In [2]: gt = Image.open('ISIC_0000000_segmentation.png')

In [3]: gt.getbbox()
Out[3]: (31, 29, 620, 438)

https://github.com/shunk031/chainer-skin-lesion-detector/blob/master/src/make_dataset.py#L72-L76

ChainerCVのutils*10visualizations*11を用いることで、簡単に画像の読み込みと可視化をして確認することができます。

ln [1]: from chainercv.utils import read_image

ln [2]: from chainercv.visualizations import vis_bbox

ln [3]: import numpy as np

ln [4]: left, upper, right, lower = gt.getbbox()

ln [5]: gt_img = read_image('ISIC_0000000_segmentation.png')

ln [6]: vis_bbox(gt_img, np.asarray([[upper, left, lower, right]]))

実行すると以下のようにバウンディングボックスを含めて可視化することができます。

f:id:shunk031:20181210090334p:plain

Image.getbboxを使うことで綺麗にバウンディングボックスを生成することができました。

次に、得られたバウンディングボックスをもとにVOCフォーマットのXMLファイルを作成します。

VOCフォーマットのXMLファイルの生成

先行研究の深層学習ベースの物体検出・認識アルゴリズムPascal VOC*12といった大規模なデータセットを元に学習を行っています。 今回はこのPascal VOCのアノテーションデータと同じフォーマットのXMLファイルを作成し、それらをもとに学習を行っていきます。 ChainerCVはPascal VOCデータセットを想定した便利メソッドが多数揃っているため、恩恵も受けやすいです。

以下のブログを参考に、VOCフォーマットのXMLファイルを生成してみます。

segafreder.hatenablog.com

In [1]: import xml.etree.ElementTree as ET

In [2]: def make_voc_based_xml(folder_name, file_name, bbox):
   ...:     """
   ...:     Make VOC based XML string
   ...:     """
   ...:     left, upper, right, lower = bbox
   ...:     annotation = ET.Element('annotation')
   ...:
   ...:     annotation = ET.Element('annotation')
   ...:     tree = ET.ElementTree(element=annotation)
   ...:     folder = ET.SubElement(annotation, 'folder')
   ...:     filename = ET.SubElement(annotation, 'filename')
   ...:     objects = ET.SubElement(annotation, 'object')
   ...:     name = ET.SubElement(objects, 'name')
   ...:     pose = ET.SubElement(objects, 'pose')
   ...:     truncated = ET.SubElement(objects, 'truncated')
   ...:     difficult = ET.SubElement(objects, 'difficult')
   ...:     bndbox = ET.SubElement(objects, 'bndbox')
   ...:     xmin = ET.SubElement(bndbox, 'xmin')
   ...:     ymin = ET.SubElement(bndbox, 'ymin')
   ...:     xmax = ET.SubElement(bndbox, 'xmax')
   ...:     ymax = ET.SubElement(bndbox, 'ymax')
   ...:
   ...:     folder.text = folder_name
   ...:     filename.text = file_name
   ...:     name.text = 'lesion'
   ...:     pose.text = 'frontal'
   ...:     truncated.text = '1'
   ...:     difficult.text = '0'
   ...:     xmin.text = str(left)
   ...:     ymin.text = str(upper)
   ...:     xmax.text = str(right)
   ...:     ymax.text = str(lower)
   ...:
   ...:     return annotation

https://github.com/shunk031/chainer-skin-lesion-detector/blob/master/src/make_dataset.py#L20-L53

実行すると以下のようなXMLファイルを生成することができます。

<?xml version="1.0" ?>
<annotation>
  <folder>ISIC2018_Task1_Training_GroundTruth</folder>
  <filename>ISIC_0000000_segmentation.png</filename>
  <object>
    <name>lesion</name>
    <pose>frontal</pose>
    <truncated>1</truncated>
    <difficult>0</difficult>
    <bndbox>
      <xmin>31</xmin>
      <ymin>29</ymin>
      <xmax>620</xmax>
      <ymax>438</ymax>
    </bndbox>
  </object>
</annotation>

こうして得られたアノテーションデータと皮膚障害画像から、皮膚障害の検出を行うモデルのトレーニングを行います。

モデルのトレーニン

今回はChainerCVのSSDを用いて、以上で作成したアノテーションデータを元にモデルのトレーニングを行います。SSDアルゴリズムの説明は今回省かせていただきます。実装に先立ちまして、ChainerCVをベースとした以下の資料がとても参考になりました。

qiita.com

ChainerCVを用いたSSDモデルの構築

ChainerCVのexampleを元にSSDを学習させるコードを記述します。具体的な実装は以下を御覧ください。

https://github.com/shunk031/chainer-skin-lesion-detector/blob/master/src/main.py

Chainer・ChainerCVは素晴らしい深層学習フレームワークなので特に躓くところはありません。もともとのexampleが素晴らしすぎるため、大部分をそのまま使い回すことができます。少し補足するならば、画像を読み込んで前処理をし、モデルに流すDatasetMixinクラスです。

import xml.etree.ElementTree as ET

import chainer
import numpy as np
from chainercv.utils import read_image

from util import const


class ISIC2018Task1Dataset(chainer.dataset.DatasetMixin):

    def __init__(self, img_fpaths, gt_fpaths):
        assert len(img_fpaths) == len(gt_fpaths), \
            f'# of image: {len(img_fpaths)} != # of ground truth: {len(gt_fpaths)}'
        self.annotations = self.load_annotations(img_fpaths, gt_fpaths)

    def load_annotations(self, img_fpaths, gt_fpaths):

        annotations = []
        for img_fpath, gt_fpath in zip(img_fpaths, gt_fpaths):
            anno_dict = self.parse_annotation(gt_fpath)
            annotations.append((img_fpath, anno_dict))

        return annotations

    def parse_annotation(self, xml_fpath):
        anno_dict = {'bbox': [], 'label': []}

        anno_xml = ET.parse(str(xml_fpath))
        for obj in anno_xml.findall('object'):
            bndbox = obj.find('bndbox')
            name = obj.find('name').text.strip()
            anno_dict['label'].append(const.LABELS.index(name))
            anno_dict['bbox'].append([
                int(bndbox.find(tag).text) - 1
                for tag in ('ymin', 'xmin', 'ymax', 'xmax')])

        return anno_dict

    def __len__(self):
        return len(self.annotations)

    def get_example(self, i):

        img_fpath, anno_dict = self.annotations[i]
        img = read_image(str(img_fpath), color=True)
        bbox = np.asarray(anno_dict['bbox'], dtype=np.float32)
        label = np.asarray(anno_dict['label'], dtype=np.float32)
        
        # Return arrays with the following shape
        # img: (ch, h, w)
        # bbox: (num bboxes, (ymin, xmin, ymax, xmax))
        # label: (num labels, )
        return img, bbox, label

chainer.datasets.DatasetMixin クラスを継承し、get_exampleにて画像とバウンディングボックス、対象ラベルを返すようにする必要があります。

モデルの評価

予測精度

学習して得られたモデルを元に評価を行います。物体検出で広く用いられている評価指標である mean Average Precision (mAP) を元に予測精度を評価します。

from chainercv.evaluations import eval_detection_voc

test_dataset = ISIC2018Task1Dataset(test, test_gt) # テストデータの準備
chainer.serializers.load_npz('model_best.npz', model) # 予め学習したモデルの読み込み

result = {'ap': [], 'map': []}
for idx in tqdm(range(len(test_dataset))):
    img, gt_bboxes, gt_labels = test_dataset[idx]  # テストデータからデータを取得
    bboxes, labels, scores = model.predict([img]) # モデルに予測させる
    score = eval_detection_voc(bboxes, labels, scores, [gt_bboxes], [gt_labels]) # mAP等を計算

    result['ap'].append(score['ap'])
    result['map'].append(score['map'])

print(np.mean(result['map']))
>> 0.9421965317919075

以上を実行した結果、今回構築したモデルにおいて mAPは 0.94 を記録しました。

予測結果の可視化

構築した皮膚障害検出システムは比較的高い精度を記録することができました。では実際のモデルの予測結果を見てみましょう。

成功例

以下に正しく検出できた例を示します。撮影の際に写り込んでしまう黒い枠に反応することなく、正しく病変部位を予測することができています。写り込んでしまっている体毛にも頑健であることが分かります。

f:id:shunk031:20181211062233j:plainf:id:shunk031:20181211062236j:plain
f:id:shunk031:20181211062244j:plainf:id:shunk031:20181211062248j:plain

失敗例

では次に正しく検出できなかった例を示します。システムがエラーしているサンプルを観察するのはとても重要です。

こちらは予測したバウンディングボックスがground truthよりも大きかった例です。

f:id:shunk031:20181211064354j:plainf:id:shunk031:20181211064358p:plain

こちらは病変部位の色が薄いパターンです。

f:id:shunk031:20181211064852j:plainf:id:shunk031:20181211064849p:plain

人間が診断しても正確な判断が困難なサンプルであることが見て取れると思います。こうしたサンプルに対してどのようにモデルを改善していくかが今後の課題になってきそうです。

おわりに

ChainerCVを用いて皮膚障害検出システムを構築しました。医療画像分野は取得できるデータがとても少なく、工夫をしてデータセットを作る場面があるかもしれません。そこで今回は他のタスクに利用可能な形でデータセットを簡易的に作成し、最新のモデルで病変部位の識別を行うシステムを構築しました。ChainerCVはとても簡単にモデルを作成することが可能で、なおかつ分析する際にもユーティリティーがとても便利に使えます。 医療xAIの分野は盛り上がりつつあります。PyTorchベースの医療診断フレームワーク*13*14も現れてきておりますし、これからの発展がとても楽しみです。

参考

*1:Scalable and accurate deep learning with electronic health records | npj Digital Medicine https://www.nature.com/articles/s41746-018-0029-1

*2:Ren, Shaoqing, et al. "Faster r-cnn: Towards real-time object detection with region proposal networks." Advances in neural information processing systems. 2015.

*3:Redmon, Joseph, et al. "You only look once: Unified, real-time object detection." Proceedings of the IEEE conference on computer vision and pattern recognition. 2016.

*4:Liu, Wei, et al. "Ssd: Single shot multibox detector." European conference on computer vision. Springer, Cham, 2016.

*5:5. 悪性黒色腫(メラノーマ)|一般社団法人日本皮膚悪性腫瘍学会 http://www.skincancer.jp/citizens_skincancer05.html

*6:About melanoma: https://challenge2018.isic-archive.com/

*7:Noel C. F. Codella, David Gutman, M. Emre Celebi, Brian Helba, Michael A. Marchetti, Stephen W. Dusza, Aadi Kalloo, Konstantinos Liopyris, Nabin Mishra, Harald Kittler, Allan Halpern: “Skin Lesion Analysis Toward Melanoma Detection: A Challenge at the 2017 International Symposium on Biomedical Imaging (ISBI), Hosted by the International Skin Imaging Collaboration (ISIC)”, 2017

*8:Tschandl, P., Rosendahl, C. & Kittler, H. The HAM10000 dataset, a large collection of multi-source dermatoscopic images of common pigmented skin lesions. Sci. Data 5, 180161 doi:10.1038/sdata.2018.161

*9:Image Module — Pillow (PIL Fork) 4.1.1 documentation  https://pillow.readthedocs.io/en/4.1.x/reference/Image.html#PIL.Image.Image.getbbox

*10:Utils — ChainerCV 0.11.0 documentation https://chainercv.readthedocs.io/en/stable/reference/utils.html

*11:Visualizations — ChainerCV 0.11.0 documentation https://chainercv.readthedocs.io/en/stable/reference/visualizations.html

*12:The PASCAL Visual Object Classes Homepage http://host.robots.ox.ac.uk/pascal/VOC/

*13:perone/medicaltorch: A medical imaging framework for Pytorch https://github.com/perone/medicaltorch

*14:pfjaeger/medicaldetectiontoolkit: The Medical Detection Toolkit contains 2D + 3D implementations of prevalent object detectors such as Mask R-CNN, Retina Net, Retina U-Net, as well as a training and inference framework focused on dealing with medical images. https://github.com/pfjaeger/medicaldetectiontoolkit

ワシントンDCで行われた国際会議で発表してきて、そのノリでニューヨークとボストンに行ってきた 4/4

こんにちは。@shunk031です。段々と寒くなってきましたね。足元にGPUマシンだけが暖かく見守ってくれる季節になりました。

初めての国際学会でワシントンDCに3泊4日、その後移動してニューヨークに3泊4日、ボストンに3泊4日ほど観光してきました。 そもそも海外渡航が初めてだったので、準備等も含めて旅行記のようなものを残しておきます。

f:id:shunk031:20181025074202j:plain

目次

学会発表

http://shunk031.hatenablog.com/entry/aipr2018_01shunk031.hatenablog.com

観光

なんとか初めての国際学会での発表を終えて、これからが本番です。ワシントンDC、ニューヨーク、ボストンの主要観光スポットをいい感じにまわる戦略でやっていきました。 観光するにあたり、Google mapのマイマップ機能はとても重宝しました。 dekiru.net

学会中は研究費で宿代などが出ていましたが、観光時にはAirbnbを使って格安で部屋をとりました。 abnb.me

移動には基本地下鉄を使いました。Pasmo/Suicaのような地下鉄カードを買っていい感じにチャージするとスムーズに乗れました。 夜まで観光してしまった場合はUberを使いました。初めて使ったんですがとても便利ですね。

https://www.uber.com/invite/epgfsxwww.uber.com

初日のワシントンダレス国際空港からホテルへは乗り合いのシャトルバスSuper Shuttleを使ってみました。 行き先を予め予約しておくとかなり格安で市街地のホテルまで乗せて行ってくれます。 私は予約せずにのりばのお姉さんに行き先を言って乗車したのですが、それでもUberの半額程度で目的地まで乗せてくれました。

www.supershuttle.com

ワシントンDC

学会発表終わりのワシントンDC観光編はこちら。

http://shunk031.hatenablog.com/entry/aipr2018_02shunk031.hatenablog.com

ニューヨーク

ニューヨーク観光編はこちら。とても刺激的な街でした。

http://shunk031.hatenablog.com/entry/aipr2018_03shunk031.hatenablog.com

ボストン

泊まったところ

  • Central Square駅から5分ぐらいのところでとてもアクセスが良かったです。すぐ近くに綺麗なコインランドリーがあり、洗濯もできました。

食べたもの

Union Oyster House

www.tripadvisor.jp

f:id:shunk031:20181026142919j:plainf:id:shunk031:20181026143327j:plain

Lobster Scampi, Mussels

f:id:shunk031:20181026142747j:plain Live Lobsters Prepared Boiled Or Broiled

f:id:shunk031:20181026142812j:plain Union Grilled Oysters

らーめん山頭火

www.tripadvisor.jp

f:id:shunk031:20181026144034j:plain

Headhall

www.tripadvisor.jp

f:id:shunk031:20181026144247j:plain Fish & Frites

f:id:shunk031:20181026144238j:plain Buffalo Fried Shrimp

f:id:shunk031:20181026144259j:plain New England Clam Chowder

  • MITの近くのお店です。とても賑わっていました。ビールの種類がとても多いみたいです。
Boston Chowda Co.

www.tripadvisor.jp

Lobster Roll & Lobster Pie

  • ロブスターロールが美味しいお店と聞いてランチできました。サクッと食べれていいのですが、$25ぐらいでびっくりしました。
Boston and Maine Fish Co.

www.tripadvisor.jp

  • ロブスターロールだけだと物足りなかったのでシュリンプカクテルを購入しました。
Summer Shack

www.tripadvisor.jp

f:id:shunk031:20181026145857j:plain

f:id:shunk031:20181026145853j:plain LOBSTERS IN THE ROUGH

f:id:shunk031:20181026145830j:plainf:id:shunk031:20181026145839j:plain

LOBSTER POTSTICKERS & MUSSELS

行ったところ

  • Quincy Market
  • Harvard University
  • Massachusetts Institute of Technology
  • The Boston Public Library
  • Prudential Center Tower

買ったもの

ワシントンDCで行われた国際会議で発表してきて、そのノリでニューヨークとボストンに行ってきた 3/4

こんにちは。@shunk031です。段々と寒くなってきましたね。足元にGPUマシンだけが暖かく見守ってくれる季節になりました。

初めての国際学会でワシントンDCに3泊4日、その後移動してニューヨークに3泊4日、ボストンに3泊4日ほど観光してきました。 そもそも海外渡航が初めてだったので、準備等も含めて旅行記のようなものを残しておきます。

f:id:shunk031:20181025074202j:plain

目次

学会発表

shunk031.hatenablog.com

観光

ワシントンDC

学会発表終わりのワシントンDC観光編はこちら。 shunk031.hatenablog.com

ニューヨーク

泊まったところ

www.tripadvisor.jp

  • Path駅から10分かからないぐらいの場所でした。初めて共用バスルームの部屋を借りたのですが、少し気を使いましたね。

食べたもの

Joe's Shanghai

www.tripadvisor.jp

f:id:shunk031:20181026124048j:plainf:id:shunk031:20181026124042j:plain

小籠包・麻婆豆腐・青椒肉絲

  • 夜に行ったのですがとても並んでいました。小籠包、麻婆豆腐、青椒肉絲を頼みました。ご飯が食べた過ぎて頼んだのですが、"ライス"が来ました。

The Halal Guys

www.tripadvisor.jp

f:id:shunk031:20181026124654j:plain Combo over Rice

f:id:shunk031:20181026125145j:plain

  • ニューヨークの屋台料理屋さんです。昼から行列ができていて、買ったら路上のベンチに座って食べる感じです。サイズがとても大きく、その日は1食これを食べただけで生活できました。

Benjamin Steakhouse

www.tripadvisor.jp

f:id:shunk031:20181026125421j:plain

f:id:shunk031:20181026125417j:plain Steak for Two

  • ニューヨークと言えばステーキ、ステーキと言えばBenjamin Steakhouseということなので行ってきました。高級なお店ほど店内が暗い理論があるらしいですが、写真の通り暗かったです。

www.tripadvisor.jp

www.tripadvisor.jp

  • Lucky CatとMuldoon's Irish Barはニューヨーク在住の知り合いの方と行きました。ニューヨーカーの生活を少し体験することができました。

行ったところ

f:id:shunk031:20181026125930j:plain

  • Times Square
  • Empire State Building
  • World Trade Center
  • Central Park
  • Battery Park
  • Statue of Liberty
  • Grand Central Station
    • ささやきの回廊

ボストン

ボストン観光編はこちら。有名大学を中心に観光しました。

shunk031.hatenablog.com

ワシントンDCで行われた国際会議で発表してきて、そのノリでニューヨークとボストンに行ってきた 2/4

こんにちは。@shunk031です。段々と寒くなってきましたね。足元にGPUマシンだけが暖かく見守ってくれる季節になりました。

初めての国際学会でワシントンDCに3泊4日、その後移動してニューヨークに3泊4日、ボストンに3泊4日ほど観光してきました。 そもそも海外渡航が初めてだったので、準備等も含めて旅行記のようなものを残しておきます。

f:id:shunk031:20181025074202j:plain

目次

学会発表

初めての国際学会発表編はこちら。たくさんフィードバックをいただけました。 shunk031.hatenablog.com

観光

ワシントンDC

泊まったところ

食べたもの

www.tripadvisor.jp

  • ちょうど宿泊していたホテルのすぐ裏にあったベーグル屋さんで朝食を買いました。現金のみだったので初手で現金がなくなりましたが美味しいベーグルでした。

www.tripadvisor.jp

  • アメリカはピザが何よりも安いと聞いて行きました。デフォルトで2ピース$5ぐらいだったのですが、日本のLサイズのピザ半分ぐらいの大きさでした。

www.tripadvisor.jp

  • ワシントンはシーフードが美味しいという噂を聞いたのでいきました。いろんな種類の海鮮がスパイシーなタレに漬かったComboというのを頼みました。

www.tripadvisor.jp

f:id:shunk031:20181026114309j:plain ALL AMERICAN

f:id:shunk031:20181026114320j:plain MUSSEL POT

f:id:shunk031:20181026131630j:plain VANILLA BEAN CHEESECAKE (BANANAS FOSTER)

  • 学会発表終了後に行ったお店です。FARMERS (サラダ)、ALL AMERICAN (ハンバーガー)、MUSSEL POT (ムール貝の鍋) を頼みました。デザートで食べたチーズケーキがとても重かったです笑

行ったところ

ワシントンの有名所の観光名所は回ったと思います。この他にもおすすめの名所があったら教えてください。

  • Dupont Circle
  • White House
  • Suntrust
  • Cosmos Club
  • United States Capitol
  • National Museum of American History
  • National Museum of African American History and Culture
  • Washington Monument
  • World War Ⅱ Memorial
  • Lincoln Memorial

その他

LIME

町中を歩いていると電動スクターを乗った人をたくさん見ました。何か調べてみるとLIMEという電動スクーターをシェアするサービスのようです。

www.li.me

アプリを入れて支払い情報を入れて設定するとすぐに使えるようになります。スクーターのロック解除に$1で、¢15/分程度で楽に移動できるのでとてもおすすめです。

ニューヨーク

ニューヨーク観光編はこちら。とても刺激的な街でした。 shunk031.hatenablog.com

ボストン

ボストン観光編はこちら。有名大学を中心に観光しました。 http://shunk031.hatenablog.com/entry/aipr2018_04shunk031.hatenablog.com

ワシントンDCで行われた国際会議で発表してきて、そのノリでニューヨークとボストンに行ってきた 1/4

こんにちは。@shunk031です。段々と寒くなってきましたね。足元にGPUマシンだけが暖かく見守ってくれる季節になりました。

初めての国際学会でワシントンDCに3泊4日、その後移動してニューヨークに3泊4日、ボストンに3泊4日ほど観光してきました。 そもそも海外渡航が初めてだったので、準備等も含めて旅行記のようなものを残しておきます。

f:id:shunk031:20181025074202j:plain

目次

海外渡航準備

ビザ免除プログラム (ESTA)

アメリカへ短期間の滞在の場合、ESTAを取得することでビザ無しで入国することができます。申請には $18 ほど必要なのですが、ぼったくりサイトもあるようです。 以下のリンクは正規のESTA申請サイトでした。 .gov ドメインが付いている政府のサイトなので大丈夫ですね。

https://esta.cbp.dhs.gov/esta/application.htmlesta.cbp.dhs.gov

インターネット環境 (SIMカード)

SIMフリーOPPO R15 Proを持っていたため、アメリカで使えるプリペイドSIMカードを購入しました。 今回は同じ学会で発表する同期の分も合わせて以下の2つを購入してみました。

入国審査

「学会発表に来たよ〜」と言ったら「そんな若者が学会で発表するはずない」みたいなことを言われて一瞬焦りましたが、参加登録のメールを見せたら通してくれました。よかった。

学会発表

今回ワシントンDCのCosmos Clubで開かれたApplied Imagery Pattern Recognition (AIPR) 2018 workshopにて学会発表を行ってきました。 www.tripadvisor.jp

Applied Imagery Pattern Recognition (AIPR) 2018 workshop

今年で47回目の由緒ある学会でした。コンピューターサイエンスの学会だとラフな格好でも大丈夫な場合が多いと思いますが、Cosmos Clubというこちらも由緒正しい会場での開催のため、ドレスコードがありました。

www.aipr-workshop.org

End-to-End Text Classification via Image-based Embedding using Character-level Networks

本学会では以下の内容について口頭発表させていただきました。

日本語や中国語等の自然言語処理をするとき、形態素解析が困難な場合が多いです。そこで文字単位で入力を行うことはもう一般的と行ってもいいでしょう。 今回の論文では日本語・中国語の文字の表意性を文字画像から抽出し、その特徴量をもとに高精度に文書分類を行いShimada et al*1に対して、End-to-Endのモデルに発展させたCE-CLCNNというモデルを提案しています。こうしたアーキテクチャから、CE-CLCNNでは以下のような長所を持ちます。

  • 困難な形態素解析が不要
  • 文字の形状的特徴を考慮した文字表現の学習
  • 画像に対するdata augmentationおよび文字表現に対するdata augmentation

通常の自然言語処理におけるdata augmentationは、前述の通り難しい形態素解析を行い、意味解釈を経なければなりません。 この提案モデルでは文字単位の入力に対して、意味解釈が不要な文字の見た目をうまく捉えるようなdata augmentationを適用可能としており、文書解析能力が向上しております。 自然言語処理に対して画像処理分野のdata augmentationの応用が可能な、面白い研究になったと思っています。

詳しくはarXivにも公開しておりますのでぜひご一読いただければと思います。

[1810.03595] End-to-End Text Classification via Image-based Embedding using Character-level Networks

観光

なんとか初めての国際学会での発表を終えて、これからが本番です。ワシントンDC、ニューヨーク、ボストンの主要観光スポットをいい感じにまわる戦略でやっていきました。 観光するにあたり、Google mapのマイマップ機能はとても重宝しました。 dekiru.net

観光時にはAirbnbを使って格安で部屋をとりました。今回お世話になったホストさんたちはとても親切で、観光名所などを丁寧に教えていただけました。 abnb.me

移動には基本地下鉄を使いました。Pasmo/Suicaのような地下鉄カードを買っていい感じにチャージするとスムーズに乗れました。 夜まで観光してしまった場合はUberを使いました。初めて使ったんですがとても便利ですね。

https://www.uber.com/invite/epgfsxwww.uber.com

初日のワシントンダレス国際空港からホテルへは乗り合いのシャトルバスSuper Shuttleを使ってみました。 行き先を予め予約しておくとかなり格安で市街地のホテルまで乗せて行ってくれます。 私は予約せずにのりばのお姉さんに行き先を言って乗車したのですが、それでもUberの半額程度で目的地まで乗せてくれました。 www.supershuttle.com

ワシントンDC

学会発表終わりのワシントンDC観光編はこちら。 shunk031.hatenablog.com

ニューヨーク

ニューヨーク観光編はこちら。とても刺激的な街でした。 shunk031.hatenablog.com

ボストン

ボストン観光編はこちら。有名大学を中心に観光しました。 http://shunk031.hatenablog.com/entry/aipr2018_04shunk031.hatenablog.com

*1:Shimada, Daiki, Ryunosuke Kotani, and Hitoshi Iyatomi. "Document classification through image-based character embedding and wildcard training." Big Data (Big Data), 2016 IEEE International Conference on. IEEE, 2016.

最先端の顔認証技術を実装したスマートボックスでHackU法政2018の最優秀賞をいただきました

毎日暑い日が続きますが、皆さんいかがお過ごしでしょうか。@shunk031です。こういう日は涼しい部屋に引きこもってGPUマシンを回すに限りますね。

さて、2018年の6月から8月にかけてYahoo! JAPAN 様が主催のハッカソンであるHackU 法政大学 2018 Student HackathonCpawのメンバーで出場し、最優秀賞をいただきました。 f:id:shunk031:20180812205409j:plain hacku.yahoo.co.jp

ハッカソンということで モダンな技術スタックDeep LearningIoTVRといった近年バズりを見せている技術を使ってキラキラな作品を作ると受けがいいということは世界共通の認識ですよね。 今回はこの中でも私を含むチームメンバーが得意なDeep Learning電気電子工学科B1のスーパーエースIoTの部分を担当し、モダンな技術スタックで結合した Chash Box を作らせていただきました。

Chash Box

今回HackUで作成した Chash Box (チャッシュボックス) はざっくりいうとDeep LearningとIoTと音声認識を用いた AI スマートボックスです。

MobileNetのアーキテクチャをもとにしたSiamese Networkによる顔認証と音声認識を用いたAIスマートボックス

Chash Box の詳しい全体像についてはCpaw公式ブログをご覧ください。

今回この Chash Box を作る過程において、私は 顔認証技術のプロトタイプ作成 をメインで務めさせていただきました。

Chash Box における Deep learningを用いた顔認証技術

Chash Box の顔認証を実装するにあたり、以下の要件にフォーカスをして技術選定を行いました。

高速に動作可能 は自ずと必要な要件ですね。 顔を登録するときに再度モデルを学習させることは現実的に不可能なため、再学習を必要としないアーキテクチャ が必要になります。 Chash Boxは複数人数の使用を想定しているため、iPhone XのFaceIDのように個人を識別するのとは違い、複数人の顔を登録できる 必要があります。

こうした要件に対し、私は MobileNet *1 をベースとした SiameseNet *2 を用いた顔認証技術を実装しました。

高速に動作可能な MobileNet

限られたリソースの上で高速に動作させることが重要なシステムであったため、ベースモデルとしてMobileNetを選択しました。 MobileNetは従来のconvolutionと異なり、空間方向およびチャンネル方向に対して個別にconvolutionを行うseparable convolutionを用いて計算量を削減したモデルになっています。 f:id:shunk031:20180812210247p:plain

Kerasに用意されている学習済みのMobileNetを再学習する形でシステムに組み込みました。

SiameseNetを用いた複数人識別可能なシステム

カメラから入力される顔画像が、予め登録されている顔かそれ以外かを 分類 することは非常に難しいです。 なぜなら端末上、もしくは外部のサーバー上でこうした顔の分類を行うモデルの学習・推論を行わなければならず、とてもコストが掛かります。 また登録されていない顔画像を集めるのに相当な労力を要することはご想像のとおりでございます。

そこで今回Siamese構造を持つアーキテクチャを用いることで、再学習が不要でなおかつ複数人を識別できるようにしました。 SiameseNetは重みを共有する2つのネットワークに対して、同一人物の顔画像のペア、もしくは別人同士の顔画像のペアをconstractive lossを最小化する形で学習するネットワーク構造になっています。 このアーキテクチャを用いることで、別人との顔画像間の特徴空間上における距離を最大化するようにネットワークが学習を行います。 f:id:shunk031:20180812211511p:plain

こうして学習したネットワークをデプロイしておくことで、モデルに入力した顔画像が  N 次元の特徴ベクトルとなって出力されます。 予め顔登録時に特徴ベクトルを作っておきまして、ロック解除時に入力される顔画像を特徴ベクトルに変換し、類似度を計算します。 ある一定の閾値よりも類似している場合にボックスのロックを解除する仕組みです。

顔認証システムの動作環境

実装した顔認証システムはNVIDIA Jetson TX2 にデプロイしました。 Jetson TX2は組込みシステム向けに開発されたモジュールで、今回実装した顔認証システムをより高速に動作させることを可能としてくれました。 f:id:shunk031:20180812175411j:plain

おわりに

私自身、普段から深層学習を中心に研究しているのですが、deep learningモデルをシステムに組み込んでなおかつ精度良く動作させることがとても難しかったです。 特にモデルのチューニングや学習データと実際に入力されるカメラ画像との差(ノイズ etc.)による精度の低下など、実世界への応用における障害を実際に体験することができました。 今回のハッカソン参加を通じてでDeep learningの実社会への適用により興味が湧きました。

参考

towardsdatascience.com

*1:[1704.04861] MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications https://arxiv.org/abs/1704.04861

*2:Learning a similarity metric discriminatively, with application to face verification - IEEE Conference Publication https://ieeexplore.ieee.org/document/1467314/

2018年の目標

明けましておめでとうございます。@shunk031です。CNN Is All I Need*1という気持ちで新年を迎えました。

前記事で2017年をざっくりと振り返りました。

shunk031.hatenablog.com

2018年を迎えるにあたって今年1年の目標を宣言してみようと思います。

2018年の目標

  • 新大学院生として、大学院生生活に慣れる
    • 人間として精神を保ち、確固たる確信を持って生活する
    • (結構難しそう)
  • 毎月10〜20本程度は論文を読んで落合先生フォーマットでまとめる
    • shunk031/paper-survey に引き続きまとめていくスタイルでやっていきたい
    • (いい感じにjekyllのページテンプレートを改築したい)
  • 新しい言語を習得する
    • Golang (よさそう)
      • 雰囲気的によさそう
      • pythonで書いたお手製CLIとかをGolangで書ければ嬉しいのかも
    • Javascript (なんだかんだ使いそう)
      • D3jsをいい感じに使いたい
      • スクレイピングのときにゴニョゴニョしたいので読めると嬉しい
      • なんだかんだWeb界隈はJavascript
    • Cython
      • 秘伝のPythonコードを高速にしたい
      • 最後の砦感ある
    • PyTorch
      • フレームワークじゃん
      • PyTorch実装ならもうどこにでもあるから使えるようにしたい
  • ブロックチェーン周りの勉強
    • 一般教養になりそうな雰囲気がある
  • インターンを通して社会実装へチャレンジ
    • 自分が研究している自然言語処理や画像認識をどう社会へ適用するかを考え、手を動かす
    • 自分のスキルがどう使えるのか、どういうスキルが必要になるのかを学ぶ
    • 綺麗なコードを書く。しゅっっとしたいい感じのコードを書く
  • 継続的に勉強会に参加して知り合いを増やしたい
    • あわよくば発表とかできたらなお良い
  • 継続的に学会に参加して知り合いを増やしたい
    • YANSは楽しかったのでまた参加したい
    • 国際学会に通すという強い意志
  • 機械学習コンペを継続的にやっていく
    • Kaggleを中心にワンチャンでオプトDeepAnalyticsをやっていきたい
  • 真剣に恋活および婚活を進める
    • 月1で合コン / 街コンに強い意志で参戦する
    • ニューラルネットと恋人にはなれない
    • このままだと「彼女を生成するッ!!」とか言ってGANとかEncoder-Decoderとかで作り始めてしまう危険性がある
    • ふとした時に無になってしまうので心の拠り所が欲しい

ぱっと浮かんだのがこんな感じです。曖昧なものも多く評価が難しそうです。最後はかなりガチですが、目標を立てたのでやっていきます!

進捗が悪そうな場合はTwitterとかで言ってもらえると頑張れると思います。よろしくお願いします!

*1:[1712.09662v1] CNN Is All You Need https://arxiv.org/abs/1712.09662v1