粗大メモ置き場

個人用,たまーに来訪者を意識する雑記メモ

Homography行列の分解 OpenCV Python

OpenCVは便利なんですが不十分な情報や古い情報,ニセの情報がネット上に多すぎます. 基本的に公式のサイトを見ような.公式っぽいけど違うみたいな奴多すぎ. これがまともだったので公式と信じる.

はじめに:Homography 行列の推定とか

findHomographyにぶち込みます. 昔書いたテンプレート抽出のコードを参考にどうぞ.

キャリブレーションはがんばりましょう.decomposeはエラーにめっちゃ敏感です. ROSを使えばかなり簡単にキャリブレーションできます。100枚程度あれば結構いいスコアを出せるので頑張って。

過去にもエピポーラ幾何でなんかやってますね,この時なキャリブレーションが甘かったので結果をやり直してみたい. ossyaritoori.hatenablog.com

cv2.decomposeHomographyMat

公式?によると使い方は以下の通り.

retval, rotations, translations, normals   =   cv.decomposeHomographyMat(  H, K[, rotations[, translations[, normals]]]    )

生で吐くとこんな値になります.

(4, [array([[ 0.99069192, -0.0745761 ,  0.1138768 ],
       [ 0.07708256,  0.99686649, -0.01776175],
       [-0.11219536,  0.02637434,  0.99333609]]), array([[ 0.99069192, -0.0745761 ,  0.1138768 ],
       [ 0.07708256,  0.99686649, -0.01776175],
       [-0.11219536,  0.02637434,  0.99333609]]), array([[ 0.8447263 ,  0.02653746,  0.53454021],
       [-0.1212945 ,  0.98227444,  0.14291458],
       [-0.52127259, -0.18556049,  0.8329719 ]]), array([[ 0.8447263 ,  0.02653746,  0.53454021],
       [-0.1212945 ,  0.98227444,  0.14291458],
       [-0.52127259, -0.18556049,  0.8329719 ]])], [array([[ 0.30840663],
       [-0.09586909],
       [-0.81377852]]), array([[-0.30840663],
       [ 0.09586909],
       [ 0.81377852]]), array([[ 0.67210665],
       [ 0.17138383],
       [-0.53426701]]), array([[-0.67210665],
       [-0.17138383],
       [ 0.53426701]])], [array([[ 0.92347388],
       [ 0.23136337],
       [-0.30605063]]), array([[-0.92347388],
       [-0.23136337],
       [ 0.30605063]]), array([[ 0.64092667],
       [-0.04427804],
       [-0.76632399]]), array([[-0.64092667],
       [ 0.04427804],
       [ 0.76632399]])])

そもそもSVDを使ったdecompositionでは4つの解が出ます. したがって4つずつあるこの回転Rと並進T, 法線ベクトルnのペアから一番まともなペアを選びます.

ネコと学ぶ...さんの超わかりやすいサイトより,以下の画像を拝借.

この場合(a)のパターンが正しいです.

これの解き方は一般にわかっている点群を投影して,すべての距離が正になるかで判断します.

全容を理解するのにはInriaの2008年の文献がわかりやすそうです.(ただし長い)

解を絞る条件

要約すると

  • カメラ平面から見て同じ側に有る:8点から4点へ(ここまではOpenCVがやる)
  • Reference Point Visibility:4点から2点へ
  • のこりは...?:解読中

だめだ.眠いのでまた後で書きます.

極配置の実装:アッカーマン法のMATLAB実装

序論・参考文献

制御工学の授業で一度は計算させられる極配置ですが MATLABにはplaceなる関数があって,実務を始めてからは全く手計算をしなくなります。

よくある疑問とエラー

授業では忘却の彼方にありますがB行列のrankより高い極配置はできないというエラーは誰しも見たことがあるかと思います。 以下のような現象です。

A = [1 2;3 4];
B = [1; -2];
pole = [-3,-3];
place(A,B,pole)

Bのランクは1ですので,このコマンドを実行すると以下のエラーを起こします。

エラー: place (line 78)
"place" コマンドは、rank(B) より大きい多重度を持つ極を配置できません。

そういえば中身どうなっているんだ?Cとかで実装するとどうなるんや?という疑問がありませんか。 MATLABのは論文読んでないのでまだ実装しませんが, 本稿で紹介するアルゴリズムを用いた場合はこの場合でも,ほぼ極配置ができます。

  -3.0000 + 0.0000i
  -3.0000 - 0.0000i

