FFTピーク値とエネルギーの件
山岡さんのブログでFFT結果のピーク値使用の注意がありました。
こちらでは主に音声ファイル44.1kHzのファイルフォーマットとラの音440Hzを中心に考察されていましたが、機械系の開発でもFFTを使うことがあり示唆に富んだ内容であるように思います。
具体例として、440Hzのサイン波と435Hzのサイン波のピーク値が
周波数 | ピーク値 |
---|---|
440Hz | 1999.5 |
435Hz | 1527.2 |
と1.3倍の開きがあり、サンプリング周波数の影響が出ているということを示されています。 具体例として機械部品の共振試験を実施した結果に読み替えると、サンプリング周波数を無視して、試験結果のピーク値を読んで共振倍率を求めると痛い目にあうということです。
山岡さんの結果をそのまま使わせていただくと、最悪1.57倍 負荷を過小評価してしまう。
これを防ぐためには実際に周波数ドメインの振動を評価する際に、エネルギーの考え方を持ち込む必要があります。まず、スクリプトをお借りして、435Hzと440HzのFFT結果を並べます。
%matplotlib inline import numpy as np import matplotlib.pyplot as plt # Sampling Rate fs = 44100 # Sample Size size = 4096 t = np.arange(0., size) / fs frq = np.fft.fftfreq(size, 1./fs) # 440Hzのサイン波をFFT f = 440 y = np.sin(2 * np.pi * f * t) Y = np.fft.fft(y) # 435Hzのサイン波をFFT f2 = 435 y2 = np.sin(2 * np.pi * f2 * t) Y2 = np.fft.fft(y2) # プロット plt.plot(frq, abs(Y)) plt.plot(frq, abs(Y2)) plt.axis([300, 500, 0, 2500]) plt.show()
ごらんの通り440Hz(青)と435Hz(緑)で裾の広がり方が違います。 44.1Khz ÷ 周波数の値がより整数に近い440Hzの方がピークがはっきり出ている結果になっています。
これはフーリエ変換を離散化するとつきまとうものですが、 FFTがユニタリ変換なので簡単に(変換前後の)エネルギーの保存を確認できます。
で、それぞれのエネルギーを求めるのは簡単で下記のとおり、
E1 = np.conj(Y)*Y E2 = np.conj(Y2)*Y2 TTL1 = sum(E1) TTL2 = sum(E2)
この結果、それぞれの水準でのエネルギーは
周波数 | エネルギー値 |
---|---|
440Hz | 8403716 |
435Hz | 8403443 |
と、ほぼ一致します。周波数そっくりさんですしね。 (弱冠440Hzの方が大きいのは周波数が高い分、もともと波のエネルギーが高いのです)
当初懸案だったピーク値のような差が大きくなく、評価としてよりロバストだと言えそうですね。
では、ここから、どうやってピーク値を求めるかというと、単純なものから学術的なものまでいろいろあるそうです。入り口としてリンクだけおいておきます。
- How to Interpolate the Peak Location of a DFT or FFT if the Frequency of Interest is Between Bins | dspGuru.com
- fourier transform - How do you find the frequency and amplitude from a DFT? - Signal Processing Stack Exchange
では!
NVIDIA DIGITSでMNISTする
はじめに
Windows10のGPUレス環境に念願のDIGITS 4.0を導入しました
試験走行用にMNISTを実施。
参考資料
MNISTデータのダウンロード
データのダウンロードツールがDIGITSに付属しています。うちの場合は、Dドライブ直下にDigitsのリポジトリをクローンしたので、D:/DIGITS-master/tools/download_data/ にツールがあります。
D:/DIGITS-master/tools/download_data/でコマンドプロンプトをひらいて、D:/MNIST_DATA/にデータをダウンロードするには…
python main.py mnist D:/MNIST_DATA/
を実行します。
これでDIGITS用のトレーニングデータが、D:/MNIST_DATA/train以下に、 テスト用のデータがD:/MNIST_DATA/test以下に準備できます。
DIGITS上にトレーニング用データセットDBを作成
DIGITS起動後、http://localhost:5000 にアクセスすると、下記のような画面に。
ここで、New Datasetをクリックして、Classificationを選びます。
すると、インストール時に設定すらしてなかったUsernameを聞く画面に遷移します。ここのユーザー名は、なんでも良いので適当に入力してSubmitしてください。
その後出てくるDataset作成ページで必要な情報を入力してCreateすれば出来上がり。
その後のスクショを取るのを忘れましたが、こんな感じになるはずです。
トレーニングモデル(シナリオ)の作成
トップページ ( http://localhost:5000 )へ戻ります。 次は、NewModelをクリックして、Classificationを選びます。
CPUなしのインストールなので計算に使用するGPUを選択リスト…は出てきませんが、 2箇所クリックして、モデル名(LeNetなど)を入力するだけの簡単な作業で済みます。
モデルが作成されると同時に、トレーニングが開始されます。 うちのPCは、あまり高速ではないので50分くらい放っておいて終わるようなペースでした。
トレーニング中はページをリロードすると進捗が更新されます。
トレーニング完了後の試験
トレーニング後はページの下の方に配置されたTrained Modelsを使って遊びます。
画像ファイル1個を使った例(単ファイル テスト)
単ファイルを認識させるテストをします。このように認識させる画像ファイルをD:\MNIST_DATA\testフォルダなどから適当に選択してやり、Classify Oneを実行します。
すると、ニューラルネットの途中過程も含めた認識作業結果が出力されます。100%の確率で「5」と出てますね。よくわかってます。
画像を複数使った例 (いわゆる画像認識精度の確認試験)
こちらは画像がどこに入っているかまとめて記入されているファイルが必要になります。今回用意したMNISTデータには最初から用意されているので、それを利用します。
すると、testフォルダの全ファイルについての認識精度が確認できます。
おわりに
CPUだけでもNVIDIA DIGITSが動いてよかった!
あとはCaffe | Model ZooとかどうやってDIGITSに取り込むのかなぁと思ってます。
[Windows] NVIDIA DIGITS 4.0をGPUなしで使う!
DIGITSのバージョンアップもあり内容を更新しました
新しい記事はこちら → NVIDIA DIGITS 6.0をWindowsで使う! - 夜間飛行
はじめに
NVIDIA Deep Learning Day 2016などで華々ししく紹介されているNVIDIA DIGITS. いつものことながらWindows文化のメーカー系会社員には中々導入が難しいです。 そのうえ、支給パソコンにはGPUがないものまであります。
そんな環境でもDIGITSをお試ししてみたい!という思いで試験的にインストールしました。
環境
- Windows 10
- DIGITS 4.0 RC
- Python 2.7.11 - 64bit
- Visual Studio 2013
- Microsoft Visual C++ Compiler for Python 2.7
DIGITSとは
NVIDIA DIGITS (the Deep Learning GPU Training System) はNVIDIAが公開しているディープラーニングのWebアプリ インタフェースです。バックエンドはCaffeとなっており、ディープラーニングのライブラリとして有名なCaffeをプログラミングしないでも使えるようにするツールです。
使い方などは、たぶんビデオ見た方が早いですが、ブラウザベースで画像をアップロードするなどして、ニューラルネットワークを選んでほおっておくと出来上がり!
NVIDIA Deep Learning Course: Class #2 - Getting Started with DIGITS
手っ取り早く結果のイメージだけ紹介すると、こんな風にディープラーニングできちゃうのだそうです! 出典:NVIDIA DIGITS
さっそくインストールしてみよう!
DIGITSのインストール
DIGITSはCaffe+Pythonで動くので、まずCaffeをインストールする必要があります。
すでにCaffeが入っている方は読み飛ばしてもらって結構です。
- Pythonの必要なライブラリインストール
- Caffeのインストール
- Graphizのインストール
- DIGITSのインストール
DIGITSソースコードのダウンロード (GitHubからのダウンロード方法)
DIGITS4.0はGitHubから落とせます ⇒ NVIDIA/DIGITS: Deep Learning GPU Training System
"GitHubデスクトップ"をインストールしていない方は、zipとしてダウンロードして解凍してください。
インストール作業の全体像
基本的に付属のマニュアルに従います ⇒ DIGITS/BuildDigitsWindows.md
必要なPythonのライブラリの追加
DIGITS(Caffe)の動作には
- numpy
- scipy
- matplotlib
- scikit-image
- h5py
- google protobuf
- pyreadline
- gevent
- requests
- image
- pillow
- wergzeug
- wtforms
- flask
- flask-wtf
- flask-scoketio
- pydot
- lmdb
- gunicorn
が必要になります(多いですね) 以下で.whlで終わるファイルについてはPython Extension Packages for Windows - Christoph Gohlkeからダウンロードしてきて、pipコマンドでインストール。
pipのバージョンが7.1.2など古い場合はうまく動きませんので、念のためアップグレード。
python -m pip install --upgrade pip pip install cython pip install numpy-1.11.0+mkl-cp27-cp27m-win_amd64.whl pip install scipy-0.17.0-cp27-none-win_amd64.whl pip install matplotlib-1.5.1-cp27-none-win_amd64.whl pip install scikit_image-0.12.3-cp27-cp27m-win_amd64.whl pip install h5py-2.6.0-cp27-cp27m-win_amd64.whl pip install protobuf pip install pyreadline pip install gevent pip install requests pip install image pip install pillow pip install wergzeug pip install wtforms pip install flask pip install flask-wtf pip install flask-socketio pip install pydot pip install lmdb pip install gunicorn
Caffeのインストール
Windows用のCaffeもGitHubにあります。⇒ BVLC/caffe at windows
CaffeのビルドにはVisual Studio 2013が必要だそうです! VS2015でやろうとしましたが、boostライブラリのバージョン違いなど細かいところで面倒です。
Caffeビルドオプションの作成と変更
Caffe-Windowsのフォルダの中にwindowsフォルダがあります。
そのフォルダの中にCommonSettings.props.exampleというファイルがありますが、 これをCommonSettings.propsという名前でコピーします。
そして、コンパイルオプションをGPUなしに変え、python用とするため、 ファイルの中の6~7行目が
<!--NOTE: CpuOnlyBuild and UseCuDNN flags can't be set at the same time.--> <CpuOnlyBuild>false</CpuOnlyBuild> <UseCuDNN>true</UseCuDNN> <CudaVersion>7.5</CudaVersion> <!-- NOTE: If Python support is enabled, PythonDir (below) needs to be set to the root of your Python installation. If your Python installation does not contain debug libraries, debug build will not work. --> <PythonSupport>false</PythonSupport>
となっていますが、これを
<!--NOTE: CpuOnlyBuild and UseCuDNN flags can't be set at the same time.--> <CpuOnlyBuild>true</CpuOnlyBuild> <UseCuDNN>false</UseCuDNN> <CudaVersion>7.5</CudaVersion> <!-- NOTE: If Python support is enabled, PythonDir (below) needs to be set to the root of your Python installation. If your Python installation does not contain debug libraries, debug build will not work. --> <PythonSupport>true</PythonSupport>
に変更します。
さらに、Pythonフォルダを設定します。47行目あたりの
<PropertyGroup Condition="'$(PythonSupport)'=='true'"> <PythonDir>C:\Miniconda2\</PythonDir>
をPythonインストールフォルダに合わせて
<PropertyGroup Condition="'$(PythonSupport)'=='true'"> <PythonDir>C:\Python27-64\</PythonDir>
へ変更。
Caffeのビルド + Pythonへのインストール
Caffe-Windows以下のCaffe.slnをVisual Studio 2013でひらき、ビルドを実行します。 10分後くらいにはCaffe-windows/Build/x64以下にビルド結果ができているはず。
そして、caffe-windows/Build/x64/Release/pycaffe以下のcaffeフォルダを、 C:/Python27-64/Lib/site-packages以下へコピー。
python -c "import caffe"
としてエラーがでなければ大丈夫です。
さらに、caffe-windows/Build/x64/Release/以下を、C:\Caffe\フォルダを作り、そこへコピー。 環境変数にC:\Caffe\を追加
Graphvizのインストール
DIGITSでディープラーニングのニューラルネットを可視化するために使います。
Download | Graphviz - Graph Visualization Softwareから、Windowsインストーラをダウンロードしてきて、インストール。
DIGITSからのアクセス性を考えて、C:\Graphviz2.38\やD:\Graphviz2.38\へのインストールがおすすめ。
そして環境変数にC:\Graphviz2.38\binを追加しましょう。
DIGITSのインストール
やっと本体のインストールですね。
コマンドプロンプトをDIGITSのREADME.mdがあるフォルダで開きます。
そして、インストールに必要な要件がそろっているか確認するコマンドを実行します。 ただし、pipのバグかわかりませんが、pillowのファイル名をPIL⇒pilなど軒並み小文字に変えてしまい、 モジュール動作ができなくなってしまうような事態が発生するので、一部同梱のrequirements.txtを編集する必要があります。 具体的には最初の3行を消して、
protobuf>=2.5.0,<=2.6.1 six>=1.5.2,<=1.10.0 requests>=2.2.1,<=2.9.1 gevent>=1.0,<=1.1.0 Flask==0.10.1 Flask-WTF==0.11,<=0.12 wtforms>=2.0,<=2.1 Flask-SocketIO==0.6.0 gunicorn==17.5 setuptools>=3.3,<=20.7.0 lmdb==0.87 h5py>=2.2.1,<=2.6.0 pydot==1.0.28
とします。 そのうえで、下記を実行しましょう。モジュールのバージョンを調整してくれます。
python -m pip install -r requirements.txt
DIGITSの起動と実行
DIGITSフォルダで開いたコマンドプロンプトで、
python digits-devserver
を実行すると、http://localhost:5000でDIGITSにアクセスできます。
MNISTも動きました!
注意事項
DIGITS 4.0からは物体認識タスクに対応したようですが、使っているCaffeがNVCaffeではないため、 detectNETをそのままでは構成することができずサンプルの物体認識は実行できません。
参考
GPUなしのNVIDIA DIGITS3で始めるDeepLearning - Qiita