粗大メモ置き場

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

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として十分な性能を持っています。
スタイリッシュなデザインと相まって持ち歩いてドヤ顔したい機体ですが、重さと大きさが若干ネックなので使用シーンをこれから厳選していこうかと思います。

Git cloneでPermission Denied(publickey)の対処法< SSH Keyを設定する >

jetsonのセットアップ中パッケージのCloneに困ったという記事です。

より具体的にはYOLOv2のROSバージョンを使おうとしたのですがgit cloneでPermission Deniedと喰らいました。
原因はjetsonのSSHキーを設定していなかったというだけだったのでわかっている人は見なくても良いです。

小噺:YOLO for ROSについて

YOLOと言えば2016年,2017年とCVPRにて発表されたSingleShot系の物体検知&抽出 アルゴリズムです。
開発者のサイトはこちら。
YOLO: Real-Time Object Detection

ROSでの実装ですが,私は以下のDarknetを用いてきました。
github.com
感覚的に最もpopularな実装が上のやつですが,ノードでAdvertiseするのが分類名と確率だけで複数のBoundingBoxの情報を出してくれないという不便さがあったと記憶しています。

その点,以下の実装は物体位置と確率がきちんと出力としてサポートされているので助かります。
まだまだ,自分で調べて改造する余地はありそうです。
GitHub - ThundeRatz/ros_yolo2: YOLOv2 integration with ROS


他にも信号機の抽出に特化したやつなどもあり,インターネットの集合知に感謝してもしきれません。
github.com

GitHubでのSSHキーの設定

SSHキーの設定では以下のサイトにお世話になりました。
monsat.hatenablog.com

秘密鍵の作成手順

まず,PC内の秘密鍵作成手順です。(一応Ubuntu16の環境を基準に話しします。)

簡単には次のようなコマンドをうちます。メールアドレスは自分のものにしてください。

ssh-keygen -t rsa -C "your_email@example.com"

入力後,以下の3つを入力要求されますが全部何も考えずにEnterして問題ないそうです。

ちゃんと勉強したければこちらを参考に。
SSHなるものをよくわからずに使っている人のための手引書 - Qiita


その後GitHubのサイトでProfile→SSH Keysの欄から「~/.ssh/id_rsa.pub」内の公開鍵を登録します。
幾つかのコピー方法があるらしいですが意識が低い私は次のコマンドで済ませました。
誰かしかってやってください。

cat ~/.ssh/id_rsa.pub

動作確認

Bash

ssh -T git@github.com

と入力し,Autorizedと出ることで動作が確認できます。

YOLOの改造はまた今度。

ポモドーロに用いるタイマーソフトの比較

ポモドーロとは

料理のことではなく,ポモドーロテクニックと呼ばれる作業時間と短い休憩を交互に繰り返すことで,作業量と集中力を管理する手法のことです。
生産性がグングン上がる!「ポモドーロ・テクニック」って知ってる? | リクナビNEXTジャーナル

一般に25分の作業と5分の休憩を交互に繰り返します。

ポモドーロは使えるか?

ADHDの気がある自分が一人でやってもあんまり効果は感じないです。集中できるときは長続きするしそうでない時は全然だったりのムラがあるタイプです。

しかし,これをラボ等で集団でやると全員が一斉に集中するので部屋が静かになり,自然と集中すべき環境が醸成されるのでなかなかどうして捗った気になります。(効果の程は未検証)

ポモドーロ & プロジェクタ

ポモドーロを手軽に導入したい場合,スマホのアプリをインストールして大音量で鳴らすのが手っ取り早いです。
この場合持ち主以外は残り時間などをチェックできなくて面倒です。

そこでプロジェクタに写すことを考えます。
単焦点プロジェクタは場所を取らなくて便利。

要求

そこで今回の要求としては次の2つがメインになります。

  • プロジェクタに現在の時間等が大きく映る。
  • 終了時や開始時にきちんと音が鳴る。

各ソフトの所感

<名称:評価>の形式で列挙します。

FREE Countdown Timer:▲

フリーソフト
FREE Countdown Timer - CountdownKings

非常にクールで見やすいカウント画面と直感的に操作できる点が素晴らしい。
https://www.countdownkings.com/wp-content/uploads/03_countdown_timer_clock.png
https://www.countdownkings.com/wp-content/uploads/04_countdown_timer_end.png