ひょっとしたらちょっと誤差があるのかもしれない。

アッカーマン法

アッカーマン(Ackermann)はこの人?某ヒロインが検索汚染してきます。

アッカーマン法の詳細な記述についてはなんとwikipediaが一番スッキリしていて見やすくなってます。(英語)

原著の論文はこれっぽいです。

J. Ackermann. Der Entwurf linearer Regelungssysteme im Zustandsraum.
Regelungstechnik und Prozessdatenverarbeitung, 7:297–300,
1972.

参考資料

どこかの授業スライドですがこれが具体例込でわかりやすいです。 また,参考になりそうなスライドがありました。(要DL,MIMOや不可制御系の時にどうする的なのが丁寧に書いてあったスライド。わかりやすい5-10分で読める。)

Outline

  • Step1. 求めたい極を展開して特性方程式にする
  • Step2. 可制御性行列を求める
  • Step3. 以下の通りに計算する(雑)

f:id:ossyaritoori:20180516102843p:plain 添付は小林H23スライドより拝借。

MATLABコード

多項式展開が思ったより実装が面倒そうだったので一般化してないですが例えば2次元の場合は次の通り。

function F = placeAckermann2d(A,B,pole)
p = - pole;
d1 = p(1)+p(2);
d0 = p(1)*p(2);
X = A^2 + d1*A + d0*eye(2);

Uc = [B A*B];

F = [0 1]/Uc*X;
end

これで冒頭の結果を得ることができます。Bのrankが落ちていても重根極配置できるので試してみては。 この程度の計算であれば行列と逆行列計算ライブラリさえあればCやPythonでも実装余裕ですね。 MPCができるんだからDSPでも逐次的な極配置とかできるやろ。多分。

MATLABがこれを採用していない理由が知りたい。(なにか欠点があるのか?) → 入力自由度が増えた時に対応できないということのようです。

MATLAB版placeでは何をしているか

アッカーマン法ではMIMOの時に行列のサイズがおかしくなります。

従ってMATLABが公式で採用している手法はこんなかんじのようで。 f:id:ossyaritoori:20180516131828p:plain

Nullspaceの推定にsvgを使うので計算量には不安があるが,見事に動作します。 この場合自由度の足りない重根極配置をするとVの正則性が失われるので最初に出たようなエラーが出るということのようです。

function F = placeMIMO2D(A,B,pole)
[u1 w1 v1] = svd([pole(1)*eye(2)-A B])
[u2 w2 v2] = svd([pole(2)*eye(2)-A B])
en = size(w1,2)
VV = [v1(:,3:en) v2(:,3:en)];
F = VV(3:en,:)/VV(1:2,:)
end

環境構築しないでTexを使う (sharelatex VS Overleaf)

環境構築に興味のない人にTexを勧める際の選択肢としてsharelatexOverleafを試したメモ書き。 どちらも日本語入力には工夫が必要なのでその覚書として。

Overleafの日本語設定

以下の記事に習えば良い。 doratex.hatenablog.jp

platexを入れるためには次のlatexmkrcファイルを作成する。

$latex = 'platex';
$bibtex = 'pbibtex';
$dvipdf = 'dvipdfmx %O -o %D %S';
$makeindex = 'mendex %O -o %D %S';
$pdf_mode = 3; 

テンプレ

一部人のコードを借りているが,最低限必要なプリアンブル構成を記す。 amsmathとかは必要に応じていれて。

\documentclass[10pt,a4paper,oneside,twocolumn,fleqn,dvipdfmx]{jsarticle}
\usepackage[utf8]{inputenc}
\usepackage[ipaex]{pxchfon}% For japanese font

\usepackage[dvipdfmx]{graphicx}
\usepackage{subfigure}


\usepackage{geometry}
\geometry{left=25mm,right=25mm,top=25mm,bottom=25mm}

%本文
\begin{document}

\twocolumn[
    \begin{flushright} 
        右寄せ内容
    \end{flushright}
    \centering{
        \LARGE{タイトル}
    }
    \section*{
        \centering{Abstract}
    }
    \raggedright{
    Write abstract here.
    }
    \vspace{2ex}
]

\section{序論}
はろーわーるど

%参考文献
\small
\bibliographystyle{IEEEtran}
\bibliography{ref} %ref.bibを準備
\normalsize

\end{document}

所感・評判

