Caffe2の実装



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

 Deep Learning(CNN)を応用した一般物体検出の代表的なフレームワークであるCaffeやDetectron上で、SSD: Single Shot MultiBox Detector 、 YOLO(You Only Look Once) 及び R-CNN (Regions with CNN features) などを用いてモデル学習を実行させるためには、NVIDIA GPUのようなCUDAを実装した高速なGPUが前提とされています。ここでは、GPUでのモデル学習を前提としない物体検出のライブラリを取り上げて、学習済みのモデルを用いた物体検出を試みます。

 Caffeでのモデル学習では、NVIDIA GPU向けのCUDAを前提にしていますが、FacebookがCaffeの軽量バージョンとしてCaffe2をオープンソース・ソフトウエア型式で公開しました。このページでは、CUDAのインストールを前提としないCaffe2の実装事例を取り上げてみたいと思います。Caffe2のすべての機能を活用することはまだ出来ていませんが、初歩的な部分は利用可能です。手持ちの画像から物体を検出することを試みましょう。なお、anaconda3を用いて、Python3.6関連のパッケージがインストールされていることを前提とします。

関連記事
人工知能の入門編
Deep Learningの基礎理論と実装事例
Kerasを用いたディープラーニング
TensorFlow を用いた物体検出
Pytorch を用いた物体検出
Movidius NCS on Mac で物体検出
PythonのTutorials/Jupyter Notebook
GitHub repositories

Last updated: 2019.4.6


**************************************************************
caffe2の実装:Image Classifier
**************************************************************


 最近、FacebookがCaffeの軽量バージョンとしてCaffe2をオープンソース・ソフトウエア型式で公開しました。Caffe2のすべての機能を活用することはまだ出来ていませんが、初歩的な部分は利用可能です。Caffe2のホームページはhttps://caffe2.ai です。このサイトに使用上のtutorialsがあります。ソースコードはホームページ上の手続きに従ってダウンロードできます。例えば、Macにインストールするときは、このページにある手順に従ってインストールします。

 しかし、Tutorialだけでcaffe2を活用するだけならば、caffe2そのものをインストールする必要はありません。なぜなら、caffe2のコアモジュールがPytorchライブラリの中に収納されているからです。従って、とりあえずは、tutorialsを活用したいので、Pytorch-1.0 をインストールしてください。このページにある手順に従って、ターミナルから

conda install pytorch torchvision -c pytorch


と入力します。torchとcaffe2が
anaconda3/lib/python3.6/site-packages/
にインストールされます。次に、caffe2-tutorialsをダウンロードします。Caffe2のホームページのtutorialsにある説明の通りに、 ターミナルから

git clone --recursive https://github.com/caffe2/tutorials caffe2_tutorials


と入力します。ホームディレクトリにcaffe2-tutorialsがインストールされます。

 以上で、caffe2-tutorialsの利用は可能となります。Jupyter Notebookを起動して、caffe2-tutorialsを開いてください。その中に、Model_Quickload.ipynbというノートブックがあるので、これを開きます。そこには、pretrained modelのsqueezenetのダウンロードの仕方が説明されています。 ターミナルから

sudo python -m caffe2.python.models.download -i squeezenet


と打って、caffe2のModel Zooの中にあるsqueezenetをダウンロードします。squeezenetが
anaconda3/lib/python3.6/site-packages/caffe2/python/models/
の中にインストールされます。

 一般的的には、Caffe及びCaffe2には、AlexNet、GoogleNet、VGGなど、多数の学習済み畳み込みニューラルネットワークのモデル(pretrained models)が収集されています。これらはModel Zooという名称で呼ばれているフォルダーに配置されています。Model ZooモデルはGitHubのrepository
https://github.com/caffe2/models/

にあります。以下のプログラムでは、squeezenetは /anaconda3/lib/python3.6/site-packages/caffe2/python/models/ にインストールされていることを前提しています。

  Caffe2のsqueezenetを使ったテストをしてみましょう。Jupyter Notebookを開いて、[Python3],[File],[open]をクリックして、/caffe2/caffe2/python/tutorials/Model_Quickload.ipynbを開くと、以下のようなセルが表示されます。

# load up the caffe2 workspace
from caffe2.python import workspace
# choose your model here (use the downloader first)
from caffe2.python.models import squeezenet as mynet
# helper image processing functions
import helpers

# load the pre-trained model
init_net = mynet.init_net
predict_net = mynet.predict_net
# you must name it something
predict_net.name = "squeezenet_predict"
workspace.RunNetOnce(init_net)
workspace.CreateNet(predict_net)
p = workspace.Predictor(init_net.SerializeToString(), predict_net.SerializeToString())

# use whatever image you want (urls work too)
# img = "https://upload.wikimedia.org/wikipedia/commons/a/ac/Pretzel.jpg"
img = "images/cat.jpg"
# img = "images/cowboy-hat.jpg"
# img = "images/cell-tower.jpg"
# img = "images/Ducreux.jpg"
# img = "images/pretzel.jpg"
# img = "images/orangutan.jpg"
# img = "images/aircraft-carrier.jpg"
#img = "images/flower.jpg"

# average mean to subtract from the image
mean = 128
# the size of images that the model was trained with
input_size = 227

# use the image helper to load the image and convert it to NCHW
img = helpers.loadToNCHW(img, mean, input_size)

# submit the image to net and get a tensor of results
results = p.run([img])   
response = helpers.parseResults(results)
# and lookup our result from the inference list
print (response)
このセルの入力画像は[ img = "images/cat.jpg" ]で指定されます。このセルを実行すると、

WARNING:root:This caffe2 python run does not have GPU support. Will run in CPU only mode.
WARNING:root:Debug message: No module named 'caffe2.python.caffe2_pybind11_state_gpu'

Raw top 3 results: [array([281.0, 0.5133159756660461], dtype=object), array([282.0, 0.3256784975528717], dtype=object), array([278.0, 0.07380081713199615], dtype=object)]
The image contains a tabby, tabby cat with a 51.3315975666 percent probability.

/Users/koichi/anaconda3/lib/python3.6/site-packages/skimage/transform/_warps.py:84: UserWarning: The default mode, 'constant', will be changed to 'reflect' in skimage 0.15.
  warn("The default mode, 'constant', will be changed to 'reflect' in "


という結果が表示されます。画像がtabby cat である確率は51.33%であると。warningが出てますが無視します。使用された画像は以下の猫の写真です。
cat.jpg
いかがですか。他の画像を使用するときは、#記号を外して、[ img = ...]で指定します。その場合は、画像のあるディレクトリを必ず指定する必要があります。ここでの例では、画像があるディレクトリは[ caffe2-tutorials/images/ ]です。実は、このsqueezenetでは100種類の物体までしか区別できません。AlexNetを使うと、1000種類の物体の識別が可能です。

**************************************************************
caffe2の実装: Object Detection
**************************************************************


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

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


トップページへ