のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

2020年の目標とやりたいこと

皆さんあけましておめでとうございます。
今年もよろしくお願いします。

さて、本年やりたいことを書き連ねたいと思います。

Kaggle

昨年はKaggleに何度も挑みましたが、銀か銅しか取れず、金が0枚といった
結果について鳴かず飛ばずな一年だったと感じています。
昨年よりもソロも多かったのですが、チームでも獲得できなかったところを考えるとまだまだ実力を磨く必要はあると思っています。

今年はGMになるために金3枚(ソロ含む)を目指して完走したいと思っています。

ブログ

Kaggleの方は比較的頑張ったのですが、今年それ以外の活動が疎かになっていたと思っています。
ブログの更新も最近滞っていたので、今年はKaggleで得たものや論文の紹介、或いは便利なツール使ってみたなど
発信をしていけたらと考えています。

12回の更新、月1度ずつぐらいを目指します。
ただ、コンペの状況を考えるとまとめてどこかにかもしれないなぁと思いつつ新年ぐらいこれやるぞと思ってやります。

勉強会&発表活動

今年はCV勉強会への参加や発表がメインになっていました。
ただ、発表も2回と例年と同等ぐらいです。
ただ、あまり活動範囲に進展がないので、今年はPyConJPのCFP通したい(なかなか通らない)など、他にもう少し本腰入れて挑戦したいと思っています。

その他

活動内容が固定化しつつあるので、今年は今までよりもステップアップするために活動範囲を増やしたいとも思っています。
様々な挑戦を考えていきたいと思いますが、お会いした際にはお声がけいただけると幸いです。

最後に

今年1年も皆さんよろしくお願いします!

実務やKaggleで使えるPyTorchのライブラリを紹介します!

皆さんこんにちは
お元気ですか。私は元気です。

暫くKaggleしかしていなかったせいか、今年のブログ投稿頻度がひどいことになっています(がんばります。。)
それはさておき、本日はKaggleのCompetitonで便利なPyTorchのライブラリを紹介してきます。

昨年は、PyTorchの中でもAlbumentationのライブラリを紹介しました。

共通

Pytorchのモデルが容易になるライブラリ

PyTorchのモデルを書くにはモデルの宣言や変数の使い方、GPU転送などをお作法に従って記載する必要があります。
ただし、毎度毎度同じなので、それを一部ユーザで実装するエコシステムとなるライブラリが開発されています。
なぜか3つもあるので困りものです。

各ライブラリの詳細はこちらの記事を見ていただけるほうが良さそうですので、私からは名前と印象のみ紹介します。
qiita.com

Ignite

最近見ないですが、一時期利用しているユーザが多かった気がします。
github.com

Catalist

KaggleのKernelでよく見るライブラリです。
実装がシンプルでできるのが特徴でしょうか。
github.com

Lightning

最近一番盛り上がっていたライブラリですが、色々お作法通りに書くのが面倒だったのでやめた記憶があります。
github.com

Apex

NVIDIA社が公開しているPyTorchのMixed Precisionを行うためのライブラリです。
Mixed Precisionはfloat16,32での計算を自動的に変換することで、省メモリかつ計算速度が高速になり、精度も維持できるような仕組みです。
画像系の中でもSegmentationのように解像度を落としにくいような処理で応用できます。

github.com

詳しいMixed Precisionの仕組みはこちらに記載されているので一読すると良いと思います。
Introduction to Mixed Precision Training with PyTorch and TensorFlow

NLP

Transformers

BERTが発表され、その後継となるPretrainedモデルが作られてきました。
ただし、BERTは計算時間が必要で、汎用的なマシンでの計算はかなり難しいです。
原因は事前学習と呼ばれるタスクに依存しない文脈を学習させるフェーズが必要で、ここに多くの時間が割かれることになります。

それらの事前学習済のモデルが以下で配布されており、サンプルのコードもあるので、使いやすいでしょう。

github.com

Image Processing

Pretrained Pytorch

Kaggleの画像処理コンペティションでは概ね事前学習済のモデルを利用します。
大体の方はこちらから取得したモデルを使っているのではないでしょうか。
ただ、2018年からモデルの更新がないのでその点は少し心配どころですね。
github.com

EfficientNet-PyTorch