使い勝手は悪くない感じ。コンパイル速度にも問題があるらしいが現状そんなに課題を感じない。 ちょっとレイアウトがごちゃごちゃしているのが好みによるかもしれないが。

今の所一番気になるのは - 無料版だと文章を秘匿できない ということ。Reference

ちゃんとした論文を書く頃にはOverleafは卒業してもらうか課金してもらう感じになるだろう。

Sharelatexの設定方法

Sharelatexはそもそもopenソースになっており,自前でサーバを立てて作業することが可能になっている。

日本語設定(platex使用)

設定ボタンからLatexを選択すれば Overleafの時と同様に日本語の設定が可能だ。 というわけで上の章を見て。

日本語設定とテンプレ(XeLatex使用)

設定ボタンからXeLatexを選択。documentclassで \documentclass[10pt,xelatex,ja=standard]{bxjsarticle} のように選択すればいいらしい。 なお,個人的にはフォントに違和感がある。

\documentclass[10pt,a4paper,oneside,twocolumn,fleqn,xelatex,ja=standard]{bxjsarticle}
\usepackage[utf8]{inputenc}

\usepackage{geometry}
\geometry{left=25mm,right=25mm,top=25mm,bottom=25mm}

%本文
\begin{document}

\twocolumn[
    \begin{flushright}
        日付とか書くスペース
    \end{flushright}
    \centering{
        \LARGE{タイトル}
    }
    \section*{
        Abstract
    }
    \raggedright{
    Write abstract here.
    }
    \vspace{2ex}
]


\section{Introduction}
日本語と欧文フォントに違和感。

\end{document}

出力結果はこんなん。 f:id:ossyaritoori:20180509182106p:plain

なお,秘匿性についてはOverleafよりはマシそうである。 tex.stackexchange.com

どっちがいいの?

初心者の練習用としてはどっちでも良さそう。@2018年5月所感

platexに慣れているのでOverleafの方が直感的に使えそうな気もするが,友人が勧めてくるのはsharelatex。この2つは統合されようとしているらしい。 フォントとかの設定に違和感もあるがここに拘れるやつはそもそもローカルの環境構築に苦戦しないだろう

個人的批評

ここで紹介したほかにはCloud latexというサービスもあるがまだ?ベータらしい。 www2.math.ritsumei.ac.jp

文書の秘匿性を重視するなら今後は - sharelatex を推していくことになるんだろうか。

結局最終的にOverleafと同様の手順でplatex使えたのでsharelatex勧めます。

GoogleMapから地図をダウンロード(緯度経度を指定)

今後はてな記法やめてMarkdownで書きます。 GoogleMapを緯度経度で指定した範囲切り抜いて保存したいんですけど意外とかゆい所に手が届かないんですねー。 いろんな手法をまとめてみました。 (書いてて途中で飽きたのでいつか書き直します。) 関係ないけどGPSとか特定の緯度経度の点を地図と重ねたいならここを使うと良いでしょう。

GoogleMapから地図をダウンロードする方法

GoogleMapから画像をダウンロードしたくなる時ってありますよね。 調べた結果以下の3つの候補があります。 一番上が一番手軽な方法で徐々にめんどくさくなります。

スクリーンショット

これはなにかとよく使う基本技能ですね。 http://121ware.com/qasearch/1007/doc/answer/image/017/017976/017976h.png

MacとかLinuxを使えるリテラシーがある人はこの辺は適当なソフト使うなりググるなりしてください。

GoogleのMymap機能を使う

Google公式で画像のダウンロード機能があります。 これはスクリーンショットより高精度な画像を取得できるのでとても便利です。 この項はここの和訳です。

  1. 次のMy Maps Google websiteのURLを開く。
  2. 新しい地図の作成 を選択する。Googleアカウントへのログインを要求されるでしょう。
  3. GoogleMapと同様に場所を調べて良い感じに調整
  4. レイヤーを追加を押した後に黄色く塗りつぶした3点リードのメニューを開き「地図の印刷」を選択。 f:id:ossyaritoori:20180425212009p:plain 最終的にPDFやPNGで吐き出せます。

フリーソフトを使う

調べきれてないのでなんかあったら教えてください。

GoogleMapDownloader

名前そのまんまです。 googlemapdownloader.weebly.com

わかりやすい解説(英語)もあり,安定して使うならこっちかなぁという感じです。 www.youtube.com