最大の欠点は音が鳴らせないことで,非常におしい存在になっています。
なお,スマホのアプリはきちんとそこの所が改善されているらしいのでおすすめです。
www.countdownkings.com

もっというとPC版にも音の鳴らせる上位ソフトがありますがそちらは有料のよう。
Minimalistic Countdown Timer Extended for PC & MAC
19ドル前後とあまり安くないので不採用。

Tomatime:○

Windows10のアプリから入手したフリーソフト
tomatime を入手 - Microsoft Store ja-JP

音も鳴るし,それなりにわかりやすいUIで使い勝手の良い物になっています。
https://store-images.s-microsoft.com/image/apps.37891.9007199266358781.9785c6c4-81ba-4f0a-906e-38406fa3c5a1.f2ccde65-43a9-41eb-8537-4cc54ed74e4d?w=471&h=305&q=60

欠点は完了時等に鳴らす音が選択できない(嫌な音ではない)のと,ループ駆動できないこと。
ポモドーロを回す度に操作を要求されます。

それ以外は満足。

Focus to Do:◎

こちらもWindows10のアプリから入手したフリーソフト

Focus To-Do: ポモドーロ技術 & タスク管理 を入手 - Microsoft Store ja-JP

サイトから持ってきた画像ですが非常にシンプルでプロジェクタ向き。
https://store-images.s-microsoft.com/image/apps.37755.14049653041316721.db870f08-3704-415d-ae1d-c567f9593aba.e6aa1bb1-2486-4258-bc2a-ed6b73181360?w=471&h=265&q=60

また,作業毎にポモドーロの数を設定して自動ループを組むことができ,サインインしたら作業経過を共有することも可能です。
f:id:ossyaritoori:20180228012448p:plain

あと,開始時と終了時の音が自由にいじれるのも良いです。(選択肢を増やすには課金が必要。よくできてますね。)


ということで,こちらを採用して行こうと思います。

番外編

Webアプリ Tomato Timer:○

Web上で走らせるなら次のサイトが使い勝手良かったです。
Tomato Timer

プロジェクタに投影しないならこれで十分かもしれない。

Chrome アプリ Tomato Timer

自分でやるならChromeアプリ版のTomato Timerが良いでしょう。
chrome.google.com

Chromeさえついていれば計測ができます。
https://lh3.googleusercontent.com/C5ORUsqYKQYLoT-mV5hKyaJwJONvDFqIO6Yi2YSTfdNp_y6f4MtafgWQS_Qkztkzo7-vLvc0Mt0=w640-h400-e365

黙れナレーター(Windowsのナレーター機能を完全封印する)

Introduction

メロスは激怒した。かならず、かの 邪智暴虐 ( じゃちぼうぎゃく ) のナレーターを除かなければならぬと決意した。メロスにはコンピウタがわからぬ。メロスは、ただの学生である。けれどもWindowsの無用なクソ機能に対しては、人一倍に敏感であった。

邪智暴虐のナレーター

今回の殲滅対象である。降臨方法は「Ctrl」+「Windowsキー」+「Enter」である。
降臨後はSAN値がすり減る前に速やかに再度同じコマンドをうって消滅スべし。
https://support.microsoft.com/ja-jp/help/17173/windows-10-hear-text-read-aloud

ナレーターの倒し方

Windows8の場合は以下の記事を参照。
うっとうしいWindowsの「ナレーター」を完全に無効化する方法 | TeraDas-テラダス

本記事ではWndows10のナレーターを討伐する。
Windowsキー」+「r」を押して以下のwindowを出現させ「regedit」とうってEnter。
https://www.top-password.com/blog/wp-content/uploads/2017/04/regedit.png

以下のようなレジスタの「HKEY_CURRENT_USER\SOFTWARE\Microsoft\Narrator\NoRoam」へとたどり着く。
https://www.top-password.com/blog/wp-content/uploads/2017/06/disable-narrator-shortcut.png

赤で囲ってある箇所をダブルクリックして以下のように値を書き換える。
https://www.top-password.com/blog/wp-content/uploads/2017/06/WinEnterLaunchEnabled.png

これでナレータのショートカットを無効にしたことになる。

ナレーターは二度死ぬ

