2017年6月25日日曜日

少数のデータで強力な分類能力を有するモデルを作成してみる。 その2 (Building powerful image classification models using very little data. Part2)

kaggle cat  特に意味はない

はじめに

表題のとおり、少ないデータで識別能力の高いモデルを作成してみる。オリジナルは、この記事。それと、オリジナルを参考にした "VGG16のFine-tuningによる犬猫認識" の記事を TensorFlow 1.2 + keras 2.0.5 上で再現を試みる

今回は、第2段としてBottleneck 特徴量を使用した分類を試してみた。

Bottleneck 特徴量は、VGG16のモデルを使用し作成するが、最終段の1000クラス分類用の全結合層は使用しない。代わって新たに、2クラス分類用に結合層を定義し直し、この部分のみ学習させることとなる。

新たに定義された全結合層

プログラムの構成

プログラムは2つのパートに分けられ、1つは、VGG16を使用し、ボトルネック特徴量を作成する部分である。抽出された特徴量は、ファイル名 bottleneck_features_train.npy で一旦保存される

また、検証用データの特徴量も合わせて計算され、ファイル名bottleneck_features_validation.npy で同様に保存される

もう一つは、定義した全結合層を、最初に作成したボトルネック特徴量のファイルを入力として学習する部分である。モデルの重みデータは、bottleneck_fc_model.h5 として保存される。

結果

プログラムは、オリジナルのプログラムを若干修正したもので試している。
今回学習は数分で終了した。検証用データの正答率は、89.7%であった。

学習結果  

課題