結局使ってないのですが感想あったらコメントでください。 多分結構使いやすそうです。

GoogleAPIを叩いて画像を入手する

Google様の機能を使うとこの手のことは簡単にできます。 なるべく簡単な順に列挙していくつもりです。

Keyを入手しよう(要Googleアカウント)

大前提として「鍵(キー)」という個人認証手段的なものが必要です。 Googleにサインインしていれば例えば以下のページにいって「キー」の取得を押してぽちぽち進めれば鍵を入手できます。 Simple Map  |  Google Maps JavaScript API  |  Google Developers

なくすとアレなのできちんとメモしておきましょう。 f:id:ossyaritoori:20180425205536p:plain

URLを直に打って画像を入手

Google Static Mapsというのがあります。 Google Static Maps デベロッパー ガイド  |  Google Static Maps API  |  Google Developers 以下のコードをURL欄に打ち込むと該当する地域が表示され右クリックでダウンロードできます。

https://maps.googleapis.com/maps/api/staticmap?center=Brooklyn+Bridge,New+York,NY&zoom=13&size=600x300&maptype=roadmap&markers=color:blue%7Clabel:S%7C40.702147,-74.015794&markers=color:green%7Clabel:G%7C40.711614,-74.012318&markers=color:red%7Clabel:C%7C40.718217,-73.998284&key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk

またGoogle Maps Tile APIというものを見るに有望そうな関数が存在しました。JSで書くので僕もよくわかってないんですが… developers.google.com

ここでは次のようなリクエストを呼んで東西南北の範囲を指定できるのでこれは確実にCroppingできるでしょうね。

https://www.googleapis.com/tile/v1/viewport
  ?session=session token
  &zoom=zoom
  &north=north&south=south&east=east&west=west
  &key=YOUR_API_KEY

なおzoomというのはZoomレベルというやつでして0-23まであり,0が一番でかいです。(地球全体うつすレベル。) Zoomレベルと実際の値がどう対応しているのか計算方法をここの人がやってくれています。

Pythonスクリプトでダウンロード

とりあえず以下のスクリプが有効でした。(依存パッケージあり) A python script to download high resolution Google map images given a longitude, latitude and zoom level. (Works with Python 3) · GitHub

しかし,これはどうも中心の緯度経度を与えてそれが含まれているタイルを取得してきて統合というような動きのようです。 さっきのAPIの知識を使ってちょろっと書き換えれば境界クロッピングも行けそうなもんですが…

JavaScriptで書く

JS全く書けないのでコピペのつなぎ合わせで次のコードが有効であることを確認しました。 Xmin,Xmax,Ymin,Ymaxの所に経度と緯度の下限上限を入れておいてね。

var map;
function initMap() {
  map = new google.maps.Map(document.getElementById('map'), {
    center: {lat: -34.397, lng: 150.644},
    zoom: 8
  });
  var southWest = new google.maps.LatLng(Ymin,Xmin);
    var northEast = new google.maps.LatLng(Ymax,Xmax);
    var bounds = new google.maps.LatLngBounds(southWest,northEast);
    map.fitBounds(bounds);
}

これで表示されることには表示されるんですが,,,ダウンロードの手法がまだわかりません笑 だれか実装してw

総括

2018年記事作成時にはとりあえずマーカを着けて手動で画像をトリミングをした後に調べましたが有望そうなのはフリーソフトくらいでしょうか。 座標を指定してダウンロードするにはJavaScriptやそのGoogleAPIの方に熟達したほうが良いかもしれません。

わかった?こと?

どうもGoogleMapは地図画像を0-23までの24種類のスケーリングで保持していてそれぞれの画像は256×256で保存されている?ようです。(←所感により間違っている可能性有) あとは緯度経度からメルカトル図法の地図に座標変換して,対応する画像をサーチして…とかやっているんでしょうかねぇ。 GoogleMapと戯れた食後でした。

MATLAB LiveScriptで報告書作成

MATLAB LiveScriptとは

ソースコードと説明用の式や図をInteractiveに表示するMATLABの新たな表示形式です。
以下がMATLAB公式の説明。
ライブ スクリプトとは - MATLAB & Simulink - MathWorks 日本


Pythonをやる人にはjupyterみたいなもんといえばわかるでしょうか。
MATLABをjupyterで使うということもできますがPython環境を準備したりが面倒でしたよね。