ショートカットを無効にした所で奴の本体は生きている。追い打ちをかけるべし。
「C:\Windows\System32」からNarrator.exeを探し出す。

右クリックで「プロパティ」を開くと以下のような画面が出る。

「セキュリティ」のタブを開いて「詳細設定」をクリック。
f:id:ossyaritoori:20180222172815p:plain

以下のように赤枠がUsersになっていれば「OK」を押して戻る。
「TrustedInstaller」など他のものになっていれば権限を変更しに行く。
f:id:ossyaritoori:20180222172600p:plain

権限を変更するには「編集」を押して出て来る以下の画面をひらき,赤枠に「Users」とうったのちに右側の名前を検索をタッチ。
うまく行けばさっきの赤枠内に自分のユーザ名が表示される。
f:id:ossyaritoori:20180222172434p:plain


そしたら以下の画面に戻って,「編集」の所をクリックして
f:id:ossyaritoori:20180222162116p:plain

次のように読み取りと書き込みに無効と設定する。
https://www.top-password.com/blog/wp-content/uploads/2017/06/deny-execute-narrator.png

これにて終劇。
ナレーターは死んだ!もういない!


勝利のBGMに酔うと良い。
www.youtube.com

MATLABでパーティクルフィルタ

流石に適当に書きすぎたか
この辺の分野はどの専門を土台にするかでかなり説明などが変わってきます。
私は制御&ロボティクスが半々くらい。EKFやベイズの定理などはすでにMasterしているものとします。
(ていうか説明しない)

基礎は確率ロボティクスで勉強しよう。

確率ロボティクス (プレミアムブックス版)

確率ロボティクス (プレミアムブックス版)

ちなみに英語版のドラフトは以下のURLに落ちています。
https://docs.ufpr.br/~danielsantos/ProbabilisticRobotics.pdf
書籍版と比べましたが書籍版の方が洗練されてますね。英語読むの辛いし。

パーティクルフィルタとは

ベイズフィルタの亜種。状態推定に必要な確率分布を数式ではなく,多数の粒子群の集合として表現する手法です。
粒子の数を増やせば実質どのような分布でも表現でき,状態方程式とノイズの分布がわかっていればどのような関数でも同じように実装できるのが強み。


wikiを見るか以下の説明が簡潔かと。
なお,『カルマンフィルタもパーティクルフィルタも全部ベイズフィルタで説明がつく』という説明が美しいのでやはり上記の確率ロボティクスの本を読むことをおすすめします。
パーティクルフィルタ - おべんきょうwiki - アットウィキ

実装などについては以下のサイトが参考にしやすい。
Tutorial/Practice0 – MIST Project

Pythonの実装例でよければ確率ロボティクスを和訳した上田先生が公開しているモンテカルロ自己位置同定の話なんかが実装の参考になることでしょう。
github.com

後は鏡先生のスライドとかも参考になるか?
http://www.ic.is.tohoku.ac.jp/~swk/lecture/ic2012/kagami_ic20120710.pdf


matlab実装

というかMATLABの実装もAtsushiさんがやってくれてます。自己位置同定に関してはこれを使えば良いでしょう。
Particle Filterを使用した自己位置推定MATLABサンプルプログラム - MyEnigma

もう少し汎用的な話なら以下のブログがわかりやすいかと思います。式はいくつかこのブログから拝借してます。
satomacoto: Pythonでパーティクルフィルタを実装してみる

ちゃんとわかりたかったらやっぱり教科書を読みましょう。あれはやはり名著です。

各々の粒子は状態,重みをもつ。

状態推定

各々の粒子はそれぞれ自分の状態,重みをもつとします。

状態推定はEKF等と同じ流れで,状態方程式に基づいて各々の粒子を遷移します。
「各々のパーティクルごとに更新をするという点」と「実際に乱数を与えてノイズも加える」という点が少し違います。
f:id:ossyaritoori:20180204022446p:plain

まぁモンテカルロって言ってますしね。実際に試していくわけです。

観測に依る更新

一方,状態更新の際には尤度を使って更新します。
f:id:ossyaritoori:20180204023057p:plain

このp(Y|X)というやつが曲者ですが,ノイズをガウス分布と仮定するなら次のように書けます。
この更新に使う尤度は次のように計算します。(1次元の場合)
f:id:ossyaritoori:20180204023305p:plain

