Deep LearningのためのPython APIライブラリの紹介



 近年の急激なコンピュータ技術の発達により人口知能(AI)技術がロボットや自動車の安全運転、スマホによる自然言語や音声の認識、フィンテック、さらには、セキュリティ・システムやIoTのインフラ技術などに応用されるようになってきました。人工知能(AI)技術の基礎は深層学習(deep learning)と言われる分野での研究開発に多くを負っています。深層学習も機械学習(machine learning)の一つの分野であり、または大量のデータを用いてパラメータの学習をするという意味では、データサイエンスと呼ばれている分野における研究にも属します。

 ディープラーニングの多くのフレームワークはPython及びC++で記述されています。ニューラルネットワークの基本的構造とその実装を理解するための言語としてはPythonが理解できれば十分でしょう。そういう意味では、この領域において必須のプログラミング言語はPythonです。Anacondaのような一括インストーラーを用いてPython3がセットアップ済みであることを前提とします。LinuxやC言語の知識は想定していません。このページではCPUを搭載した普通のPCを使用することを前提にしています。OSはLinuxでも、MacOSでもWindowsでも、Python環境がインストールされていれば十分です。

  このページでは、DNNを用いた画像識別(image classifier)と一般物体検出(object detection)のpython ライブラリを代表する、YOLO、SSD、R-CNN、Caffe、Segnetなどについて概括的な説明を行います。Pythonの機械学習用のライブラリであるScikit-learnを用いた機械学習アルゴリズムの実装については、Scikit-Learnを用いたCNNの実装のページを参照ください。なお、ここで説明されるライブラリやソフトウエア技術は、基本的に、ソースコードが公開されているOSS(MIT ライセンスあるいはGPLライセンス契約)に属しています。

Last updated: 2019.4.6


**************************************************************
画像識別のPython APIライブラリ:Image Classifier
**************************************************************


 Deep Learningを基礎とする画像識別や音声認識のPython APIライブラリの種類と特徴について大まかに説明します。それぞれのライブラリの活用方法については、それらに対応するページを参照ください。

 2012年開催された大規模画像認識のコンペILSVRC(ImageNet Large Scale Visual Recognition Challenge) でAlexNetが圧倒的な成績で優勝して以来、ディープラーニングの手法(CNN)が画像認識での主役に躍り出ました。 2014年に開催されたILSVRCでの優勝者はGoogLeNetでした。GoogLeNetは複雑に見える構成ですが、基本的には、AlexNetのようなCNNと本質的には同じです。ただ、GoogLeNetには、縦方向に深さがあるだけでなく、横方向にも深さがあるという点で異なっています。横方向の幅はinception構造と呼ばれています(Inceptionモデルと呼ばれます) 。
 このとき、VGGは2位の成績に終わりましたが、シンプルな構成なので応用面ではよく使用されます。ちなみに、VGGでは、3x3のフィルターによる畳み込み層を2回から4回連続して、プーリング層でサイズを半分にするという処理を繰り返します。重みのある層を16層にしたモデルをVGG16、19層にしたものをVGG19と呼んでいます。
  2015年のILSVRCでの優勝者はResNetで、Microsoftのチームによって開発されたニューラルネットワークでした。その特徴は、層を深くしすぎると過学習などの問題が起きるのを回避するために、スキップ構造(ショートカット)と呼ばる概念を導入した点です。ResNetは、VGGのネットワークをベースにして、スキップ構造を取り入れて、層を深くしています。具体的には、畳み込み層を2層おきにスキップしてつなぎ、層を150層以上まで深くしています。ILSVRCのコンペでは、誤認識率が3.5%という驚異的な成果を出しています。

   以上のVGG16,19、Inception_v3、ResNetがディープラーニングの代表的なネットワーク・モデルとなっています。最近では、これらのモデルを改善した(YOLO、R-CSNN、SSDなどの)モデルも登場しています。また、こうしたモデルを組み込んだディープラーニング向けのライブラリ、例えば、Tensorflow、Theano、Keras、Pytorch、Chainer、CNTKなどのPython APIが充実してきました。

 TensoflowはGoogleが開発し、Apache License 2.0の下で公開されています。Theanoは、モントリオール大学のBengio教授の研究室(Montreal Institute for Learning Algorithms )を中心として開発されています。TheanoはBSD licenseの下でのオープンソースです。TensorFlowの実装ついては、Tensorflowを使ってObject Detectionに説明があります。

 Tensorflowやtheanoをbackendとして活用するライブイラリの代表的なものはKerasです。Kerasは当初プロジェクトONEIROS (Open-ended Neuro-Electronic Intelligent Robot Operating System) の研究の一環として開発されました。近年にGoogleのチームも加わって、 MIT License の下で公開されています。Kerasを活用すれば、簡単な入力でCNNモデルを構築したり、それを学習させることも容易にできます。VGG16、Inception_v3、ResNetなどのCNNモデルがモジュールとして組み込まれているので、自分でモデルを一から構築する必要がありません。ImageNetのデータを用いて学習した学習済みモデルも用意されていますので、訓練用のデータも必要ありません。実際の運用については、Kerasを使ってdeep-learningに説明があります。

 PyTorch はディープラーニングを実装する際に用いられるディープラーニング用ライブラリのPython APIの一つで、もともとは、Torch7と呼ばれるLua言語で書かれたライブラリでした。PyTorchは、このTorch7とPreferred Networks社のChainerをベースに2017年2月に作られたPython用ライブラリで、 オープンソースです。Chainerは日本のPreferred Networks社が開発したライブラリですが、国際的認知度ではマイナーです。Pytorchの実装については、Pytorchを使ってObject Detectionのページに説明があります。

 上記のPython API ライブラリーの性質とはかなり異なりますが、Caffeと呼ばれるディープラーングのフレームワークがあります。Caffeはカリフォルニア大学バークレー校の研究グループがC++を用いて開発したフレームワークです。ホームページは、 http://caffe.berkeleyvision.org/にあります。 現在では、Berkeley Vision and Learning Center(BVLC)を中心として、コミュニティの研究者たちがGitHub上で開発を重ねています。Caffeには「Model Zoo」という学習済みのモデルを配布するライブラリーがあります。Deep LearningではCNNのパラメータをゼロから学習することが難題となりますが、Model Zooを用いることでこの難題を避けることができます。最近、FacebookがCaffeの軽量バージョンとしてCaffe2をオープンソース・ソフトウエア型式で公開しました。Caffe2のすべての機能を活用することはまだ出来ていませんが、初歩的な部分は利用可能です。Caffe2の実装についての具体的な説明は、Caffe2の実装事例のページを参照してください。

 なお、ディープラーング向けの代表的なPython APIは、Googleが公開したImage Recognition APIです。GoogleのImage Recognitionサイトで公開されています。この中のTensorflowはOSに依存せず、インストールできます。Windows、Linux、Mac OSをサポートしています。Microsoftが公開しているcognitive-toolkitのサイトは、Microsoft/CNTKです。WindowsとLinuxをサポートしています。公式には、Mac OSをサポートしていません。

   

