2019/11/27 update
どうも、ディープなクラゲです。
今回から「OpenVINO™ でゼロから学ぶディープラーニング推論」シリーズを掲載してゆきます!
このシリーズは、ディープラーニング概要、OpenVINO™ツールキット、Neural Compute Stick、RaspberryPiの使い方、Pythonプログラミングをゼロから徹底的に学び、成果としてディープラーニング推論アプリケーションが理解して作れるようになることを目指します。
今回は、どのような環境が必要なのか? ディープラーニングとは? OpenVINO™ツールキットとは? について説明します!
本シリーズでは全9回(予定)の記事を通して、Neural Compute StickとOpenVINO™ツールキットを使ったディープラーニング推論のプログラミングについて、徹底的に詳しく解説します。
さて、気になるのはこのシリーズに付き合うと一体何ができるのか?ということだと思います。
「結局、mnistやって終わりかよ!」では意味がありません。
※ちなみにmnist(エム二スト)とはディープラーニングのHello, worldです。
こちらの動画を見て下さい
動画に映っているアプリと同じものが理解して作れるようになります。
主に以下の3つのステップで順にアプリを作り上げます。
サーバーなどは一切使わず、カメラを使ってリアルタイムにディープラーニング推論を行っているのが特徴です。
このようなアプリを作ることにより、ディープラーニングでは何が得られて、どのくらいの精度なのかが身をもって体感できます。書籍や講義では得られない、「ディープラーニングで出来ること/出来ないこと」を感じ取りましょう!
本シリーズは主に以下のハードウェアを前提としてサンプルコードや解説を作成していますが、実はPCさえあれば出来る場合があります。詳細は後述します。
また、ソフトウェアとしてはOpenVINO™ツールキットを必要としますが、無償でダウンロードしインストールすることが可能です。特に有料版のようなものはなく、動作や機能に制限はありません。
なお、本シリーズの全コンテンツは完全無料で閲覧可能です。つまり、必要なハードウェアさえ揃っていれば、無料ですぐにでもディープラーニング推論できるということです!
本シリーズではディープラーニング推論のプログラミングを行います。最低限、PCの一般的な操作やキーボードでタイピング出来ることが必須となります。これまでに何らかのプログラミング言語を使って初級レベルでコードを作成した経験があることが望ましいですが、初心者の方向けにも丁寧に説明しますので、安心してください。
その他、数学的な知識や、データサイエンス・機械学習の知識、RaspberryPiの使い方などを知らなくても大丈夫です。
ディープラーニングの種類として主に以下4つが挙げられます。これらはディープラーニングのネットワークと呼ばれるものです。「ネットワーク」とは「手法」という意味で捉えておけばOKです。
それぞれのネットワークは得意な領域が異なります。特徴を以下に記します。
音声認識や外国語の翻訳などを処理します。数年前にGoogole翻訳が飛躍的に向上したのはディープラーニングによるためと言われています。RNNの進化版としてLSTMというネットワークも有名です。RNNやLSTMは他にも株価予測や売上予測など時系列データの予測にも使われています。
強化学習とは簡単にいうと、赤ちゃんが成長するように学習する技術です。赤ちゃんは限られた環境の中で様々な動きにチャレンジして成功と失敗を繰り返して、だんだんと学習してゆきます。強化学習の代表例はGoogleが開発し、世界ランク一位のプロ囲碁棋士を破ったAlphaGo(アルファ碁)です。クルマやドローンなどの自動運転技術にも使われています。
ここで言う画像生成とは、画像の特徴を捉えて、似たような画像を作り出すものです。
例えば、猫の画像をゴッホ風にしたり、テキストから画像生成を行うということが出来ます。また最近では架空の顔や人物を作り出すことが可能となり、本物の写真か、生成された画像なのかの見分けがつかなくなるくらいに性能が向上しています。
ディープラーニングで最も精度が高いのが画像認識です。画像認識はコンピュータビジョン、つまりロボットの目とも呼ばれています。既に人間の目の精度を超えたとされています。既に工場の目視検査や医療の画像診断などに活用されています。また小売り業や自動運転にも欠かせない技術になりつつあります。
本シリーズでは、この画像認識を取り扱います
さらにディープラーニング画像認識にも、大きく分けて3つの種類があります
それぞれについて具体的に解説します
「何」であるかを推測する技術です。
例えば、猫なのか犬なのか人間なのかを判別することができます。
「何」が「どこ」にあるかを推測する技術です。
例えば、人や道路の位置やおおよその領域を検出することができます
ピクセル単位で、領域を分けることができる技術です。単に物体検出の精度が上がっただけでなく、「どういう状況なのか」までを把握することができるようになります。主に自動運転に活用されています。
下図はイメージですが、横断歩道の上にスマートフォンを持った人ということが分かれば、「歩きスマホで危険だ」と状況判断できます。
このように画像認識技術は進化していて、「画像分類」→「物体検出」→「セグメンテーション」の順でコンピューターの計算負荷が増え、処理時間も増えることになります。
本シリーズでは「画像分類」と「物体検出」そして両者の組合せを取り扱います。なお「セグメンテーション」については、OpenVINO™ツールキットのサンプルモデルにもありますので、本シリーズを修了した後に、そちらを実行してみることをお勧めします。
ディープラーニングのフェーズは主に2つに分かれます
「学習」は英単語だと'learning'ですが、'trainning'という単語も良く使われます。
AIはある程度テンプレートのようなものがあり、初めに人間がどれを使うかを選択します。しかし、最初の時点では全く学習できていないため、データに対してデタラメな予測しかできません。
AIに大量のデータを与え予測させ、正解値との誤差を出し、誤差が小さくなるようにAIにフィードバックして調整します。これを繰り返すことにより、最初はデタラメだった予測値がだんだんと正解値に近づいてゆきます。
イメージですが、図で描くとこのような感じです
1度で終わりではなく、誤差が収束するまで何度も繰り返します。
学習フェーズでは、予測結果を出して終わりではなく、「大量データ」「誤差をフィードバックして改善」「何度も繰り返す」という項目があるため、非常に処理時間がかかります。
「推論」とは予測するという意味に近いです。英単語だと 'inference' や 'predict' などが良く使われます。
推論フェーズは非常にシンプルです。学習フェーズで完成したAIに対し、データを入力し、予測結果をもらうだけです。
左から右へ1回流せば完了です。
「大量データ」「誤差をフィードバックして改善」「何度も繰り返す」という項目はないため、処理時間が軽いことが分かると思います。
AIの中身は何が入っているのでしょうか?
よく「人間の脳の神経細胞(ニューロン)の仕組みを模した構造」などと説明されますが、一切忘れて下さい。この表現だと、AIがとても高度で崇高な技術であると錯覚してしまいます。
AIはただコンピュータがひたすら計算を行っているだけです。AIに必要な計算機には、生物的なICや脳の構造のような回路が入っている訳でもありません。計算の処理の仕方が脳の伝達っぽいというだけのことです。皆さんがお持ちの普通のパソコンやスマホでもAIは出来ます。
(ただし、ひたすら計算を行うため、コンピュータのスペックが低いとひたすら時間がかかってしまいます)
さて、ひたすら計算を行っているだけのAIですが、中身を大きく2つに分けると「モデル」と「重み」に分かれます
これだけだと何だか分からないと思いますので、イメージで説明します。
AIを学習させるにはデータが必要です。例えば、横軸が勤続年数で縦軸が年収というデータをグラフに表示したとします。
最初は人間がテンプレートを選びます。例えば y = ax + b
という一次関数の直線を採用したとします。この直線そのものがモデルで、直線の傾きa
と切片b
が重みです。
先程のデータと直線の誤差が緑の棒です。最初の3点はほぼ合ってますが、中盤から後半にかけては結構誤差があります。これが小さくなるように重みa
とb
を調整するのが学習フェーズです。
この例では、「勤続年数」という1つの次元しかありませんでしたが、実際には「業界」「職種」「性別」・・・など数多くの次元が必要でしょう。そして次元が大きくなると1次関数や2次関数といった簡単なモデルでは表現できなくなり、ディープなモデルが必要になります。また大量のデータも必要になってきます。
簡易的なイメージでAIの中身について説明しましたが、「AIとはモデルと重みである」ということが理解できればOKです。なお、学習が完了した「モデルと重み」のことを「学習済みモデル」と呼びます。
公式ページを見ると色々と書いてありますが、クラゲ視点でわかりやすく初心者向けにまとめます。
無料でダウンロードとインストールができるだけでなく、全機能を制限なく使うことができます。期間限定、有料版、広告表示などもありません。商用利用も含めて無償です。
2018年9月にリリースされ、何度かバージョンアップされており、安定しています。
ディープラーニングの実行環境として「クラウドコンピューティング」と「エッジコンピューティング」の2つに大きく分かれます。
「クラウドコンピューティング」はクラウド側でディープラーニングを実行することを指します。ある程度までは無料で使える場合がありますが、期間やデータ上限などを超えると有料になるケースがほとんどです。また、カメラで撮った写真をアップロードして推論することは出来ますが、カメラ映像をリアルタイムに推論することは困難です。
OpenVINO™ツールキットはクラウドを使用しない「エッジコンピューティング」です。カメラ映像をリアルタイムに推論することも可能ですし、データをネット上にアップしないので、通信料ゼロでセキュリティ的にも安心感があります。
OpenVINO™ツールキットには以下のツールやライブラリ、サンプルが入っています。
Inference Engineは、推論エンジンのことで、プログラミングで呼び出して使います。
Model Optimizerはモデル変換ツールです。後ほど説明します。RaspberryPiのOpenVINO™ツールキットにはModel Optimizerは含まれません。
OpenCV, OpenVXはコンピュータビジョンライブラリです。本シリーズではOpenCVを使います。OpenCVはカメラ映像の入出力、文字や図形描画、ちょっとした画像処理などに使います。RaspberryPiのOpenVINO™ツールキットにはOpenVXは含まれません。
Sample Applicationsは、サンプルアプリやソースコードです。非常にたくさんあります。
OpenVINO™ツールキットでは「ディープラーニング推論」を取り扱います。
言い換えると「ディープラーニング学習」は出来ないということです。
学習させるにはディープラーニング用の「フレームワーク」を使って行う必要がありますが、学習は必須ではありません。実は、ディープラーニングに関わる技術は様々なものが無料で公開されています。フレームワークもそうですが、画像を処理するためのライブラリ、学習するための大量データ、モデル、そして「学習済みモデル」もたくさん公開されています。本サイトでは豊富にある「学習済みモデル」を活用します。
ディープラーニングには「RNN」「DQN」「GAN」「CNN」などがあります。OpenVINO™ツールキットで主に対応しているのは「CNN」です。
「モデル」は様々な「レイヤー」というもので構成されており、OpenVINO™ツールキットのバージョンアップと共に対応レイヤーが増えています。またプロセッサによっても対応レイヤーが異なるので注意してください。詳細は以下のウェブサイトを参照して下さい。
Supported Framework Layers
Processor vs Supported Layers
OpenVINO™で推論実行可能な「学習済みモデル」はIR(Intermediate Representation)という形式のみです。IRは2つのファイルで、それぞれ xml
とbin
の拡張子です。
他の学習済みモデルの形式の場合は、OpenVINO™ツールキットに入っているModel Optimizerを使ってIRに変換します。
Model Optimizerが対応している「学習済みモデル」の形式は以下の通りです。
フレームワークはPyTorch, Chainer, NNC(Neural Network Console)など、他にも多数ありますが、ディープラーニングの共通フォーマットである「ONNX」形式で出力することにより、OpenVINO™で扱うことが可能です。
対応OSです。
対応OSバージョンと対応プロセッサもご確認ください。詳細はGET STARTEDの各OSに対する要求システムが書いてある箇所をチェックして下さい。なお、RasapberryPiで開発する場合はOSを気にする必要はありません。
プロセッサについては以下で説明します。
プロセッサとは主に以下のようなものを指します。
CPU, GPU, FPGAは一般的な名称なので説明は割愛しますが、VPUだけ軽く説明すると、"Vision Processing Unit"の略で、現状だと"Neural Compute Stick"と"Neural Compute Stick2"の2つのことを指します。なお、VPU
ではなく MYRIAD
という表現を使う場合もあります。Myriad™ は中に入っているチップの名称です。
OpenVINO™ツールキットは様々なプロセッサに対応していますが、インテル製の比較的新しいものに限られますので注意して下さい。インテルCPUには Xeon, Core, Pentium, Celeron, Atomなどがあります。
ちなみに、"Development Environment Installation Guides"には、CeleronやAtomの記述がないですが、LinuxOSでApollo Lake世代以降であれば動作できるようです。
なお、RasapberryPiで開発する場合はプロセッサを気にする必要はありません。
Raspberry PiのCPUはARMであり、インテル製ではありません。
そのままではOpenVINO™のInference Engineを動作させることができませんが、Neural Compute Stickを挿して使うことにより動作可能になります。
なお、Raspberry PiのOS "Raspbian" はOpenVINO™ツールキットに対応しています。
OpenVINO™を使った開発手法は、たくさんのバリエーションがあるため、初心者は迷ってしまいます。そこでグラゲがバシッと開発方針を決めます!
OpenVINO™ツールキットを使う開発環境として、主に以下の3通りが考えられます。
環境1に関しては、お持ちのPCが先程の対応環境に該当していることを確認してください。
環境2に関しては、お持ちのPCのCPUがx86系64bitでOSがUbuntu16.04もしくはWindows10が対象です。詳細はこちらをご確認ください
環境3に関しては、お持ちのPCのスペックは問いません(SDカードにデータ書き込みできればOK)
Raspberry Piであれば、気兼ねなくインストールできることと、実証実験しやすいというメリットがあるため、本サイトでは 環境3 の "PC + RaspberryPi + Neural Compute Stick"という開発環境をベースに解説を進めてゆきます。 具体的にどこで何を購入すれば良いかは次回説明します。
※ただし、環境2の場合だとしても本サイトのコードそのままでいけると思いますし、環境1の場合だとしても少しだけコード変更すればいけるかと思います。
OpenVINO™ツールキットでディープラーニング推論を行う方法として3つあります
推論手法 | フレームワークで学習 | Model Optimizerで変換 |
---|---|---|
1. Original Model | 必要 | 必要 |
2. Public Model | - | 必要 |
3. Pre-Trained Model | - | - |
1はTensorflowやCaffeなどのフレームワークを使って事前に学習させる必要があり、初心者にとっては非常に学習コストが高いです。2や3でディープラーニングに慣れてからこちらに進むことを推奨します。
2のパブリックな学習済みモデルは、一般的に公開されている学習済みモデルのことです。例えば、GoogLeNet、SqueezeNet、SSDやYoloなどです。詳細はこちらを参照して下さい。
1と2はModel Optimizerを使っての変換が必要となります。3で推論に慣れてから行うと良いと思います。
3のインテル学習済みモデルは、いきなりプログラミングで取り込んで使うことができます。
人の姿、顔のパーツ、クルマ、バイク、歩行者などを対象とした、実用的な学習済みモデルがたくさん用意されています。ジャンルとしては、Retail系(小売りや屋内向け)、Adas系(自動運転向け)、Barrier系(セキュリティカメラ向け)などがあります。詳細はこちらを参照してください。
結論として、本サイトでは 3のインテルの学習済みモデルを使った推論を使って解説します。
OpenVINO™ツールキットでプログラミングを行う手法として3つ挙げます
推論はOpenVINO™ツールキットのInference Engineを呼び出して使いますが、1,2はそのまま呼び出す方法で、3はOpenCVを経由して呼び出す方法です。"OpenCVのDNNを使ったC++"も可能ですが、ほぼメリットがないので割愛します。
1,2は推論エンジン呼び出しにはOpenCVを使いませんが、それ以外の処理ではOpenCVを活用します。
それぞれの特徴を表にまとめました
プログラミング手法 | 機能・性能 | コードのシンプルさ | 実行のお手軽さ | サンプル例 |
---|---|---|---|---|
1. C++ | ◎高い | △やや複雑 | △ビルド必要 | ◎多い |
2. Python | 〇 | 〇 | 〇 | 〇 |
3. Python with OpenCV DNN | ×制限あり | 〇+ | 〇 | △少ない |
1は中級者以上の方向けです。普段からC++を使いこなしている方はこれがベストです。
2は最も安定しており、デメリットがありません。
3は「×制限あり」のデメリットがあります。具体的には、非同期推論が出来なかったり、まだバグがある点です。これは今後のOpenCVのバージョンアップに期待したいと思います。
結論として、本サイトでは2の Pythonでプログラミングを行います。
OpenVINO™ツールキットの情報が非常に多く、迷ってしまうため、クラゲが良く見るページのリンクを貼っておきます。後で迷ったときに活用してください。
以上、「OpenVINO™で始めるディープラーニング」でした。