ここで,p(Y|X)は相対的な値がわかればよいです。
なぜなら,この後,全てのParticleに対して尤度を元に重みを更新しますが,更新した重みの和が1になるように正規化します。
従って,どうせ後で割り算でつじつま合わせの補正がされるので余計な計算はしなくて良いということですね。

ここが気味が悪いと思う人はやはり教科書を(ry
これもわかりやすく説明するのは他の人に投げたい。

個人的な解釈

解釈の例を載せておきます。間違っていたら指摘してください。

非線形出力方程式として
Y = g(X) + ⊿
とでもしてみましょう。g()が非線形関数の出力で⊿が平均0,分散σ×σのガウス分布とします。
はてな形式で数式をうつのはだるいのでこれで勘弁

g(X)を左に移行する式変形をするとつまるところ,Y-g(X)は平均が0で分散がσ^2のガウス分布に従うことになります。
そしてガウス分布の式はWikiより次のように表せます。
f:id:ossyaritoori:20180204023733p:plain

このxの代わりにY-g(X)をぶち込んだ分布にXとYは従うということです。
つまり特定のXの時に特定のYを取る分布p(Y|X)はまさにこの分布に従うということです。
うーん,うーん,また教科書読み直してきます。
深夜に書いてて頭痛くなってきた。

リサンプリング

最後に新たに得られた重みの大きさに応じて粒子を再配置します。
パーティクルフィルタによる自己位置推定動作の可視化 - Qiita リサンプリングの項を参照。(孫引用で申し訳ない)

注意しないと確率の低めな粒子が全て淘汰されて推定値の集合が一点付近に収束してしまい,誤った値に収束して動けなくなったり,突然の外乱で値がずれたときに追従できなくなってしまうなどと言った問題が発生します。

これにも手法論がいろいろありまして
確率ロボティクス第五回 参照)

「系統抽出法」を使うのがおおかた妥当らしいです。
重みを元に領域を区切り直して再びばらまく&その際にランダム性を持たせて粒子の多様性を保存する的な意味合いです。

尤度の設定は重み付き平均でいいのか?

単峰性が確約されない場合重み付き平均は良くない場合も多いです。
以下のブログが非常にわかりやすい。
qiita.com

コード

応用例としてwikiの速度推定の話をしましょう。
カルマンフィルター - Wikipedia

速度がランダムウォークするとの仮定のもと,位置と速度の2つの状態を持つ状態を推定するという問題です。

コード置き場

例のごとくGistにあげました。リサンプリングとかはAtsusiさんのをほぼそのまま借りてます。ありがとうございます。

実装のコツ

クラスで作成しました。変数の状態等を内部できちんと管理するのにいいですね。
また,関数ハンドルとして状態方程式等を与えることに寄って,自分の設定した状態方程式に合わせた実装が容易にできるようにしました。
おそらく大体の関数においてこのコードは使用可能ではないでしょうか。

関数ハンドルにかんしては詳しくは「無名関数」でググってほしいですが

f=@(x,y)x+y

としたなら

f(x,y)
>> 5

という風に使えるものを関数ハンドルと呼びます。これで

state=@(x,u)A*x+B*u

とでも書けば状態方程式を簡単に定義できるというわけ。これは覚えて置いて損はないかと。

結果

なんかあんまり恩恵受けた感じしないですね。
とりあえず動いているのではなかろうか。
f:id:ossyaritoori:20180204164317p:plain

総評・所感

正直に言ってカルマンフィルタより実装が楽かというと全然そんなことは無いし,計算量もクソ重でした。
(これは行列演算ライブラリの利点を生かす実装をしなかったという点が大きいが)

一番困難なところはチューニングで,状態遷移のときのノイズをそれなりに大きく取らないとパーティクルがうまく撒けないし,
(追記:いや,これはどっちかというと初期値のバラまき方の問題というべきか。)
毎ステップでランダム要素が入るので,妙なことが起こるのではという不安もそれなりにあります。
そして周波数領域での設計とか超やりにくいじゃん!という致命的な制御屋の不満があったり,,,

何れにせよ多量のサンプルを用いて幅広い表現力を得た代わりにチューニングや設計のコツなども多分にややこしくなったというのが本当のところではないだろうか。

「パーティクルフィルタは簡単」との言はもっとロボットのローカライゼーションとかやる時に実感できるのかなぁ…