なお,公式には2016aから対応しているとのこと。
持ってない人は買いましょう。学生は一万円くらいで2ライセンス買えます。(生協・Amazonからの購入。生協にあるなら生協の方が安いかと。)

MATLAB2018のStudent版はDeep Learningを含む機械学習等にも力を入れているので以前のバージョンを持っている人も試してみると良いかもしれません。

先人の調査所感

なお,興味深い調査所感が以下にあります。実行速度が半分になる可能性があるのはたしかに厄介なのと,図を含めたファイルサイズが今の所の懸念点というのは有益な情報でした。
qiita.com

実際に書いてみよう

Jupyterのような使い方をわかっている前提で書きますが,要はテキスト用の箇所とコードを記述する用の箇所を切り替えているだけなのではじめての人でもすぐ馴染めると思います。

ファイルの作成

ライブスクリプトの拡張子はです。MATLAB LIVE Scriptの略なんでしょう。
Control+Nで作成し保存時に拡張子を指定するか,GUIメニューでライブスクリプトを選択すれば良いです。
なお,「edit **.mlx」というふうにコマンドラインで実行しても作成できるそうな。

よく使うショートカット

起動してぽちぽちいじっているとコードを書くところと説明を書くところがこのように違うことがわかります。
f:id:ossyaritoori:20180416224717p:plain

具体的に使いそうなショートカットは

  • Alt+Enter:コード/テキストの切り替え
  • Ctrl+Alt+Enter : ブロックの改行。段落替え。
  • Ctrl+Alt+T:標準テキスト
  • Ctrl+Alt+H:見出しテキスト
  • Ctrl+Alt+L:タイトルテキスト
  • Ctrl + Enter

となっています。

流れの例として,
1. Alt+Enterで「テキストモードにする」
1. Ctrl+Alt+Hで「見出し」モード。見出しを書く。
1. Ctrl+Alt+Tで「本文」モード。本文を書く。
1. Alt+Enterでコードに切り替えたり,そのまま説明を書くことを繰り返す。
1. Ctrl+Enter で段落を実行。問題なければ Ctrl+Alt+Enter で段落改行。

こんな感じでしょうか?
ライブ スクリプトのセクションの実行 - MATLAB & Simulink - MathWorks 日本

図や実行結果を載せる

普段,コマンドウィンドウに出てくる実行結果や図は右側のスペースに出てきます。
f:id:ossyaritoori:20180416230043p:plain

図をスクリプト内に表示させたいときは[表示] タブの [レイアウト] セクションで、[インラインで出力] ボタンをクリックします。
ライブ エディターでライブ スクリプトを作成 - MATLAB & Simulink - MathWorks 日本

一応実行コードを載せときます。

% sampling
ST = 0.01;

% Simulation Length
len = 100
time = 0:ST:ST*(len-1);

figure
plot(time)

数式を挿入

数式を呼び出すショートカットはこちら。「挿入」タブからも呼べます。

  • Ctrl+Shift+E: 対話式数式エディタ(要はWord風)
  • Ctrl+Shift+L: Latex 形式での挿入

Latex形式はマクロも難しそうだし,ちょっと不便しそうです。
流石に行列を書くめんどくささには理解を示してくれたらしく,以下のようにコマンドを呼ぶことで本家より若干簡略化して書けます。

{\bf A} = \pmatrix{a & b \cr c & d}

f:id:ossyaritoori:20180416235758p:plain

以前にも似たようなことをやりましたね。Jupyterならマクロを書けるんですが…
ossyaritoori.hatenablog.com

エクスポート

個人メモではここまでで十分ですがこれを誰かと共有する際にはできるだけ文章形式で出力したいです。
ライブ スクリプトの共有 - MATLAB & Simulink - MathWorks 日本

正規手段で

[ライブ エディター] タブで、[保存] 、 [PDF にエクスポート]、[保存] 、 [HTML にエクスポート]、または [保存] 、 [LaTeX にエクスポート] を選択します。

PDFでは以下のような感じになります。
f:id:ossyaritoori:20180417001812p:plain
明朝っぽいフォントで出るんですね。

なお,Latexで出力しても行列まわりの変な記法は補正されずにErrorが出ます。
手間が必要な分,使い回しには注意が必要です。
コンパイル後の見た目はこんなん。
f:id:ossyaritoori:20180417002439p:plain

Microsoft Print to PDF

上記のプラグインがあるならば,「印刷」から上のプラグインを選択してノートを印刷できます。
f:id:ossyaritoori:20180417001343p:plain

