Windows10でDraknetをビルドしてYOLOを動かして画像認識を試してみました

最近以下のような画像を見かけることが多くないですか?
https://pjreddie.com/media/image/Screen_Shot_2016-11-17_at_11.14.54_AM.png

自分のマシンでも動かしたくなりDarknetをダウンロードしてmakeして,手持ちの写真でやってみましたという話です.
Darknet, YOLOのオリジナルサイトは以下になります.
pjreddie.com

基本的には以下のサイトの解説どおりにやってみました
http://www.lisz-works.com/entry/darknet-yolo

上記サイトにリンクされている、以下のサイトにdarknetのインストールとmake方法が書いてありました.
http://www.lisz-works.com/entry/darknet-install-make

書いてある通りにすると,makeが通りませんでした.

timer関係の定義がないという

include/darknet.h:709:11: error: unknown type name 'clock_t'
float sec(clock_t clocks);

エラーがでてmakeがストップしました.

対処法として
#include
をdarknet.h
に書いたらmakeが通りました.

試しに

./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg
とやったら私のマシンで30秒ほどで処理が終わりました。

makefile
GPU=0

GPU=1
とすればGPUを使用するバージョンになり処理速度は速くなると思いますが、cuda関係のエラーで
今のところmakeできません.

後日、GPU版のmakeを成功させたいと思います.

TensorFlowのMNIST For ML Beginnersを試してみる

前回、TensorFlow始めましたということで TensorFlowのドキュメントを読みながら TFの実行環境整備をしました. 今回はその続きで, MNIST For ML Beginnersを 読みながら実際に実行してみたいと思います.


MNISTとは

MNISTとはプログラミングにおけるHello worldとも呼ばれていて、機械学習を学ぶ上で初心者がまず学ぶコードのために使うデータだそうです.
具体的にはMNISTとは0から9の数値の手書き画像データと正解データ(label)がセットになったデータです.
元データはアメリカの標準技術研究所が提供しています.
学習用データ数は60000件あり、その中にテスト用のデータは5000件あります。もちろん学習用データの一部を使って学習、テストを行っても構いません。

ここではこれを使って機械学習アルゴリズムで手書き文字データから正解を導くような機械学習アルゴリズムをTensorFlowでどうやって書くのかを学ぶ初めの一歩を踏み出します.

プログラムと学習データ

mnist_softmax.pyというコードがtensorflowのページにあがっていますので、それを ダウンロードしてセーブします.
学習データ:

  • 画像データ (mnist.train.xs):28x28 pixelの各ピクセル8bitデータ
  • 正解データ(label data) (mnist.train.ys): 10成分のベクトルで正解の数値の成分が1になっている

ここでTFのドキュメントではsoftmaxについて解説があります.
簡単に言ってしまえばsoftmaxは最終出力を正解の確率に変換すると思っておけばいいと思います.
softmaxへの入力は10種類の正解数値の形が持つべき特徴が抽出された形ですので、それを集めてどれだけ正解に近いかに変換し最終的な確率へと変換するのがsoftmaxです.

学習の仕組み: いろいろな入力データに対して、ネットワークの重みWとバイアスbをsoftmaxで得た正解の確率と実際の正解との差を最小化するようにWおよびbを少しずつ変化させて差を最小化します.
この過程を学習といいます.
ちなみに予測と正解の差を大きさを表す指標をcross-entropyと呼ばれています.

今回の学習の手法はディープラーニングではなくsoftmaxを使用したロジスティック回帰と呼ばれるものです.

回帰分析の実行

上で簡単に解説したMNISTデータを学習するためのロジスティック回帰を実際にTFを使って書いていきます. といっても、コードはすでにnist_softmax.pyに用意されていますので、これを読んで でいけばいいわけです. 今回は練習のためにipythonで1行ずつ入力しながら確認していきます. まずは、データの読み込みです.

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

one_hot=TrueというのはデータがすでにMNIST_data/にある場合には新たに読み込まないという意味です.

次にtensorflowをimportし入力データ用の配列を用意する. 配列の要素はfloat32で行数は指定せず、列は画像の解像度である28x28=784を指定.

import tensorflow as tf
x = tf.placeholder(tf.float32, [None, 784])

さらに、画像の要素に掛ける重みとバイアスを入れるたもの配列を用意.

W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))

最終的な出力結果を定義します.これは先ほど説明したsoftmax関数を通すことで確率に変換されています.

y = tf.nn.softmax(tf.matmul(x, W) + b)

正解を格納する配列を用意する.

y_ = tf.placeholder(tf.float32, [None, 10])

softmax関数の出力結果と正解データがどれだけずれているかの指標であるcross_entropyを定義します.

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))

いよいよ学習させるためのコードです.
このチュートリアルではGradientDecentOptimizerという勾配降下法という方法を使ってcross_entropyの極小を求めます.小さなステップで繰り返し計算して徐々に極小に近づけていくのですが、そのステップを決めるのが以下の記述になります.

