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

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

これからはじめるGo言語(インストールと開発環境構築)

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

久々に別の言語を習得したいと思って勉強をはじめようかと、思いました。
そう、ISUCONでのユーザが多いGo言語です。

Go言語とは

プログラミング言語の一つで、2009年にGoogleで設計された言語です。
この特徴は次の通りです。

1. コンパイルがある言語
2. 実行時の性能が良い。
3. メモリの安全性
4. スレッドレベルでの並列実行

特にWebサーバやCLIツールなどで利用されることが多くなっており、注目度の高い言語の一つです。

golang.org

インストール&サンプル実行

インストール方法

公式から

golang.org

その他
brew install go

また、仮想環境を利用される方は「仮想環境構築」の章の内容を元に構築してください。

サンプル実行

試しにインストールしたgoを実行しましょう。
次のソースコードを「hello.go」で保存してください。

package main

import "fmt"

func main() {
  fmt.Println("hello go!")
}

そして、次のコマンドでgoを実行しましょう。

go run hello.go

仮想環境構築

仮想環境(Pythonだと、pyenv)により複数バージョンのgo言語を管理できます。

インストール

github.com

Macの場合だと次のとおりです。

brew install goenv

次の内容を.bash_profileに書き込み、sourceなどで再読込しましょう。

export PATH="$HOME/.goenv/bin:$PATH"
eval "$(goenv init -)"

goenvでGo言語をインストールする

Go言語のインストールは次の通り。1.11.4はバージョンを示します。

goenv install 1.11.4

因みに、インストール可能なバージョンは次で確認可能です。

go versions

そして、インストールしたバージョンを利用するには、次のコマンドを利用します。

goenv global 1.11.4
goenv rehash

切り替わったかどうかはこのコマンドを使って確認できます。

go version

開発環境構築

Visual Studio CodeVSCode

今回はVSCodeに環境を構築します。
VSCodeが入っていない人は次のサイトよりインストールしましょう。

code.visualstudio.com

Pluginのインストール

goのプラグイン(名前もそのまま)を入れれば、補完機能なども使えるので便利です。

f:id:tereka:20200112112600p:plain
goのプラグイン

VSCodeからは、Terminalで実行するか、もしくは、Pluginの「Code Runner」を使えば、VSCode上で実行できます。

最後に

最近新しい言語を勉強していなかったので新しい気持ちでGoを勉強してみたいと思います。

画像を混ぜ合わせるData Augmentationの紹介

皆さんこんにちは
お元気でしょうか。冬寒いです。いい布団ほしい。

さて、本日は画像を混ぜ合わせる系のData Augmentationを紹介します。(CutOut含む)
画像を回転、拡縮、平行移動させるのはよく知られている手法でしょう。

ただし、CutOut、Mixupを筆頭に、画像のコンテキストそのものに加工したり、混ぜ合わせたりする手法も時折使われるようになってきました。
その手法に関して、本記事では紹介していきます。

Data Augmentationの手法の紹介

CutOut

arxiv.org

有名な手法の一つであるCutOutです。
学習中に正方領域をマスクすることにより、頑強性(robustness)を獲得し、精度が向上しました。
シンプルな手法ではありますが、当時のSoTAを獲得しています。

※実装
github.com

Random Erasing

arxiv.org

画像に対する新規のData Augmentationです。
過学習(Overfitting)の軽減やオクルージョンによる影響を抑えられます。
画像から一定の領域を抽出し、その箇所にランダムで与えた数値で塗りつぶす処理をします。

言葉で説明するよりも、論文にある例を見てもらったほうがわかりやすいと思います。

f:id:tereka:20200104174513p:plain:w500
Random Erasingの例

論文中の実験だとCIFAR-10、CIFAR-100やFashion MNISTでRandom Erasionなしの場合より高いスコアを出しました。

Mixup

arxiv.org

2つの画像を合成して新しいサンプルを作成する手法です。
モデルの学習時にはラベル側も混ぜ合わせる必要があります。
この画像の合成の結果により、正則化の効果が生まれ、かつ、画像の中間も識別できるようになるため、精度が向上すると言われています。
中間の識別は次のイメージです。緑が0, オレンジがクラス1, xが入力された場合(=事前条件)の緑の確率です。
右側がMixupになりますが、徐々に青色がなくなっていく様が見られます。

f:id:tereka:20200105224713p:plain:w400
Mixupのイメージ

※実装
github.com

RICAP

arxiv.org

RICAPの手法の正式名称はrandom image cropping and patchingです。
RICAPはMixupに似ていますが、4枚の画像をくり抜き、合成する方法です。
CutoutやMixupと比較して、RICAPの方が精度が高い結果となりました。

f:id:tereka:20200105225534p:plain:w400
RICAPの画像生成(論文より)

(ただ、個人的にうまくいった覚えはない。)

※実装
github.com

CutMix

arxiv.org

最初に紹介したCutoutの改良版です。
画像を2枚用意し、一つの画像からもう一つの画像へコピーします。
この手法を使うことで、画像分類のみならず、物体検出でも精度向上を達成しました。
従来まで行われていた領域の欠如を行う手法(Random Erasing/Cutout)は学習に必要な情報を削り、非効率になるため、その改善を図ったそうです。

f:id:tereka:20200105230342p:plain:w400
CutMixの例

※実装
github.com

AugMix

arxiv.org

こちらが最近出たData Augmentation手法です。
複数の変換をかけた画像を最後に混ぜ合わせる手法です。
Augmixは学習とテストのデータに異なるときにも精度が伸ばす工夫がされており、未知のデータにも強い方法です。
本手法のイメージは、次の画像を見るとわかりやすいと思います。

f:id:tereka:20200105232907p:plain:w500
AugMixの方式(論文)

※実装
github.com

所感

この手の手法はKaggleの画像コンペでは殆どといっても良いほど利用・検討されるものです。
ImageNetのように、画像中にそれなりに被写体が写っている場合だと一部が異なっていてもそれなりに学習できます。
しかし、判定に一部分しかない場合だと判定するための情報がそのまま欠けてしまいうまく学習できないこともありました。

ドメインによってこの部分は影響するのでデータの特性を見て、適用できるか検討する必要があるでしょう。
AugMixはまだ実験していないので、ちゃんと精度が上がるか検討・実験の余地があります。

最後に

結局のところ、最新がベストではなさそうなので、考えて、試して合うのを見つけましょう。
では。

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