こちらの方がゴシックぽい字体で字体としては好み。ただしページ番号が出ないです。

総括

Jupyterと比べてLatex周りはやや貧弱なきらいもありますが,直接PDFがきれいに出力できる点などは良い点です。
いろいろ考えた結果,MATLABというソフトから動かずにこういった文書作成ができるのはメリットなのでそれを享受するのは悪くないかと。
つまり資料作成用としてはまぁまぁ使えるのではないのでしょうか。

Keras & Tensorflow (GPU有)の環境構築 on Windows with Anaconda

GPU付きのPC買ったので試したくなりますよね。
ossyaritoori.hatenablog.com

事前準備

  • ハードウェア要求

Geforceを積んでいる高性能なPCを持っていること。
深層学習、特にCNNはかなり時間がかかります。

入れるもの

ソフトウェア間の依存関係に注意。
以下のサイトをよく確認してください。CUDAのバージョンは合っているか?CUDNNは?Pythonのは?これら全部合っていないとうまくいきません。
Installing TensorFlow on Windows  |  TensorFlow

具体的な環境例(2018年3月現在)

  • Tensorflow1.6
  • CUDA 9.0
  • CUDNN 7.0
  • Python3.5

これらをすべて把握している必要があります。

CUDA関係のインストール

CUDAのツールキットをダウンロード。以下は9.0のもの。間違えないように。
developer.nvidia.com

以下のpathにもろもろが入るはずです。

CUDNNのダウンロードはNVIDIAのサポートに入ることが必要。
developer.nvidia.com

ZIPを解凍した後に、 'cudnn64_7.dll' の入っているところをpathに追加します。
Pathの通っているところに当該ファイルを置いても良いかもしれませんが。

Anacondaのインストール

いつもの。こだわらないなら適当にクリックし続けていれば入ります。
www.anaconda.com

今回入れたときは、環境変数が登録されてなかったので、
「Anaconda\」と「Anaconda\Scripts」、「C:\ProgramData\Anaconda3\Library\bin」にPATHを通しておいてください。

Tensorflowのインストール

仮想環境の構築

仮想環境をたてます。AnacondaPromptからコンソールを呼んで

conda create --name=tf35 python=3.5

とします。仮想環境名は「tf35」です。次のようにして仮想環境へと入ります。

activate tf35

インストール

GPUバージョンを入れるので次のように。
公式のとちょっと違いますが、おそらく等価です。

pip install --ignore-installed --upgrade tensorflow-gpu

以下の記事を参照。
qiita.com

動作確認

pythonを起動し、次のようなプログラムを回せばいいです。

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

Hello world

出会ったエラー達 Tensorflow編

CUDNNのPATHがない

動作確認時に超親切なエラー文が出てきた。
CUDNNのpathを設定するとのこと。

ImportError: Could not find 'cudnn64_7.dll'. TensorFlow requires that this DLL be installed in a directory that is named in your %PATH% environment variable. Note that installing cuDNN is a separate step from installing CUDA, and this DLL is often found in a different directory from the CUDA DLLs. You may install the necessary DLL by downloading cuDNN 7 from this URL: https://developer.nvidia.com/cudnn

CUDNNのbinをPathに加えて完了。

初回実行時?の動作

初回セッション立ち上げ時に次のような表示が出てきました。まぁ特に問題なく成功したんですが。

2018-03-27 12:11:06.853398: I C:\tf_jenkins\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\core\platform\cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2
2018-03-27 12:11:07.976741: I C:\tf_jenkins\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\core\common_runtime\gpu\gpu_device.cc:1212] Found device 0 with properties:
name: GeForce GTX 1050 major: 6 minor: 1 memoryClockRate(GHz): 1.493
pciBusID: 0000:01:00.0
totalMemory: 4.00GiB freeMemory: 3.30GiB
2018-03-27 12:11:07.976947: I C:\tf_jenkins\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\core\common_runtime\gpu\gpu_device.cc:1312] Adding visible gpu devices: 0
2018-03-27 12:14:09.136681: I C:\tf_jenkins\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\core\common_runtime\gpu\gpu_device.cc:993] Creating TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 3033 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1050, pci bus id: 0000:01:00.0, compute capability: 6.1)

Kerasのインストール

Tensorflowをバックエンドに動くさらに高級な関数群を提供しているのがKeras。どうも本家TensorflowにもKerasの一部が移植されているようですが気にせずインストールします。
僕が試したのはこれだけ。