train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

TFの初期化と変数の初期化

sess = tf.InteractiveSession()
tf.global_variables_initializer().run()

入力データ、正解データを指定して学習を実行する.

for i in range(1000):
    batch_xs, batch_ys = mnist.train.next_batch(100)
    sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

next_batch(100)の意味は、100このデータを使用して学習するという意味で、range(1000)というのは、それを1000回やりますということです.

学習結果の制度の確認

学習結果と正解の結果が一致したかしないかを判定した結果を格納.

correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))

学習結果の予想yと正解y_を比較して正しければ1間違えていれば0を配列にしています.

correct_predictionは結果が正しければ1, 間違いなら0の値が入った配列になっていますが、それを正解の確率に変換すし結果をaccuracyという変数に代入します.

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

テストデータを入力して学習しで決定したw,bを使用して画像の数値を予想し、その結果がどれくらい正しかったかの結果を表示します.

print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

私の環境では、0.9195と表示されました.
約92%なので結構正解率が高いように思いますが, もっといいモデルを使うと99.7%まで行っているそうです.
今のモデルをちょっと変えるだけでも97%程度なら到達できるそうです.

以上で, 初心者向けのMNISTは終了です.

TensorFlow始めました [環境整備編]

今年になってTensorFlow1.0がリリースされてWindows上でも比較的安定して動くようですので、 Windows10 64bitが動いているデスクトップマシンとノートPCでTensorFlow1.0の実行環境を整備してみました.

情報はすべて2017/4/15のものです.


まずはTensorFlowのドキュメント確認

とりあえずTensorFlowのトップページを見てみます。
https://www.tensorflow.org/

一番上のタグにInstallという項目があるのでそこをクリックするとインストールに関する情報が出てきます。
この説明に従ってTensorFlow環境を構築していきます。

わかりやすい英語で書いてあるので読みやすいですが、開発中ということもありリンク先や記述にたまに間違いがあります

Anaconda(Python3環境)のインストール

私のPC環境:Windows10 Pro64bit
CPU: Intel Corei7-7700 3.6GHz
Memory: 32GB
GPU: NVIDIA GTX 1050

まずはOS選択でWindowsを選ぶ

TensorFlowのドキュメントにはGPU,CPU版があるよという説明があります。
GPU版はNvidia GPUとCudaが必要だよという説明がありますね。

その下に行くと、Pythonの環境をどうするかが書いてあります。 Anacondaがお手軽そうなので"Installing with Anaconda"という項目を読みます。 Anacondaのダウンロードサイトから https://www.continuum.io/downloads Anaconda 4.3.1をダウンロードし、インストールします。 コンソールから、

    C:> conda create -n tensorflow

でtensorflowという名前の仮想環境を作ります。 これは、スタートメニューのAnaconda-> Anaconda Navigator -> Environments からでも作れます。 私はこのGUIから仮想環境を作りました。その際、Pythonのバージョンの選択を3.5にしておきました。 ちなみにtensorflowという環境名は任意の名前でOKです。 すると、Anacondaが自動的に必要なパッケージをインストールしてくれます。 作成した仮想環境でjupyter notebookが使えるように Anaconda NavigatorのHomeで Applications on “” ののところを先ほど構築した仮想環境に変更してjupyter notebookをインストールします。
これでpythonの環境構築は修了です。

TensorFlow本体のインストール

コマンドプロンプト

    conda info -e

で作成した環境を確認する。

    C:> activate tensorflow
     (tensorflow)C:>  # Your prompt should change

で構築した仮想環境をactiveにする。(もとに戻すにはdeactiveコマンド) 星印がついているのがactiveになっている環境です.

次に以下のコマンドでこの環境にTensorFlowをインストールします

    pip install --upgrade tensorflow

GPU版は 

        pip install --upgrade tensorflow-GPU

で最新版がインストールできるようです。
バージョンを指定してインストールするにはtensorflowのページに書いてあるように パッケージ名を指定すればいいようです。
ちなみにGPU版をインストールするときはCPU版と別の仮想環境にインストールするように注意しましょう。
これであとは自動的にtensorflow本体と実行するのに必要なパッケージをインストールしてくれます。
私の環境では初めにこのpip install がうまく動かなかったので

            pip install --upgrade -I setuptool

としてセットアップツールをインストールすると解決しました。

以上で環境構築は修了です。簡単ですね。

最後に正しくインストールされているかどうかの確認を行います。

コンソール上でPythonを起動して

    >>> import tensorflow as tf

    hello = tf.constant('Hello, TensorFlow!')
    sess = tf.Session()
    print(sess.run(hello))

これで、正しくHello, TensorFlow!が表示されればOKです。