2019年に特に猛威を奮っているEfficientNetと呼ばれるニューラルネットワークアーキテクチャがあります。
その学習済のPytorchモデルは次の箇所から取得できます。
従来までのモデルよりも計算速度が早く、精度が高いのが特徴です。ただし、私の経験ではありますが、それなりにメモリを利用するので容易ではない印象を持っています。
github.com

元論文を見たい方は次を参照ください。
arxiv.org

segmentation-pytorch

Kaggle界隈でよく利用されるSegmentationのライブラリです。
UNetやFPNなどのDecoderや多くのBackboneネットワーク(ResNet, Efficientnetなど)が備わっているため、
Segmentationのコンペティションでは非常に有用であること間違いなしです。

github.com

mmdetection

物体検出系(Object Detection&Instance Segmentation)の最新もモデルや仕組みを提供しているライブラリです。
Open Images Datasetのコンペティションでも多くの参加者が利用しています。
カスタマイズできる余地や設定ファイルのみで学習ができるところが非常におすすめのポイントの一つです。

github.com

Albumentation

言わずもがな、Kaggleの画像処理で最も利用されているライブラリです。
頻繁にアップグレードされており、新しいAugmentationが次々に取り込まれています。

github.com

最後に

Kaggleで利用できるライブラリが多くなってきたなぁといった印象です。
研究や実験だとKerasよりも圧倒的にPyTorchが扱いやすいので、ライブラリが多いのは嬉しい限りです。
お読み頂いた皆さんには有効に活用して効率化していってもらえればと思っています。

では皆さんまたお会いしましょう!

Kaggleの画像コンペで便利なライブラリを紹介します。

皆さんこんにちは。
お久しぶりです。本日はPyTorchを用いて、Kaggleをする際に便利なソフトウェアを紹介します。
この記事はPyTorch Advent Calendar 15日目です。

qiita.com

私自身、画像コンペィションでは、豊富な実装からPyTorchを利用するケースが多いです。
PyTorchで今回使っているライブラリを2点紹介したいと思います。

Pretrained PyTorch

Pretraining modelを用いてFine turningをすることで、
初期から学習したモデルよりも精度が向上します。

PyTorchには公式で配布している以上に、
github上に様々なPreTrainingモデルを公開されています。

github.com

学習済モデルの利用

from pretrainedmodels.models.resnext import resnext101_32x4d
model = resnext101_32x4d(1000, pretrained="imagenet")
model(torch.randn(1, 3, 224, 224))

FineTurning

上記のままだと出力が1000層にしかなりません。
そのため、10クラスのみ分類したい場合だとモデルの加工が必要になります。
最後の層のインスタンス変数を直接書き換えることで、カスタマイズされたモデルの作成ができます。

from pretrainedmodels.models.resnext import resnext101_32x4d
model = resnext101_32x4d(1000, pretrained="imagenet")
model(torch.randn(1, 3, 224, 224))

model.last_linear = nn.Sequential(
    nn.Linear(2048, 1000),
    nn.ReLU(inplace=True),
    nn.Linear(1000, 10)
)

Albumentation

AlbumentationはOpenCVをバックエンドで利用した効率の良いライブラリです。
PyTorchだと非常に簡単に使える口はありますが、他のライブラリにも簡単に組み込めます。
高速なAugmentationの実装は学習速度に大きく影響します。


単純なAlbumentationの実装

次に単純なAlbumentationの実装を記載します。
HorizonalFlipのみを行うコードです。

import cv2
from albumentations import (
    HorizontalFlip
) # (1)
from urllib.request import urlopen

def download_image(url):
    data = urlopen(url).read()
    data = np.frombuffer(data, np.uint8)
    image = cv2.imdecode(data, cv2.IMREAD_COLOR)
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    return image
image = download_image('https://d177hi9zlsijyy.cloudfront.net/wp-content/uploads/sites/2/2018/05/11202041/180511105900-atlas-boston-dynamics-robot-running-super-tease.jpg') # (2)
auged_img= aug(image=image)["image"] # (3)

import文で、Horizonal Flipを読み込みます。
(2)のdownload_image関数で画像をWeb上から読み込みます。そして、最後の(3)を実行して、変換後の画像を獲得できます。

Compose

前章では、Augmentationは1種類でした。
ただし、Kaggleでは、複数のAugmentationを実行したいケースがあります。
例えば、水平反転->回転->ノイズ適用のような場合です。