pip install keras

本当はAnaconda環境ならcondaで探して入れたほうがいいと思っているのですが面倒臭くなってpip使ってます。
Opencvもpipで入れて動作したしな…


<参考:CondaでOpenCVをいれるには>
ossyaritoori.hatenablog.com

MNISTのサンプルコード実行

Tensorflow編

以下の人のコードを借りました。
qiita.com

#TensorFlow Deep MNIST for Experts
#https://www.tensorflow.org/get_started/mnist/pros

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

import tensorflow as tf
sess = tf.InteractiveSession()

x = tf.placeholder(tf.float32, shape=[None, 784])
y_ = tf.placeholder(tf.float32, shape=[None, 10])
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
sess.run(tf.global_variables_initializer())
y = tf.matmul(x,W) + b
cross_entropy = tf.reduce_mean(
    tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

for _ in range(1000):
  batch = mnist.train.next_batch(100)
  train_step.run(feed_dict={x: batch[0], y_: batch[1]})

correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print(accuracy.eval(feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

def weight_variable(shape):
  initial = tf.truncated_normal(shape, stddev=0.1)
  return tf.Variable(initial)

def bias_variable(shape):
  initial = tf.constant(0.1, shape=shape)
  return tf.Variable(initial)
def conv2d(x, W):
  return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')

def max_pool_2x2(x):
  return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],
                        strides=[1, 2, 2, 1], padding='SAME')

W_conv1 = weight_variable([5, 5, 1, 32])
b_conv1 = bias_variable([32])
x_image = tf.reshape(x, [-1,28,28,1])
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1)
W_conv2 = weight_variable([5, 5, 32, 64])
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2 = max_pool_2x2(h_conv2)
W_fc1 = weight_variable([7 * 7 * 64, 1024])
b_fc1 = bias_variable([1024])
h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
keep_prob = tf.placeholder(tf.float32)
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
W_fc2 = weight_variable([1024, 10])
b_fc2 = bias_variable([10])

y_conv = tf.matmul(h_fc1_drop, W_fc2) + b_fc2

cross_entropy = tf.reduce_mean(
    tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
sess.run(tf.global_variables_initializer())

for i in range(20000):
  batch = mnist.train.next_batch(50)
  if i%100 == 0:
    train_accuracy = accuracy.eval(feed_dict={
        x:batch[0], y_: batch[1], keep_prob: 1.0})
    print("step %d, training accuracy %g"%(i, train_accuracy))
  train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})

