gggggraziegrazie

graizegrazieさんのやったこと、学んだことを記録する雑記帳です

NMS:Non-Maximal Suppression

NMSとは、Canny Edge Detectionアルゴリズム等に使用されている手法で、エッジ画像の細線化に使われます。画像内の各ピクセルに注目していき、注目ピクセル及び隣接ピクセルを比較し、注目ピクセルの値が最大でない時は値を0にする、という手法です。この時、隣接ピクセルとは注目ピクセルの法線上に存在するピクセルのことです。

下図Fig.1を見ていただければ、イメージが湧くと思います。

f:id:graziegrazie:20150718235647p:plain
Fig.1(引用http://www.wakayama-u.ac.jp/~wuhy/CV05.pdf)

EMアルゴリズム

今回はEMアルゴリズムについてお勉強してみました。簡単に書かれているページがあまり見つからなかったので、意味不明だと思います。。参考のページはイメージを持つ上で大変有用なページと思いますので、ご参照ください。

EMアルゴリズム

 EMアルゴリズム(Expectation Mazimizationアルゴリズム)とは、機械学習の世界でよく使われる、確率モデル推定アルゴリズムです。EMアルゴリズムは、ある前提の元で次の2ステップを繰り返し実行することで、パラメータθを持つ確率モデルを求めます。この時の確率モデルとは、可観測な確率変数Xと可観測でない確率変数Yをモデル化したものです。
 ・Eステップ(Expectationステップ):X,Yの期待値を計算
 ・Mステップ(Maximizationステップ):パラメータθの最大化を実施

 変数に可観測でない確率変数Yが入っているように、値を直接的に観測できないケースでの状態推定に有用です。

#うーん。書いてて自分で意味不明だ。。今後修正・追記していきます。

N-gramと形態素解析

N-gram形態素解析は、それぞれ文字列解析に使用される手法です。N-gramとは、N文字単位で文字列を分解・解析します。また隣り合った単語の組み合わせから求めた共起頻度を使い、どのような文字列の分析を行ったりします。それに対し形態素解析は、文字列を品詞ごとに分解・解析します。以降では、それぞれの技術に対し、もう少し詳細化して説明します。

N-gram

N-gramは、対象となる文字列をN文字毎に分割してインデックス化する手法です。形態素解析とは異なり、品詞や単語という観点は無視されます。例えばN=2の2-gram(bi-gram)では、「本日熊谷市の気温は40度に達しました」という文章は、
 「本日/熊谷/市の/気温/は4/0度/に達/しま/した」
という風に分割されます。同様に、「熊谷市は埼玉県にあります」という文章があると、
 「熊谷/市は/埼玉/県に/あり/ます」
となり、それぞれの文字列のIDを1, 2とすると、索引情報は

インデックス 所属文字列ID
本日 1
熊谷 1,2
市の 1
気温 1
は4 1
0度 1
に達 1
しま 1
した 1
市は 2
埼玉 2
県に 2
あり 2
ます 2

として作成されます。その結果、上記2文字列を検索対象とした時、"本日"という単語で検索すると、1の文章が、"埼玉"という単語で検索すると、2の文章が見つかります。また、N-gramでは、検索対象となる文字列だけでなく、検索キーワードも分割されます。例えば"熊谷市の気温"は、"熊谷/市の/気温"と分割され、それぞれが所属する文字列のIDを検索します。

共起関係

N-gram単位で分割した文字列において、隣り合った単語を共起関係にあると言います。

形態素解析

形態素解析は、文字列を品詞分解して、解析する手法です。そのため、名詞・動詞・助詞などの形で文字列が分解されます。例えば、「今日は良い天気です。」という文字列があるとき、
 「本日/熊谷市/の/気温/は/40度/に/達し/ました」
という風に分解されます。次に「熊谷市は埼玉県にあります」という文字列は、
 「熊谷市/は/埼玉県/に/あり/ます」
という風に分解されます。そのため、索引情報は

インデックス 所属文字列ID
本日 1
熊谷市 1,2
1
気温 1
1,2
40度 1
1
達し 1
ました 1
埼玉県 2
2
あり 2
ます 2

として作成されます。そのため、品詞や単語の分解が大変重要になります。また、キーワードでの検索に対応可能となります。N-gramでもキーワード検索可能ですが、文字列がどう分解されたかによって結果は変わってきます。

Windowsの環境変数についてメモ

Windows環境変数について、特に問題が発生しなかったので、今まで特に理解を深めることなく使っていました。しかし最近開発をしている中で、知らなかった点が何点か出てきました。本記事では、僕が新しく知ったことについて記載します。

Windowsの2つの環境変数の違い

Windows環境変数には、

の2種類存在します。何となく違いはわかっていたものの、しっかりと調べたことがありませんでした。今回は2つの変数の違いについて列挙します。

適用ユーザ

 システム環境変数は、PC固有の環境変数です。そのため、同一PCを使用する全ユーザが参照できます。ユーザ環境変数は、その名の通り、各ユーザ固有の環境変数です。そのため、PCを共有するAさんとBさんがいた時、Aさんが設定した環境変数はAさんしか使うことができません。

優先順位

 ユーザ環境変数とシステム環境変数で同一名の環境変数が設定されている場合、その優先順位は
 ユーザ環境変数 < システム環境変数
となります。つまり、同一名の環境変数が定義されていると、システム環境変数の値が使われます。そのため、名前は分けるべきです。
 なお、環境変数Pathに関しては挙動が異なり、
 "システム環境変数のPath;ユーザ環境変数のPath"
の様に、連結した形で認識されます。ただし、特殊な事情を覗いて、無意味に同一名の環境変数を使うことは、後々のトラブルにつながりかねません。そのため、おすすめできません。

環境変数コマンドプロンプトから設定する方法

 今までは「システムの詳細設定」から設定を行っていたため、面倒でした。たまたまコマンドプロンプトから設定する方法を見たので、ここにメモしときます。

コマンドプロンプトだと、「Windowsボタン」+「r」で起動できるから便利ですよね。

設定方法

 設定には"setx"コマンドを使います。ただし、設定する環境変数が、「ユーザ環境変数」か「システム環境変数」かで、オプションを付ける・付けないが変わってきます。

ユーザ環境変数

setx 環境変数名 パス

システム環境変数

setx /m 環境変数名 パス

となります。なお、既存の環境変数に値を追加する場合は、
 %環境変数名%;パス
とすれば、パスを追加することができます。

コミックレンタルサービスについて

 マンガを読む時、私は雑誌の購入/立ち読みではなく、単行本を購入して読んでいました。しかし最近単行本が増えすぎて部屋の中を圧迫していて困っています。。そのため、単行本の購入を控えつつマンガを読む為の方法を検討するため、色々なサービスを調べてみました。 雑誌・単行本を購入/立ち読みする以外に、マンガを読む方法には下記があります。

検討の結果、私の用途にはコミックレンタルサービスを利用することがベターという結論に達しました。

コミックレンタルサービス

 コミックレンタルサービスとは、名前の通りコミック(単行本)をレンタルできるサービスです。レンタルのため、最終的にはスペースを取らず、かつ購入するよりも安い値段で単行本を読むことができます。ただし、会社によって借りられる数が異なります。1冊から借りられる会社もあれば、複数冊セットでしか借りられない会社もあります。
 ただし、単純にレンタルにかかる金額だけ考えれば、実店舗で借りた方が安いです。私はコミックレンタル可能な店舗に行くためには、わざわざ電車に乗る必要があります(何かしらの途中経路にはありません)。そうした理由からレンタルを使うことにしました。

Table.1 書籍宅配系レンタルサービスの比較

会社名 貸出単位 費用 レンタル期間 送料
TSUTAYA 一冊毎 \162/冊(税込) 20泊21日 \648(税込) *ただし、10冊以上同時にレンタルで無料
DMM セット \45, 85/冊(税込) 14泊15日~ \840
GEO セット \124/冊((税込) 13泊14日 無料

Table.2 電子書籍レンタルサービスの比較

会社名 費用 レンタル期間
Renta! チケット制のみ \108/チケット(税込) 48時間 or 無期限(無期限の作品あり)
コミックシーモア 月額制 \324/月~ ポイント制 \108~ *読み放題もあり 2泊3日~

電子書籍購入

 電子書籍は無形であり、印刷代が発生しないため従来の書籍に比べて安いというメリットがあります。ただし、音楽ファイルと異なり、電子書籍は使用するプラットフォームに依存したファイル形式になっています。そのため、他のプラットフォームに移管できません。例えば、Amazon以外で購入した電子書籍は、Kindle上で読めません。自分の財産を自由に使えないのは不便であります。また、あくまでも私の感覚ですが、電子書籍は高いです。従来の書籍に比べたら安いですが、印刷・輸送費削ってもこんなもんなの??と思ってしまいました。
 以上の2点から、私は電子書籍購入に対するメリットが感じられず、購入は避けています。

マンガ喫茶

 マンガ喫茶はドリンク飲み放題ですし、室温も快適にセットされているので、快適にマンガが読めると思います。一方で、何冊もマンガを読まない限り、ペイに対する元が取れない環境だと思います。つまりペイした時間分だけ読みたいマンガがあればかなり格安です。しかし私は大抵の場合、最近発売された最新巻を1,2冊だけ読めればいいです。そうなると、不必要な時間分のペイもするため、もったいない気がしています。
 以上の理由から、私の利用用途に対しては、マンガ喫茶はメリットがないと考えました。

海外旅行/出張に持っていくものリスト

海外旅行/出張に行くとき、何を持っていけばいいのか不安になりますよね。抜け漏れを防ぐため、僕は毎回ネットで調べながら荷詰めをしています。今回はネットで調べたことと共に、実体験からこれは必要だと思ったアイテムをリストととして纏めたものを紹介します。

旅行/出張共通の持ち物

アイテム名 備考
パスポート 残り期間に注意
ビザ 入国に必要か要確認
航空券 現地でモバイル端末経由でのチェックインを考えている場合、電池切れの不安があることから、印刷してもっていくことを推奨
現地通貨 現金でもトラベラーズチェック(TC)でも可。現金の方が使い勝手がいい反面、TCの方が無くしても申請すれば戻ってくる。
ドル 現地通貨が無くなった時に支払いに使える。円は難しいと思う。
ハンカチ 田舎に行くと、トイレで手を拭うものは無いです。
クレジットカード 無すと怖いが、残金を気にする必要がなくなる。
ポケットティッシュ 都市部ならいいけど、田舎に行くと調達が困難。トイレに紙が無いときにも便利。
メモ帳 話が通じない場合は筆談が便利。
ボールペン 鉛筆・シャーペンだと芯が折れる場合があるので、ボールペンの方が便利。
海外旅行保険 困った時に必要。
ホテルの予約証 話が通じな場合も、これがあれば便利。
ホテルまでの地図 タクシーの運ちゃんと会話ができない場合は、これが便利
携帯電話 何かあった時に便利。現地で使えるか事前に要確認。
携帯電話の充電器 携帯電話を持って行くなら必須。
ガイドブック 現地の言葉や地図があるので便利。
変圧器 現地で使いたい機材が100VACしか対応していない(日本国内仕様)場合は必須。
コンセント変換プラグ 日本用電源プラグは入らない可能性があるので必須。
電源タップ 同室の人とコンセントシェアしたり、沢山の機材を充電する必要がある時に便利。
常備薬 現地では薬が手に入らない、手に入れた薬が体に合わない等の可能性があるので、必要ならば持っていくべき。
胃腸薬 個人的にはワカマツがおすすめ。インドで井戸水を飲んだときはお世話になりました笑。
虫除けスプレー 場所にもよるが、東南アジアとかだと危ない虫がいる可能性があるのであると便利。
目薬 飛行機やホテルは乾燥していることが多いので。
リップクリーム 同上
ハンドクリーム 同上
マスク 同上。
下着 短期なら日数分、長期なら3日分をクリーニング・洗濯で回す。
ヒゲ剃り ホテル提供のものは質が悪いので。
歯ブラシ 同上
歯磨き粉 こだわりが無ければホテルのもので良いと思う。
ビニール袋 洗濯物を入れるのに便利。
シャンプー 小さいプラボトルに入れて持って行くと便利。
リンス 同上。
ボディソープ 同上。
ルームウェア(上下) ホテルで着替えが用意されていない可能性が高い。
クロックス ホテルにはスリッパがない、あっても布地なので濡れると気持ち悪い。クロックスのようなプラ製のサンダルがあると、シャワー浴びた後も濡れた足で履けて便利。


以降では、旅行と出張どちらかで必要なものを記述する。旅行と出張では異なる荷物を持っていく。その際の参考になれば幸いです。

旅行で必要・あると便利なもの

現地用財布 お金を持っているように見せないため、みすぼらしい財布にした方がよい。首から下げられると便利。
セキュリティポーチ パスポートや非常時のお金を入れておくのに便利。

出張で必要・あると便利なもの

腕時計 見栄えで重要。
名刺 追加が出来ないので、十分な量を持って行くこと。
名刺入れ 名刺を持って行くなら必須。
会社の連絡先 緊急時に必須。
デジタルカメラ 報告書作成に写真は必要。会社内のPCに接続出来るものを持って行くべし。
デジタルカメラ充電器 デジタルカメラを持っていくなら必須。
打ち合わせ資料 無くさないように注意。
Yシャツ 短期なら日数分、長期なら3日分をクリーニングしつつ回す。
スーツ(上下) 1着だと何かあった時に困るので、最低2着。
ネクタイ 日数にもよるが、3本位は必要。
ファブリーズ 匂い防止のため。

MPU6500のDMPの使い方

最近Invensense社のMPU6500という6軸加速度・ジャイロセンサを使いました。MPU6500には、DMP(Digital Motion Processor)というプロセッサがあり、クォータニオンオイラー角を出力してくれます。今回はその時にハマった点などを記載します。

 

今回の開発環境は下記の通りです。

<環境>

・ボード:Beagle Bone Black(BBB)

・OS:Ubuntu(ボードが手元から無くなったので、ちょっとわかりません。。)

 

<SPIの設定>

MPU6500は、I/FとしてI2CとSPIを持っています。今回はSPIを使ってBBBからMPU6500を操作することにします。

 

デフォルトでは、BBBのSPIは無効になっています。そのため、BBBのslotsにドライバをセットする必要があります。ドライバの生成方法とセット方法については、下記リンクを参照ください。

BeagleBone Black Enable SPIDEV - eLinux.org

BeagleBoneBlack [6] – SPI – | MyToolBox

Mobile Maniac: Linux - Accessing SPI Bus from User Space - Part II

 

<DMPの使い方>

DMPを使うには、MPU6500へF/Wを焼きこむ必要があります。しかし、MPU6050に関する記述はあるが、MPU6500は全くない見つかりませんでした(泣)。。。そのため、MPU6050のF/Wを無理やり焼いてみることにしました。

 

その結果、MPU6050の初期化~DMPの設定に関する部分をコピペすることで、無事にMPU6500のDMPを動かすことが出来ました!使用したF/WはInvensenseが提供するMotionDriver5.1.2で、MPU6500との通信部分以外は改変しませんでした。通信部分に関しては、I2CからSPIへと変更しました。

Login | Developers

 

アプリケーションとSPIドライバとのI/Fは、jrowbergさんのI2Cdevを流用しました。I2Cdev内のRead/Write部分をSPI用に書き換え、SPIdevを作りました。これで設計・実装の手間がだいぶ省けました。なお、SPIの通信モードは、3としてください。

i2cdevlib/Arduino/I2Cdev at master · jrowberg/i2cdevlib · GitHub

 

DMPの動作を確認したところ、静止状態では、DMPの出力値は特に発振することはなかったです。ただし、加速度・ジャイロの出力値はノイズが乗るものなので、完全に値が静止するということはないので、フィルタリングは必要だと思います(今回は実装しませんでしたので、お手数ですが他の記事を御覧ください)。

  

加えて、DMPの更新周期には注意が必要です。200Hz以上の周期で更新すると、ノイズが半端ないです。そのため、僕は100Hzにしました。これに伴い、MPU6500のFIFOからのデータ取得も、100Hz以下に設定する必要があることに注意です。100Hz以上でも構わないのですが、FIFOが空の状態に遭遇するはずです。

MPU 6050 and it's DMP over time | JP