PyTorchを用いたディープラーニング実装の学習方法 (Part 2)

PyTorchを用いて画像処理から自然言語処理など、様々なDeepLearningの実装手法を学習する方法を解説します(Part 2)。( I introduce how to learn PyTorch Implementation for Japanese people).

本シリーズの内容

[1] 機械学習そのものが初心者の方へ
[2] これからPyTorchを学びはじめる方へ
[3] 画像分類の転移学習とファインチューニング
[4] 物体検出(SSD)
[5] セマンティックセグメンテーション(PSPNet)
[6] 姿勢推定(OpenPose)
[7] GANによる画像生成(DCGAN、Self-Attention GAN)
[8] GANによる異常検知(AnoGAN、Efficient GAN)
[9] 自然言語処理による感情分析(Transformer)
[10] 自然言語処理による感情分析(BERT)
[11] 動画分類(3DCNN、ECO)
[12] さらに発展した内容を学びたい方へ

※本記事(Part 2)では、[4]~[8]を解説します
記事1([1]~[3])はこちら

[4] 物体検出(SSD)

前記事では最後に「画像分類の転移学習とファインチューニング」の勉強方法を解説しました。

続いて、物体検出のディープラーニングの実装を学習します。

引き続き、拙著
「つくりながら学ぶ! PyTorchによる発展ディープラーニング」を使用します。

本書の第2章で「物体検出(SSD)」を実装、解説しています。

本書の実装コードは全て以下のGitHubにて公開しています。

物体検出について説明します。画像分類が1枚の画像のクラス(ラベル)を推定する処理であったのに対して、物体検出とは1枚の画像のなかの、どこに何が写っているのかを求める手法です。

以下が物体検出の結果の例です。

(画像内の人と馬が検出されています)

物体検出のアルゴリズムといえば、YOLO(You Only Look Once)系も有名ですが、本書では、SSD(Single Shot Multibox Detector)を実装しながら解説しています。

本書では、ディープラーニングのアルゴリズムは日進月歩で進化し、SOTA(最高性能手法)が頻繁に更新されますが、各タスクに対して様々な手法の土台となっている定番アルゴリズムを実装・解説するように心がけています。

物体検出を実装するにあたり、まずはタスクの全体像を把握することが重要です。ニューラルネットワークそのものだけでなく、その前処理と後処理が存在し、その中間処理としてディープラーニングが存在します。

物体検出(SSD)の流れ

画像検出タスクの全体像を把握した後、実際にSSDのネットワークの構成を、確認します。

そして、SSDのネットワークを大きなモジュールに分解し、各モジュールについて解説しながら、実装します。

SSDのネットワークの各モジュールをひとつずつ解説・実装します

また、本書の第2章では、PyTorchでのディープラーニングの一般的な流れを解説しています。

PyTorchによるディープラーニング実装の基本的な流れは、「前処理、後処理、そしてネットワークモデルの入出力を確認」、「Dataset クラスの作成」、「DataLoaderクラスの作成」、「ネットワークモデルの作成」、「順伝搬(forward)の定義」、「損失関数の定義」、「結合パラメータの最適化手法の設定」、「学習と検証」となります。

本章では上記の手順を、順番に実装しながら身につけていきます。

[5] セマンティックセグメンテーション(PSPNet)

物体検出の次には「セマンティックセグメンテーション」を学習します。

本書の第3章が「セマンティックセグメンテーション(PSPNet)」であり、この内容に基づいて学習を進めます。

セマンティックセグメンテーションとは、ピクセルレベルでの画像分類です。例えば、各ピクセルが「人」なのか、「馬」なのか、「その他」なのか等を、以下のように分類します。

上記のセマンティックセグメンテーションでは、人と馬を完全に綺麗にセグメンテーションできていません。

セマンティックセグメンテーションのディープラーニング学習にはかなりの計算量が必要で、複数台のGPUマシンと数日程度の時間をかけるためです。

本書ではお手軽に各種手法を学ぶために、GPUマシンを数時間しか回していません。そのため、まだまだ学習途中のため、中途半端な性能になっています。

物体検出同様に、セマンティックセグメンテーションでも、まずはタスクの全体像(前処理、ネットワーク処理、後処理)を把握することが重要です。

ディープラーニングのネットワークだけでなく、その前処理と後処理もしっかりと把握して、そのうえでニューラルネットワークを確認します。

本書ではPSPNet(Pyramid Scene Parsing Network)を取り上げ、解説実装します。PSPNetの全体像は次の通りです。

そしてPSPNetを構成する各モジュールを解説、実装します。

PSPNetの各モジュールの説明と実装解説

PSPNetでは
・Pyramid Pooling
・Dilated Convolution
・Residual Network(ResNet)、ResidualBlockPSP
・AuxLoss:Auxiliary Loss(オーグジュリアリ・ロス)

の概念が特に重要となります。

これら概念を実装しながら、重点的に解説しています。