オリジナルでは、特徴量を作成するジェネレータで指定するデータ量を、バッチサイズ(16)で割っていたが、
 bottleneck_features_train = model.predict_generator(generator, nb_train_samples // batch_size)

aidiary さんのサンプルでは、学習用データサイズそのままを指定している
 bottleneck_features_train = model.predict_generator(generator, nb_train_samples)

これのどちらが正しいのか判断できないので、修行が必要である。

2017年6月24日土曜日

少数のデータで強力な分類能力を有するモデルを作成してみる その1。(Building powerful image classification models using very little data. part 1)

オリジナルモデル

はじめに

表題のとおり、少ないデータで識別能力の高いモデルを作成してみる。オリジナルは、この記事
また、この記事をベースとした日本語版 VGG16のFine-tuningによる犬猫認識 の記事

最初に、日本語版をみて概要を掴み、オリジナルの記事に従って順番に試していくのがよいと思う。

この記事では、データのオーギュメンテーションの方法を最初に説明し、3段階のステップを踏んで、80%,90%,95%と正答率を向上さえてゆく。

オーギュメンテーションの方法は、別の機会とし、最初は、フルスクラッチのモデルを試してみた。
上部の画像は、モデルの構成を出力したのである。

準備

kaggleに登録し、ここから学習用データをダウンロードする

学習には、オリジナル記事の用なフォルダー構成と画像データを必要とする。
上記記事の作者がスクリプトを提供してくれているのでありがたく使用させていただいた。

画像の分類を終えたなら、オリジナルに掲載されている、コードをそのまま写経し実行する。

当方の構成では、最初のエポックをのぞき1回のエポックに11秒かかった。
50エポックにかかった時間は、約10分であった。正答率は79%となった。

学習時の正答率

このデモを実行しても、上記の用に学習の経過が表示されるだけであり、実行結果は、重みとして最後に保存される。
日本語版の記事では、途中の経過をhistoryに記録するように修正されている。

メモ

なお、オリジナルは、3月に修正されKeras 2.0のAPIにあわせて書き直されている。

Note: all code examples have been updated to the Keras 2.0 API on March 14, 2017. You will need Keras version 2.0.0 or higher to run them.


日本語版は、keras 1.2なので注意

第2段階は次回に

2017年6月22日木曜日

Keras 上で VGG16 を使用して分類を試してみた。(I tried classification using VGG 16 on Keras.)

kaggle_cat 特に意味はない

はじめに

kerasの環境構築ができたので、指定したファイルのクラスを分類できるかを確認してみた。
今回、 "KerasでVGG16を使う" を参考にさせていただいた。

使用した環境
ubuntu            16.04.2
cuda            8.0.61
cudnn            5.1.10
TensorFlow-gpu     1.2.0
keras            2.0.5

変更点

実行に当たっては、 jupyter notebook を使用しているため、オリジナルから2点修正している

1 ファイル名は引数ではなく、直接埋め込み
    filename = "cat001.jpg"

2 日本語注釈に対応するため、utf-8 用の宣言を冒頭に挿入
    # -*- coding: utf-8 -*- 

さらに、結果に関しては、ラベル名と確率を整えて表示している。
    print result[1], "{0:.3f}".format(result[2])

結果

比較対象としてDarknet-GPUの結果を合わせ記載しておく

p27.png
kares
  king_penguin         1.000
  goose             0.000
  American_coot     0.000
  albatross         0.000
  black_swan         0.000

darknet
  99.99%: king penguin
  0.00%: killer whale
  0.00%: drake
  0.00%: toucan
  0.00%: magpie


p5.png

keras
  vacuum             0.163
  chain_saw         0.094
  parking_meter     0.094
  totem_pole         0.089
  space_shuttle     0.073

darknet
  7.67%: projector
  7.03%: paper towel
  4.99%: barbell
  4.00%: vacuum
  3.21%: loudspeaker

メモ

最初の実行時にVGG16のモデルデータが自動的にダウンロードされる。
 格納場所は、 ~/.keras/models の下

 ファイル名は、
 vgg16_weights_tf_dim_ordering_tf_kernels.h5

2017年6月20日火曜日

GPU版の Darknet で ImageNet 分類を試してみた。(I tried ImageNet classification with Darknet GPU version.)

アドバイス

はじめに

先週(GPU版の)Darknet で ImageNet 分類を試してみたが、失敗してしまいCPU版なら分類することができた
今日、親切な sounansu さんが対処方法を教えてくれ、その方法を試したところ解決したので、メモしておく。

対処

cfg/extraction.cfg ファイルの開き、2行目のsubdivisionsの値を大きくしてみた

[net]
batch=128
subdivisions=4
height=224
width=224
max_crop=320
channels=3
momentum=0.9
decay=0.0005

初期値は1
値2では、out of memoryの発生する場所がかわり、値1の時より処理が進んでいた。
値3でも同様の、out of memoryが発生したが、さらに処理が進んでいた。
値4にしたところ、問題なく分類することができた。

結果


GPU
../work/p27.png: Predicted in 0.014197 seconds.
  99.99%: king penguin
  0.00%: killer whale
  0.00%: drake
  0.00%: toucan
  0.00%: magpie

CPU
./work/p27.png: Predicted in 4.877716 seconds.
  100.00%: king penguin
   0.00%: toucan
   0.00%: killer whale
   0.00%: albatross
   0.00%: anemone fish

ざっと350倍に速度が向上したが、スコアが若干異なっている。



GPU
../work/p5.png: Predicted in 0.016148 seconds.
  7.67%: projector
  7.03%: paper towel
  4.99%: barbell
  4.00%: vacuum
  3.21%: loudspeaker

CPU
../work/p5.png: Predicted in 6.501382 seconds.
  8.66%: dumbbell
  7.49%: toyshop
  5.21%: vacuum
  3.73%: projector
  3.64%: espresso maker

こちらは400倍に向上しているが、結果がまったく異なる。

CPU版 OpenPose のコンパイルと ドキュメントに関して (Compilation of CPU version OpenPose and related to OpenPose document)

ドキュメントより引用

はじめに

OpenPoseをCPU版のCaffe上で動作させようとしたが、GPU異存のコードがあることが分かり断念した経緯がある。

久しぶりにOpenPoseのGitHubを覗いてみたら気になる文字を見つけた。

modelsのフォルダーに    CPU rendering added の文字が

CPU rendering added

早速、OpenPoseのプロジェクト一式をダウンロードし、ソースを眺めてみると、確かに描画の関数が、GPU異存からCPUでの描画コードが追加されていた。

しかし、肝心のポーズの検出のところで、

            #ifndef CPU_ONLY
                spResizeAndMergeCaffe->Forward_gpu({spCaffeNetOutputBlob.get()}, {spHeatMapsBlob.get()});       // ~5ms
                cudaCheck(__LINE__, __FUNCTION__, __FILE__);
            #else
                error("ResizeAndMergeCaffe CPU version not implemented yet.", __LINE__, __FUNCTION__, __FILE__);
            #endif

を見つけてしまった。ここのコードは前回とまったく追加されていない。
優先順位が低いため、後回しにされていると考えよう。

OpenPose のドキュメント

ソースを覗いていたら、いくつかの説明用のドキュメントを見つけたのでメモしておく。

・リリースノート
 今は、1.0.0rc4予定のものとのこと
  CPU描画による3-5%速度向上

・コンパイルと、インストールの方法

・OpenPose Demoの概要
 デモプログラムの引数の説明

・OpenPose Libraryの概要

・OpenPose Demoの出力
 全体のボーン、顔特徴点、手のボーンのインデックス番号の説明

・OpenPose Libraryへのモジュールの追加

以上

2017年6月19日月曜日

Darknet CPU版で ImageNet 分類を試してみた。(I tried ImageNet classification with Darknet CPU version.)


ペンギン  
../work/p27.png: Predicted in 4.877716 seconds.
  100.00%: king penguin
   0.00%: toucan
   0.00%: killer whale
   0.00%: albatross
   0.00%: anemone fish

はじめに

Darknet は、 YOLO だけでなく、 ImageNet Classification や Nightmare などの機能も実現している。
前回は、 ImageNet Classification を試してみたが、残念ながら問題が生じたため実現できなかったが、今回GPU使用をあきらめ、CPU版で試したところ成功したので結果をまとめておく

分類の結果は、5位まで、名称と、確信度が表示される。なお1枚の画像(800x480)の処理時間は、約6秒である。

結果

画像の中で、一番スコアのよいオブジェクトが1位として示されるが、そのオブジェクトが画像内で必ずしも重要となるオブジェクトを示していないことが確認された。 

アニメ 壁画
../work/p8.png: Predicted in 6.397868 seconds.
 84.51%: half track
  3.55%: tank
  2.76%: bulletproof vest
  1.32%: military uniform
  1.20%: cannon



アニメ パネル

../work/p9.png: Predicted in 6.389466 seconds.
 66.33%: miniskirt
 13.29%: comic book
  4.42%: maillot (服 マイヨ?)
  2.65%: maillot
  1.11%: sock

トーマス

../work/p5.png: Predicted in 6.501382 seconds.
  8.66%: dumbbell
  7.49%: toyshop
  5.21%: vacuum
  3.73%: projector
  3.64%: espresso maker

電車

../work/p30.png: Predicted in 6.546478 seconds.
 67.88%: electric locomotive
 23.53%: passenger car
  8.54%: streetcar
  0.02%: trolleybus
  0.02%: freight car

例のマリオカート

../work/p12.png: Predicted in 6.518403 seconds.
 99.92%: go-kart
  0.07%: lawn mower (芝刈り機)
  0.01%: racer
  0.00%: golfcart
  0.00%: tricycle


大道芸

../work/p11.png: Predicted in 6.533132 seconds.
 66.37%: maze
  5.51%: go-kart
  3.21%: unicycle
  2.46%: sundial
  1.54%: jinrikisha

以上

2017年6月15日木曜日

Darknet で ImageNet 分類を試してみたが、失敗した。(I tried ImageNet classification with Darknet, but it failed.)

エラーメッセージ

はじめに

Darknet は、 YOLO だけでなく、 ImageNet ClassificationNightmare などの機能も実現している。

ImageNetは、1000クラスの分類用の画像データセットであり、Darknetは、このデータを学習に使用して、いくつかの学習済みモデルを提供している。

提供されているモデルは以下のものである。詳細は、説明ページの下段に記されている。


学習済みモデル

今回は、 ImageNet Classification を試してみたが、残念ながら問題が生じたため実現できなかった。
6/20 解決しました。

事前準備

wget http://pjreddie.com/media/files/extraction.weights

でモデルデータを取得する

実行コマンド

./darknet classifier predict cfg/imagenet1k.data cfg/extraction.cfg ../work/extraction.weights ../work/dog.jpg

実行結果は、画面上部の用なエラーが生じて中断される。

GPUボードは、GeForce GTX 1050Ti 8G を使用しているが、8Gでは、メモリが少ないと想像される。

学習の時は、バッチサイズを小さくするなど、何らかの対策が考えられたが、inferenceなのでメモリの減らす方法は浮かばない。

念のために他のモデル(darknet19、darknet19_448)でも試してみたが、いずれも、CUDA Error: out of memory で中断されてしまう。

以上