******************************************************************************
画像認識と一般物体検出のPython APIライブラリ: Object Detection
******************************************************************************


 自動車の自動運転を実現するためには、センサーから入手したデータから一般物体(人間、車、歩道、樹木など)の検出を可能とするソフトウエアが必要です。コンピュータビジョンの分野における物体検出(Object Detection)とは、ある画像の中から定められた物体の位置とカテゴリー(クラス)を検出することを指します。物体検出の問題は、性質のわからない、数が不明な物体をビデオ画像やカメラ画像から特定するという問題になります。だから、画像からの物体検出は、同時に2つの問題を解決する必要があります。画像の特定の領域が物体であるかどうかを判断し、どの物体であるかを調べる。後者の部分は画像分類にあたるので、上で取り扱ってきた画像識別のモデルを使えば解決できます。が、前者の部分と後者の部分を同時に解決するためには新しいモデルが必要です。

 一般的に画像認識のタスクは以下のように大きく3つに分類されます。

Classification : 各画像ごとにラベルの分類
Object Detection : 画像内で検出された各物体領域ごとにラベルの分類
Segmentation : 画像内の各pixelごとにラベルの分類 (Semantic or Instance)

各タスクごとに用いられるデータセットや指標、そしてアルゴリズムはまったく異なります。Classificationでよく利用されるデータセットはMNISTデータセットやImageNetの画像セット、Kaggleのイメージ画像などですが、物体検出の精度の比較によく用いられているデータセットは PASCAL VOC2007 と PASCAL VOC2012 、あるいは、別の年度の PASCAL VOC や COCO などのデータセットです。また、物体検出の分野で重要とされている指標は、mAP (mean Average Precision) と FPS (Frame Per Second) です。つまり、物体検出精度と処理速度です。

 一方、物体検出アルゴリズムは

Region Proposal : 物体らしい箇所を検出
Classification : 検出箇所のラベル分類
Bounding Box Regression : 正確な物体を囲う位置座標を推定

というRegion Proposal, Classification, Bounding Box Regression の 3 phase に大きく別れています。   

 Deep Learning(CNN)を応用した一般物体検出アルゴリズムで代表的なものとしては、3種類挙げられます。
R-CNN (Regions with CNN features)の発展系Faster R-CNN、
YOLO(You Only Look Once)、
SSD: Single Shot MultiBox Detector

に大別できます。

 また、Facebookの研究チームであるFacebook AI Research(FAIR)が物体検出ライブラリであるDetectronをオープンソースとして公開しました(2017年1月)。FacebookのrepositoryはDetectronのGithubサイトにあります。Detectronはディープラーニング向けライブラリのCaffeを基礎としています。GPU+Linux+Python2を必要とします。Caffe系のライブラリはAnacondaでインスットールしたPython3では正常に作動しません。

   Faster R-CNN、YOLO(You Only Look Once)、SSD: Single Shot MultiBox Detector などのアルゴリズムを実装したpythonライブラリーが利用可能となっています。Tensorflowを用いた物体検出問題に対するPython実装については、Tensorflowで物体検出のページを参照してください。また、Pytorchを用いたYOLOアルゴリズム(darknet)のPython実装については、Pytorchで物体検出のページを見て下さい。

  なお、Caffeを基礎とする一般物体検出ソフトのフレームワークの一つにSegNetと呼ばれるCNNがあります。SegNetはケンブリッジ大学の研究グループが2015年に開発した畳み込みニューラルネットワークです。論文は( Vijay Badrinarayanan, Alex Kendall, Roberto Cipolla,「SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation」)、ホームページは
http://mi.eng.cam.ac.uk/projects/segnet/になります。

このホームページにwebdemoが掲載されていますので、自分の写真をアップして物体検出を実行してみると面白いです。自動車から撮影された動画実例と検出結果もアップされています。楽しんで見てください。
 
  SegNetは以下に示すような畳み込みニューラルネットワークの構造を持っています。  
segnet.png
左側の画像は自動車のカメラで撮影された画像で、これが入力画像としてニューラルネットワークでセグメンテーション処理されて出力された結果が右側の画像になります。SegNetの基礎になっているフレームワークはCaffeと呼ばれるCNNなので、Caffeが正常に作動しないPCでは十全に機能しません。注意が必要です。

********* 続く ***********

Keras + Tensorflowを用いたDeep Learningのページへ


トップページへ