Albumentationには、これを実現するComposeと呼ばれるクラスがあります。
Composeは、複数のAugmentationを順番に実行します。

aug = Compose([ # (1)
    HorizontalFlip(0.5), # (2)
    OneOf([
        MotionBlur(p=.2),
        MedianBlur(blur_limit=3, p=.1),
        Blur(blur_limit=3, p=.1),
    ], p=0.2) # (3),
    ShiftScaleRotate(shift_limit=0.0625, scale_limit=0.2, rotate_limit=45, p=.2),# (4)
    OneOf([
        RandomContrast(),
        RandomBrightness(),
    ], p=0.3) # (5)
], p=0.5) 

(1)でComposeを宣言しています。これで0.5の確率で実行されます。
Augmentationの内部をリストを定義しています。

まず、(2)で、水平反転を0.5の確率で実行します。続いて、(3)でブラーを適用します。
ただし、ここでOneOfと呼ばれるどれか一つが適用されるクラスです。

これにより、モーションブラー、メディアンブラー、ブラーのどれかが適用されます。
そして、(4)で、平行移動、スケール、回転を適用します。
最後に(5)でコントラスト変換、輝度変換のどちらかを0.3の確率で適用します。

日本語で書くと長文の説明になりますが、コードで綺麗に記載できます。
後はDataset Classを拡張すれば、実装が可能になります。

特別、ライブラリ依存の実装にはなっていません。
そのため、各DLフレームワークのAugmentationの組み込み方法がわかれば、導入できます。

最後に

PyTorch自体に豊富なライブラリがあって使いやすいと感じています。
非常にコンペティションでは特に使いやすいので興味ある人はぜひ使ってみてください!

私がわかりにくいと思った「Faster RCNN」のポイントの解説

皆さんこんにちは
お元気ですか。ちゃっかりKaggleで物体検出のコンペもはじまりました。

Deep Learningは相変わらず日進月歩で凄まじい勢いで進化しています。
特に画像が顕著ですが、他でも色々と進歩が著しいです。

ところで色々感覚的にやりたいことが理解できるものがありますが、
あまり勉強していなかった分野として物体検出系のアルゴリズムがあります。
所謂、Faster RCNN, SSD, Yolo、最近、Mask R-CNNが該当します。

ただ、今回は、個人的に物体検出のアルゴリズム
なかなか調べても出てこない、あれここどうなってるんだっけ?と思った部分の解説をします。
そのため、案外変なところの解説かもしれません。
Faster RCNNの技術要素から説明しようかなとも思って作りました。

※数式、記号等の細かい説明は論文を参考にしてください。
3/7 15:15 Ancher→Anchorに修正しました

Faster RCNN

Faster RCNNは2015年に発表された論文です。
最近だと特許的な問題でも一時期盛り上がりを見せています。
Deep Learningを利用したEnd to Endで物体検出を
実施したニューラルネットワークです。

https://arxiv.org/pdf/1506.01497.pdf

※特許解説(日本語)
qiita.com

全体構成

Faster RCNNは特徴マップを抽出するConvolutional Layerと物体領域を抽出する
Region Proposal Networkに加え、分類、回帰の結果を出力するネットワークで構成されています。

f:id:tereka:20180303132456p:plain
※論文より引用

Conv Layerで得られた結果をRegion Proposal Networkを使い、領域を抽出し、分類しています。
特に重要なのはRegion Proposal Networkと記載されている部分で
ここが従来手法からのFaster RCNNの改善になる部分です。

Region Proposal Networkは次で説明します。

Region Proposal Network

概要・目的

Region Proposal Networkは画像内から物体領域の候補となる箇所を抽出します。
元々は「Fast RCNN」ではこの物体領域抽出にSelective Searchと呼ばれる手法を使っていたため、
物体候補領域の抽出に時間がかかっていました。
その箇所すらもEnd-to-Endで実施することで従来より高速・精度改善をしています。

全体的には次の処理があります。

  1. 物体の候補領域を見つけるAncherを作成する。
  2. (学習時)誤差を計算する。
  3. 候補の中からNMSなどを実施して、Region Proposal Networkでの物体の候補領域を抽出する。

その中で特に私が不明だった要素をいくつか紹介します。