print("test accuracy %g"%accuracy.eval(feed_dict={
    x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))

実行結果はコピペ忘れたので載せませんが20000回くらい学習して99.05%の正答率だったかと。

Keras編

とりあえず、ここのコードを丸コピして性能を確認しました。
github.com


コードをサラッと読むと簡便性が理解できるでしょうか。
CNNのアルゴリズムの詳細に突っ込まないうちはKerasで遊びたいと思います。

実行結果

6万回の学習を12Epochやって以下の結果を得ました。

Test loss: 0.02737301055721746
Test accuracy: 0.9913

1epochあたり17秒くらいで3分もかからなかったという印象です。
CPUでやったときは20分位かかったので5倍は早くなっているんじゃないでしょうか。

PCにかかる負荷など

4GあるGPUの3/4を専有していますね。CPUも多少働いています。メモリの方はChromeのせいです。
f:id:ossyaritoori:20180327212506p:plain

余談ですが新しく買ったZenbook Proで学習しましたがファンが爆音で鳴ることもなくスムースに終わったので活躍を期待できるんではないでしょうか。(ステマ

ASUS UX550VD-7700 を買った所感とセットアップ

製品紹介

2017年秋に出たASUSから出るZenbookシリーズのある種フラグシップモデルを購入。

推しポイントは

  • 第7世代Corei7 CPU
  • Geforce 1050Ti GPU搭載
  • メモリ16GB、容量SSD512GB
  • 美しいボディと比較的軽量な点

であり、それでいてコスパはかなり良さげです。

そして故障率などが比較的少ないASUSのブランドにも魅力を感じた結果でもあります。
VAI●とか一年に一回壊れるからな

巷のレビュー

購入を考えていたときには実際の使用感などが気になるものです。

例えば以下のレビューが参考になりました。
ZenBook Proレビュー 想像以上のコスパと性能に驚愕

実際の外観など

箱は結構でかく重いです。
https://lh3.googleusercontent.com/7AvHCtciBDkTU9Nr71y10EEjxhTHsaAFSZgpwyJ7erylhdrpv1CSMCW98Zr8DsXTuuVT1Hm31acAL83HgpalGZXJPYJbsAiolNsQkB6_kW7TWv8oT_LEqpedibXiDe0I6PscMSsmYY5vj847rt_bUIY3Ml_NUpxouVHBir4tbalDNIXy9LLsKP-ZJS34Ft4_JM_y5uCewO_p35fB7KmlYJF7ZuVKFAR8rKRfWzaYaOtmnF_a44YVWC8nxhxdlWoIKO6jy3Y9wsq3gMuXm7b7e1M2MI4jodPST6fvC2Yz2xmhUMbxMkHLc9-j5kA0qdbkIDmnwp6VaNQDH4KUqr0uIVjYrReMqTZXb6RdfIrbMF2nZXov-k4Gsy3UCPoVc_-1FZ9Svwzo_sc82MHxdKCZyVZWDA47qtBxHqRkDrH5j391CxwqLDa6dJjEBEbK47-SUC4oBD-P6c3PjoKp2om_x9SQJ-H7k8gQc10XZ568lEyTUXsD8NiUEqv1qSi85GAKevHroC8AnTdG2ohcxrowl7JrOW14UTxiAmSqOpytwCCD4OZciZ7xS7KkPCsVwF2SYgxRGeVhndCyIhlpqtWf-D7xgQ4JwguPIiqJpDg=w1224-h918-no

本体の大きさ15.6インチは思ったよりも大きく、重さ1.8kgの本体と大きな急速充電器の組み合わせなので持ち運びはかなり大変そうです。
薄くて広いタイプなので傷つけるのが怖く、以下のケースを購入しました。

気になった点

  • 内側では手の脂とかが結構目立っちゃう
  • キーボードの間隔が広めなためEnterやBackSpaceが遠い
  • トラックパッドの使い勝手がやや悪いのでマウスがあったほうがよい

些末なことが多く慣れ次第なので、買って使ってみた所感としては非常に良いと言えるでしょう。
電池の持ちも最低でも6時間はもったので問題なく使えると思います。(Geforce未使用時)

起動後のセットアップ

つけた直後

  • 音声ガイドが爆音

例のごとくCortanaによる爆音の案内が始まります。
最初の音量はなんと60%!クソうるさいので場所柄気になる方はイアホンなどを指してからやるべきかと。

  • Windowsの更新が非常に長く遅い

初期セットアップの常ですがWindowsの更新確認などが非常に遅く正直最初のユーザエクスペリエンスは最悪でした。
半日は使えないと思っておいてください。

不要なソフトの削除

どんなアプリを押し付けてくるか若干気になりましたが普通に強制起動が煩わしいので削除です。

  • Macafee関連

Macafee関連はなんかやたらとバックグラウンドで動いており、ネットでも評判が良くないので消します。
これは自分で代替のセキュリティソフトを用意できたからやったのであって、最初いきなりこれを消すこともないかもしれません。

他のASUS系のソフトはバックグラウンドで動いているわけでもないようなので無視しています。

インストールするソフト

G社のしもべなのでChromeIMEを入れます。GoogleIMEになれると正直あまりIntelIMEを使いたくなくなります。
あと、全角スペースを絶滅させる設定を忘れずに。

趣味と仕事用
そういえばGithubのPrivateリポジトリを申請しました。
無料でGitHubのprivateリポジトリを作る方法 - Qiita

いつものこれです。
TeXインストーラ 3
TexStudioとSumatraPDFを入れてみたり。
ossyaritoori.hatenablog.com

  • CUDA

CUDAですが後述の機械学習の遊びの環境の都合上、最新ではないバージョンを導入します。
Geforce1050Tiを積んでいるのでちょっとした学習程度ならこなせるのも魅力です。もちろんゲーミングにも(オーバースペックでしょうが)

機械学習の環境についてはこちらを参照
ossyaritoori.hatenablog.com

総括

カタログスペックと軽く使用した感想として総じて20万円台のPCとして十分な性能を持っています。
スタイリッシュなデザインと相まって持ち歩いてドヤ顔したい機体ですが、重さと大きさが若干ネックなので使用シーンをこれから厳選していこうかと思います。