次回はTensorFlowのドキュメントのdevelopタグに移ります
https://www.tensorflow.org/get_started/get_started
ここの"Getting Started With TensorFlow “を順を追って読んで、自分の環境でTensorFlowで簡単な機械学習を動作させてみます.

Firefox 52.0.2 ではてなツールバーのログイン状態が維持できない

Windows10 + Firefox 52.0.2 64bit版を使用しているのですが、なぜかはてなツールバーのログイン状態が維持できないです。
サードパーティークッキーは許可しているのですが、はてなにログインボタンを押してログインした後もログイン状態が維持できないです。
理由がわかる方おられたらコメントいただけると嬉しいです。

Visual Studio Codeの設定メモ. Markdown, Latexなどなど

Visual Studio codeの設定メモ

Visual Studio codeにインストールした拡張機能

  • Auto-Opne Markdown Preview: 自動的にプレビューが開くので便利
    - 複数のmdのタブがあるときも一つしかプレビューできない
    -> 便利かなと思ったが急にタブが開くのもうっとおしいので無効にしてある
  • Markdown+Math: Markdownのプレビューで数式が表示可能
  • MarkdownPDF: MarkdownをPDFに変換するツール
  • VSCode Great Icons: アイコンを表示
  • Latex Workshop: Latexコンパイルとpdf出力やプレビュー可能
  • Latex Preview: Latex Workshopと比べてみる(今はdisabelにしている)

以下のサイトを参考にしました
http://www.procrasist.com/entry/vscode-fallinlove

フォントの設定, MathJaxの有効化などの解説が以下にあります
http://qiita.com/yumetodo/items/1a8d371a20ba9a50eeaf

tex fileに関しては,以下のサイトに書いてあるように基本Texで書いてめんどくさいところで適宜Pandocでmd -> Tex変換がベストな気がする. http://qiita.com/ssh0/items/679ac9dd3c33b0e5cd90

後はVS codeでターミナルを開いて( Ctrl+`でVS code内に, Ctrl+Shift+Cで別ウインドウで)そこでコンパイルしたりプレビューすればいいのかなと思います. 適当にエリアスを作っておけば, コマンド一発なのでそれが便利かな.

そもそもVS codeってどんなことできるのという段階では以下を読むとよくわかる http://www.atmarkit.co.jp/ait/articles/1507/10/news028.html

Markdown環境の構築

jupyter notebook やgitのreadme以外にも自分のメモもmarkdownで書くことが増えてきました.
長い文章はtexを使いますが,ちょとしたメモや簡単なプレゼン程度ならmarkdownでサクッと書いたほうが手軽です.
そんなわけで,windows10 PCでMarkdownを編集したりプレビューしたりpdfに変換するツールを導入しました.
まずは、text editorですが,Sublime3を今は使っていますが、packageを追加すればブラウザでリアルタイムにプレビューで来るようです.
ただし,先ほどの記事で書いたような日本語IMEの変換窓のずれがあったりプレビュー画面で数式が表示されなかったりしました.
それで,Visual Studio Codeをインストールしてみました.
起動や動作が重いかと思ったのですが、想像していたよりは軽かったです.

MarpdownのプレビューにはMarpというツールをインストールしました。
Marp - Markdown Presentation Writer
動作も軽く使いやすそうです.

まだ使いこなせていませんがこれから使ってみて情報を追加していきます.

Visual Studio Codeのproxy設定は
Visual Studio Code のおすすめ拡張機能と設定値(2016/11 版 随時更新) - Qiita
を見ました。

markdownで数式を表示するには、コマンドパレット(Ctrl+P)から
ext install mdmath
だけでインストールできてしまいます.
http://qiita.com/saitotak/items/3ea2a1897dca6bb5b91b
VSCodeのMarkdownで数式を表示する - Qiita
数式を表示してプレビューは(Ctrl+Shift+V)ではだめで、Ctrl+Shift+.ですので注意が必要です.

tex形式で書いてある部分は
ParseError: KaTeX parse error: No such environment: align at position 14: \begin{align}̲
とエラーが出ています. 後日この問題を解決します.MathJaxだとエラーにならないようです.

Sublime3+Windows10で日本語変換の場所がずれる問題

最近Windows10の環境に移行したので、Sublime3を早速セットアップしました。
基本的なセットアップはこのブログに書いてある通りなのですが、IMESupportを導入しても日本語変換の返還窓がずれて表示されます。
入力している文字のすぐそばに表示してくれればいいのですが、その場所が左のほうにだいぶずれてしまいます.
github.com
この問題はまだ解決されていないようですが、日本語を入力するときだけ少し不便な程度なのでいまは目をつぶることにします。(2017/3/9)
Visual studio Codeに乗り換えた人もいるようですが、僕はやっぱりSublimeを使い続けようかなと思います.
[追記:使い続けようといいつつVS codeに乗り移りつつあります]