ぜひ上記の内容を押さえ、セマンティックセグメンテーションを実装できるようになってください。

[6] 姿勢推定(OpenPose)

セマンティックセグメンテーションの次は、姿勢推定(Pose Estimation)に取り組みます。

本書の「第4章 姿勢推定(OpenPose)」で姿勢推定のアルゴリズムについて解説・実装しています。

本書ではOpenPoseと呼ばれる姿勢推定技術を実装しながら、解説します。OpenPoseはとても有名なので、多くの方はその名前を聞いたことがあるかもしれません。

OpenPoseは3つ段階的に進化してきていますが、本書では一番最初のバージョンを取り扱います(進化した2つのバージョンも、最初のバージョンを押さえれば理解は簡単です)。

はじめに姿勢推定タスクの全体像について図で解説します。

姿勢推定の結果(左)と推論している内容(右)

姿勢推定では画像内の人物の骨格像を描画することができます。骨格を描画するにあたり、例えば、左肘はどのピクセルなのか、そして左肩はどのピクセルなのか等を求めます。

こうして人体の18個の特徴的な関節に対応するピクセルを求めたあと、PAFs(Part Affinity Fields)を求めます。PAFsは各関節点がつながっているリンクとなるピクセルを求める手法です。

左肘と左手首をつなぐPAFs(右下)

PAFsという概念が必要になるのは、1枚の画像には複数の人物が写っている可能性が多いにあるからです。

上記の画像でも、バッターとキャッチャーの二人がメインで写っており、それぞれの左肘と左手首があります。

OpenPoseは、基本的にはセマンティックセグメンテーションの延長線上にあります

例えば、左肘というクラスのピクセルを、セマンティックセグメンテーション的(あくまで的に)に推論します。

すると、二人以上の人物が写っていると、複数の左肘の位置情報、および左肘の位置情報(ピクセル)が求まります。

そのため複数人の姿勢を推定するには、どの左肘と、どの左手首がそれぞれつながるのかの情報が必要です。

その情報こそが、PAFsとなります。

本章も最初に姿勢推定タスクの概要とOpenPoseネットワークの概要を確認します。

姿勢推定タスクの概要
OpnePoseのネットワーク概要

そして、各モジュールを実装しながら解説します。

OpenPoseでの学習には、データセットとしてMS COCOを使用します。OpenPoseの学習には膨大な計算量が必要となります。

一方で一度学習すれば様々な場面で使用できます。なぜなら人の姿勢推定というのは、それを取り巻くビジネス課題には依存しないことが多いからです。

そのため、本書では学習については、その雰囲気を把握するに留めています。

そして推論について、
・関節点のピクセルの求め方
・PAFsの求め方
・PAFsから各リンクの求め方

を実装しながら解説します。

以上で画像系のディープラーニングは一通り完了です。

これらのアルゴリズム(画像分類の転移学習、物体検出、セマンティックセグメンテーション、姿勢推定)を理解し、実装できるようになれば、画像系ディープラーニングの基礎力としては十分です。

[7] GANによる画像生成(DCGAN、Self-Attention GAN)

続いて、GAN(Generative Adversarial Network)、日本語では、敵対的生成ネットワークと呼ばれる概念を学びましょう。

本書の第5章 では「GANによる画像生成(DCGAN、Self-Attention GAN)」を解説し、第6章では「GANによる異常検知(AnoGAN、Efficient GAN)」を解説しています。

これらのディープラーニング手法を理解し、実装できるようになればGANの基礎力が十分に身につきます。

本書ではまず最もベーシックなGANである、DCGANを解説・実装します。

本書では手書き数字(MNIST)を学習データに使用し、学習データにはない架空の手書き数字の画像を生成させます。

GANを用いることで架空画像を生成することができることは、多くの方がご存知かもしれません。
また、その際に生成器(Generator)と識別器(Discriminator)の2つのネットワークを利用することも有名です。

ですがより踏み込んで、「どのようにして架空画像が生成されるのか、またその際に使用される技術が何か?」については理解されていない方が多いです。

ここでは、
・GANでの学習の流れ
・GANの生成器と識別器のネットワークの具体的な形
・GANの損失関数の内容と工夫
・GANの重要要素であるLeakyReLU
・GANの重要要素である転置畳み込み(ConvTranspose2d)

を理解することが重要です。

本書の5.1節、5.2節でこれらについて実装しながら、解説しています。ぜひ上記のポイントを押さえてください。

続いて、発展的なGANのひとつである「Self-Attention GAN」について、解説、実装を行います。

Self-Attentionと呼ばれる技術を用いたGANですが、Self-Attentionは最近のディープラーニングの様々な手法(とくに自然言語処理のTransformerやBERT)で重要な技術です。

Self-Attentionは、畳み込み層(Convolution)では考慮しづらい、大域的な情報を、全結合層(Fully Connected layer)よりも、少ない計算量で効率的に処理することができます。