Anchor

Anchorと呼ばれる領域を生成します。
一言で言えば、物体の領域を示している矩形です。
これらを画像内に一定間隔で生成します。これは後述のLoss Functionで利用されます。

f:id:tereka:20180303132658p:plain

Loss Function

RPN自身を更新するための誤差を計算し、
ニューラルネットワークの全体の誤差と併せて更新します。論文中の式は次の通り。

f:id:tereka:20180306220825p:plain:w300

RPNの誤差は基本的には2つの要素で成り立っています。
①その領域は物体か背景であるか、②どこに領域があるかの領域の位置(詳細)を計算します。
特に私が勉強するまでイメージを持てなかったのは「そもそも教師信号をどうやってこの式に当てはめるのか」です。そもそも与えてるのバウンディングボックスとクラスだけなのですが・・といった疑問です。

教師信号の決め方ですが、物体の有無はAncherと物体のIoU(Intersection over Union)が
0.7(論文中)以上の場合、物体が存在することを示します。(positive anchor)
また、IoUが0.3以下を物体が存在しないこと(negative anchor)を示します。

平たく言ってしまえば、ある程度重なっているAncherに物体が存在するラベルが振られ、
存在しないAncherに物体が存在しないラベルが振られます。
それ以外は学習に貢献しません。

Ancherは回帰を行います。
Ancherのデータの回帰ですが、次の通り計算を行って、スケールの調整を行っています。
(細かい記号は元論文を見てください)
この値からsmooth L1と呼ばれる誤差関数を用いて最適化します。

f:id:tereka:20180306220842p:plain:w300

Non-Maximum Suppression

後処理としてあるのがNon-Maximum Suppression(NMS)です。
これは同じ物体を示している矩形を抽出する手法です。
本手法を利用して、1つの矩形を残し、残りの出力を抑制します。

詳細は次のサイトが詳しいのでこちらに任せます。

meideru.com

これらによって得られた結果に対して、RoI Poolingを行い、分類、回帰を行うネットワークに接続します。

RoI Pooling

RoI Poolingは分類を行う層への入力を固定次元にする役割があります。
物体検出の領域は非常に可変長です。同じ画像から検出された椅子とりんごが同じサイズではないのと
同じようなものです。その得られた領域を次の分類のネットワークで処理するため、
固定次元に縮小する処理を行います。

処理の概要はこちらのサイトがわかりやすいです。

qiita.com

最後に

なんとなく自分が疑問に思った所を中心にまとめてみました。
ちょっとすっきりしました。間違っているところあれば、教えてください。

Jupyter Labのbetaが公開されました。操作性が向上していい感じ!

皆さんこんにちは。
お元気ですか。Advent Calendar執筆して以来、久々です。
今更ですが、あけましておめでとうございます。今年もよろしくお願いいたします。

いつものようにTwitterを見ていると
以前紹介したJupyter Labのbetaがリリースとのことで、次の記事が回ってきました。

blog.jupyter.org

せっかくなのでまた、お試しで使ってみました。

※Alpha版を試した記事はこちら
nonbiri-tereka.hatenablog.com

使ってみた

インストール

インストールは簡単にできます。
condaの場合

conda install -c conda-forge jupyterlab

pipの場合

pip install jupyterlab

起動

起動します。起動方法も簡単です。

jupyter lab

デフォルトの設定であれば、http://localhost:8888/labへアクセスします。
アクセスをすると若干のロードを待ちます。その後、次の画面になります。

f:id:tereka:20180220232302p:plain

過去のと比べてだいぶリッチに進化しており、非常に見やすい感じになっています!

少し触ってみた

早速触ってみました。次の画面は、csvの読み込みやターミナルを表示させた状態です。
alphaの頃はJupyter Notebookでできた操作ができなかったこともあり、正直不便だと思って
Jupyter Labを使っていませんでした。

しかし、操作性が向上し、よりユーザが使えるように進化したなぁといった印象です。
少し恒常的に利用してより便利な機能が使えないか探りたいと思います。

f:id:tereka:20180220233211p:plain

JSONも綺麗に表示ができます。実はVegaやVegaLiteなども対応しているようですが、利用したことはありません。

f:id:tereka:20180220233434p:plain

最後に

便利そうなので、より、使ってみます!