ぜひSelf-Attentionの仕組みを理解してください。

またその他にSelf-Attention GANを理解するために重要な概念として、pointwise convolutionを取り上げ解説、実装します。

pointwise convolutionはただの1×1サイズのフィルタを用いた畳み込み層(Convolution)です。ですが、それが主成分分析のような、チャネル間の情報圧縮の役割を果たします(そして主成分分析と異なり、非線形性のある情報圧縮となります)。

このpointwise convolutionについても、その概念をしっかりと理解し、実装できるようになることが重要です。

その他に、Self-Attention GANでは、Spectral Normalizationと呼ばれる技術も使用されます。Spectral Normalizationは、畳み込み層などのネットワークの重みパラメータを規格化する操作です。

規格化操作と聞くと、バッチノーマライゼーションが有名ですが、バッチノーマライゼーションがネットワークを流れるデータの大きさを規格化するのに対して、Spectral Normalizationはネットワークの重みそのものを、規格化します。
Spectral NormalizationはGANでは非常に重要な技術ですが、理解するにはしっかりとした線形代数のスキルが必要となります。

まずは雰囲気でよいので、Spectral Normalizationについても理解を試みてください。

最後にSelf-Attention GANで学習と画像生成を実施します。

以下のようにSelf-Attentionがどのようにかかって画像が生成されたのか、画像生成時に着目されたピクセルを可視化することもできます。

[8] GANによる異常検知(AnoGAN、Efficient GAN)

本ブログの最後の章です。
続いて、GANを用いた異常画像の検知について2つのアルゴリズムを理解し、実装できるスキルを身につけましょう。

異常画像の検知においてビジネス的に問題となる点は、「異常画像を大量に集めることは困難・・・」ということです。異常が生じるのは稀なので、異常画像が収集しづらく、クラス分類で正常、異常と2クラスで分類するだけの異常画像を集めることが困難です。

このようなときには、正常画像のみを学習データに使用し、正常画像を作成するGANを学習させます。

そして、”正常か異常かを確かめたい画像”に対して、学習した生成器Generatorで、可能な限り、元と同じ画像を生成できる、そんな「入力ノイズ」を求めます。

そして求めた入力ノイズを生成器に入力して画像を生成し、元の異常判定したかった画像との差を比べます。

この再構成時の差が小さければ、正常画像の生成器でうまく判定対象の画像を生成できたことになるので、この画像は正常です。

一方で、可能な限り元の画像を生成できるノイズを求めたにも関わらず、元と似た画像が生成できなければ、正常画像の生成器でうまく生成できないことにあるので、異常画像である、と推定できます。

本書の第6章ではこのような異常画像検知のGAN技術として、「AnoGAN」「Efficient GAN」を解説・実装します。

両者ともに、その仕組みは上記で説明した通りです。ただし2つのアルゴリズムでは、「判定したい画像を生成する尤もらしい入力ノイズの求め方」が異なります。

AnoGANはこの入力ノイズを最小二乗法(ちっく)に求めるため、推論に時間がかかります。

Efficient GANでは、生成器と識別器に加え、Encoderと呼ばれるディープラーニングモデルをGAN内で同時に学習させます。

Encoderは入力が対象画像、出力が画像を再構成するために生成器に入力するノイズとなります。AnoGANではEfficientGANとは異なり、生成器に入力するノイズを短時間に求めることができます。

「7と8の手書き数字画像を生成できるGAN」に、2の画像をいれたときには、再構成できない例

以上が、GANを用いた異常画像検知のメカニズムです。書籍では詳細説明と実装の流れを解説しているので、ぜひ書籍を読み、実際に実装してみて、画像の異常検知ができるスキルを身につけてください。

画像の異常検知は製品の部品の検品など、実世界でもニーズの高い分野であり、学ぶ価値もとても高いです。

以上、本記事では、
[4] 物体検出(SSD)
[5] セマンティックセグメンテーション(PSPNet)
[6] 姿勢推定(OpenPose)
[7] GANによる画像生成(DCGAN、Self-Attention GAN)
[8] GANによる異常検知(AnoGAN、Efficient GAN)
について、解説しました。

記事も長くなってきたので、以降の
[9] 自然言語処理による感情分析(Transformer)
[10] 自然言語処理による感情分析(BERT)
[11] 動画分類(3DCNN、ECO)
[12] さらに発展した内容を学びたい方へ
を、最後に次の記事で解説します。

⇒⇒その3へ進む

https://www.amazon.co.jp/dp/4839970254/

--

--

小川 雄太郎(電通国際情報サービスISID)
PyTorch
Writer for

電通国際情報サービス(通称ISID)、AIトランスフォーメーションセンターに所属。AI系の研究・開発、コンサル、アジャイルでのソフトウェア開発に従事。Datascientist at Dentsu-ISID, Ltd. GitHub: https://github.com/YutaroOgawa/about_me