2018年4月9日月曜日
ChainerでFCNやってみた(完成版)
教習所地獄から生還した中の人です。
今日はこの前作ったFCNもどきを完成させたので、その報告。
この前作ったやつは、誤差関数を平均二乗誤差にして連続値をそのまま出力する形になっていました。(分類問題なのにね)
なんでこうなったかといえば、ChainerのSoftmaxCrossEntropyの仕様を理解せずに使おうとしていたからでして、最初から読んでいればこんなことにならなかった...。
とりあえず、こちらで公開しておきます。今後の開発としては、分類数をもっと増やして、より実践的なやつを作る予定です。(ハードについては今後公開予定)
2018年2月11日日曜日
Raspberry PiでFully Convolutional Networks(もどき)を走らせる
テストが終わったと思ったら教習所通いの中の人です。
今回はchainerを使用してFCNもどきを構築してみたので、少しご紹介。
1.目的
今回これを作った理由は、この車の改良版を作成するためです。
2.改良手法
Fully Convolutional Networks(FCN)を使って道路を見分け、道路の面積から操作角 を判断する。FCNについてはこちらから
https://people.eecs.berkeley.edu/~jonlong/long_shelhamer_fcn.pdf
そもそもFCNを使う理由としては、どのようにして道を判断したかがパッと見てわかり やすいためです。(計算量は度外視)
3.結果
3.1 精度
こんな感じです。
道(3段目の白い部分)がしっかり取れていました。(まだ荒いけど)
3.2 処理速度
想定より遅い...。大体10fpsは超えるぐらいですかね。もっと速くしたいです。
4.考察
重かった原因として、①FCN自体が重い、②無駄な処理が走ってるといったことがあげ られます。ここからさらに高速化しようと思ったら、この辺とか試してみたいですね。
5.その他
今回のコードはこちらにあります。
1.目的
今回これを作った理由は、この車の改良版を作成するためです。
2.改良手法
Fully Convolutional Networks(FCN)を使って道路を見分け、道路の面積から操作角 を判断する。FCNについてはこちらから
https://people.eecs.berkeley.edu/~jonlong/long_shelhamer_fcn.pdf
そもそもFCNを使う理由としては、どのようにして道を判断したかがパッと見てわかり やすいためです。(計算量は度外視)
3.結果
3.1 精度
こんな感じです。
道(3段目の白い部分)がしっかり取れていました。(まだ荒いけど)
3.2 処理速度
想定より遅い...。大体10fpsは超えるぐらいですかね。もっと速くしたいです。
4.考察
重かった原因として、①FCN自体が重い、②無駄な処理が走ってるといったことがあげ られます。ここからさらに高速化しようと思ったら、この辺とか試してみたいですね。
5.その他
今回のコードはこちらにあります。
©2018 shts All Right Reserved.
2017年12月10日日曜日
ビット演算の初歩の初歩の初歩
この記事はMice Advent Calendar 10日目の記事です。
========================================
東工大杯の準備は着々と進んでおらず、テスト対策もしていない中の人です。
Miceの先輩方からの有形無形の圧力により、Mice Advent Calendarなるものに参加しています。ほかの方々の有用な情報のほうがこの記事よりためになるので、どうぞご覧ください。
=========================================
話は変わりまして、ビット演算の話。
そもそもこんな記事を書いたのは趣味で少しかじったからであって、別段他人に見せるほどでもないんですが、とりあえず書いときます。
ビット演算とは何かという話は他の人に譲るとして、実際の演算子を紹介していきます。
1.NOT
Cでの記号(演算子): ~ (チルダ)
論理演算のNOTに相当。数字をビット毎に反転させる。
例:
a : 0101 0101
b ~= a : 1010 1010
2.AND
Cでの記号(演算子): &
論理演算のANDに相当。2つの数字のビット毎にANDをとる。
例:
a : 0101 0101
b : 1111 0000
a & b : 0101 0000
3.OR
Cでの記号(演算子): | (バーティカルバー)
論理演算のORに相当。2つの数字のビット毎にORをとる。
例:
a : 0101 0101
b : 1111 0000
a | b : 0101 0000
4.XOR
Cでの記号(演算子): ^ (キャレット)
論理演算のXORに相当。2つの数字のビット毎にXORをとる。
例:
a : 0101 0101
b : 1111 0000
a | b : 0101 0000
ちなみにXORは以下の通り
X Y | Z
----+--
0 0 | 0
1 0 | 1
0 1 | 1
1 1 | 0
さてここからビット演算特有のビットシフトの話。ビットシフト自体はそこまで難しくはない(ずらすだけ)が、ビットシフトの種類で空いたところに何が入るかが変わるの(特に右シフト)で注意。
5.論理左シフト
Cでの記号(演算子): << ("Double less-than sign" とか言うらしい)
n-bit分左にずらし、空いたbitには"0"を入れる。
例:
a : 0101 0101
a << 3 : 1010 1000
6.算術左シフト
記号も動作も5.論理左シフトと同じなので割愛
ここからがわけわからん右シフトの世界
7.論理右シフト
Cでの記号(演算子): >> ("Double greater-than sign" とか言うらしい)
n-bit分右にずらし、空いたbitには"0"を入れる。
例:
a : 0101 0101
a >> 3 : 0001 0101
8.算術右シフト
Cでの記号(演算子): >>
n-bit分右にずらし、空いたbitには..."1"か"0"を入れる
例①:
a : 0101 0101
a >> 3 : 0001 0101
例②:
b : 1010 0101
b >> 3 : 1111 0100
さて算術右シフトの例が二つ出てきましたが、①では"0"、②では"1"が入っています。これは
"算術右シフトでは、操作する前の一番上のbitを空いたところに入れる"
というルールがあるためです。(理由はGoogle先生に聞いてみよう!!!!!!!)
ここまでで、Cで使えるすべてのビット演算が出てきました。
全部の演算子が出てきたんだし、C言語だったらビット演算できる...なんて思ってませんよね?
ここである記号についてみてみましょう
5.論理左シフト
Cでの記号(演算子): <<
6.算術左シフト
Cでの記号(演算子): <<
5.論理右シフト
Cでの記号(演算子): >>
5.算術右シフト
Cでの記号(演算子): >>
あれ、記号が同じだ...。
そうです、C言語ではシフトの記号が論理と算術とで分けられていません!!!!!!!!!!!!!!!!!!
何たる失態。
ところでC言語の規格書(日本語で書かれたものだとJIS X 3010:2003)というものが世の中には存在しまして、こいつの中にはビットシフトについてこう書いてあります。
E1<<E2の結果は,E1 を E2 ビット分左にシフトした値とする。空いたビットには 0 を詰める。
E1 が符号無し整数型をもつ場合,結果の値は,E1×2^E2の,結果の型で表現可能な最大値より 1 大きい値を法とする剰余とする。
E1 が符号付き整数型と非負の値をもち,E1×2^E2が結果の型で表現可能である場合,それが結果の値となる。
それ以外の場合,その動作は未定義とする。
E1>>E2の結果は,E1 を E2 ビット分右にシフトした値とする。
E1 が符号無し整数型をもつ場合,又はE1が符号付き整数型と非負の値をもつ場合,結果の値は,E1/2^E2の商の整数部分とする。
E1 が符号付き整数型と負の値をもつ場合,結果の値は処理系定義とする
つまり左シフトは算術でも論理でも空いたビットには"0"が入るが、
右シフトは動作している環境で違うってこのらしい。
(´・ω・`)
環境依存である以上算術シフトと論理シフトについて議論してもあまり意味がないのですが、例えばGCCだとビットシフトする方の型をunsignedにしておくと論理シフトで、signedにしておくと算術シフトになったりします。
こんな感じで最後にトラップがありましたが、とりあえずビット演算の初歩の初歩の初歩はクリアできそうですね!
========================================
東工大杯の準備は着々と進んでおらず、テスト対策もしていない中の人です。
=========================================
話は変わりまして、ビット演算の話。
そもそもこんな記事を書いたのは趣味で少しかじったからであって、別段他人に見せるほどでもないんですが、とりあえず書いときます。
ビット演算とは何かという話は他の人に譲るとして、実際の演算子を紹介していきます。
1.NOT
Cでの記号(演算子): ~ (チルダ)
論理演算のNOTに相当。数字をビット毎に反転させる。
例:
a : 0101 0101
b ~= a : 1010 1010
2.AND
Cでの記号(演算子): &
論理演算のANDに相当。2つの数字のビット毎にANDをとる。
例:
a : 0101 0101
b : 1111 0000
a & b : 0101 0000
3.OR
Cでの記号(演算子): | (バーティカルバー)
論理演算のORに相当。2つの数字のビット毎にORをとる。
例:
a : 0101 0101
b : 1111 0000
a | b : 0101 0000
4.XOR
Cでの記号(演算子): ^ (キャレット)
論理演算のXORに相当。2つの数字のビット毎にXORをとる。
例:
a : 0101 0101
b : 1111 0000
a | b : 0101 0000
ちなみにXORは以下の通り
X Y | Z
----+--
0 0 | 0
1 0 | 1
0 1 | 1
1 1 | 0
さてここからビット演算特有のビットシフトの話。ビットシフト自体はそこまで難しくはない(ずらすだけ)が、ビットシフトの種類で空いたところに何が入るかが変わるの(特に右シフト)で注意。
5.論理左シフト
Cでの記号(演算子): << ("Double less-than sign" とか言うらしい)
n-bit分左にずらし、空いたbitには"0"を入れる。
例:
a : 0101 0101
a << 3 : 1010 1000
6.算術左シフト
記号も動作も5.論理左シフトと同じなので割愛
ここからがわけわからん右シフトの世界
7.論理右シフト
Cでの記号(演算子): >> ("Double greater-than sign" とか言うらしい)
n-bit分右にずらし、空いたbitには"0"を入れる。
例:
a : 0101 0101
a >> 3 : 0001 0101
Cでの記号(演算子): >>
n-bit分右にずらし、空いたbitには..."1"か"0"を入れる
例①:
a : 0101 0101
a >> 3 : 0001 0101
例②:
b : 1010 0101
b >> 3 : 1111 0100
"算術右シフトでは、操作する前の一番上のbitを空いたところに入れる"
というルールがあるためです。(理由はGoogle先生に聞いてみよう!!!!!!!)
ここまでで、Cで使えるすべてのビット演算が出てきました。
全部の演算子が出てきたんだし、C言語だったらビット演算できる...なんて思ってませんよね?
ここである記号についてみてみましょう
5.論理左シフト
Cでの記号(演算子): <<
6.算術左シフト
Cでの記号(演算子): <<
5.論理右シフト
Cでの記号(演算子): >>
5.算術右シフト
Cでの記号(演算子): >>
あれ、記号が同じだ...。
そうです、C言語ではシフトの記号が論理と算術とで分けられていません!!!!!!!!!!!!!!!!!!
何たる失態。
ところでC言語の規格書(日本語で書かれたものだとJIS X 3010:2003)というものが世の中には存在しまして、こいつの中にはビットシフトについてこう書いてあります。
E1<<E2の結果は,E1 を E2 ビット分左にシフトした値とする。空いたビットには 0 を詰める。
E1 が符号無し整数型をもつ場合,結果の値は,E1×2^E2の,結果の型で表現可能な最大値より 1 大きい値を法とする剰余とする。
E1 が符号付き整数型と非負の値をもち,E1×2^E2が結果の型で表現可能である場合,それが結果の値となる。
それ以外の場合,その動作は未定義とする。
E1>>E2の結果は,E1 を E2 ビット分右にシフトした値とする。
E1 が符号無し整数型をもつ場合,又はE1が符号付き整数型と非負の値をもつ場合,結果の値は,E1/2^E2の商の整数部分とする。
E1 が符号付き整数型と負の値をもつ場合,結果の値は処理系定義とする
つまり左シフトは算術でも論理でも空いたビットには"0"が入るが、
右シフトは動作している環境で違うってこのらしい。
(´・ω・`)
環境依存である以上算術シフトと論理シフトについて議論してもあまり意味がないのですが、例えばGCCだとビットシフトする方の型をunsignedにしておくと論理シフトで、signedにしておくと算術シフトになったりします。
こんな感じで最後にトラップがありましたが、とりあえずビット演算の初歩の初歩の初歩はクリアできそうですね!
©2017 shts All Right Reserved.
2017年12月9日土曜日
PiZeroのOTGモードでネットにつなぐ(Windows10)
Raspberry Pi ZeroのOTGモードでのネットワーク接続に手間取ったのでメモ。
前提としてOTGモードでログインできている状態である必要があります。
①Pi Zeroと母艦とを接続し、コントロールパネル→ネットワークとインターネット→ネットワーク接続を開く
②ネットワークにつながっているアダプタを右クリックし、プロパティを開く
③共有タブを開いて、"ネットワークのほかのユーザーに、このコンピュータのインターネット接続をとおしての接続を許可する(N)"の欄にチェックを入れる。
④Pi Zeroを再起動するとつながるはず
うまくつながらないこともあるので、ほんとのやり方はほかにあるのかも知れないです。
前提としてOTGモードでログインできている状態である必要があります。
①Pi Zeroと母艦とを接続し、コントロールパネル→ネットワークとインターネット→ネットワーク接続を開く
②ネットワークにつながっているアダプタを右クリックし、プロパティを開く
③共有タブを開いて、"ネットワークのほかのユーザーに、このコンピュータのインターネット接続をとおしての接続を許可する(N)"の欄にチェックを入れる。
④Pi Zeroを再起動するとつながるはず
うまくつながらないこともあるので、ほんとのやり方はほかにあるのかも知れないです。
©2017 shts All Right Reserved.
2017年10月20日金曜日
SH7125でリセット同期PWMモードを使う
センサ周りのポート接続の関係でセンサLEDをリセット同期PWMで動かすことになったのでメモ。
基本的にデータシート通りに設定し、割り込みに関する部分を追加して動かす感じ。
割り込み条件は周期を決める関係上MTU23のTGRAのコンペアマッチを使う。ついでに割り込み許可もこいつだけに出しとけばOKなようだ。
©2017 shts All Right Reserved.
2017年10月16日月曜日
kicadでプリント基板作ってみた
2017年10月9日月曜日
ソフト構成
とりあえず全体を見通しやすくするために、レイヤーをなるべく少なくする方針で設計を進めてます。
Application layerとController / Driver layerを分けたのは、App layerでなるべくハードを意識せずにプログラムしたいためです。またControllerとDriverは一体にして、プログラムのサイズを小さくする狙いがあります。
構築はまだ全部の動作確認を終えてないのでそちらが優先ですね...
©2017 shts All Right Reserved.
2016年10月15日土曜日
Raspberry Pi Autonomous Car - ソフトウエア
今回はソフトウエア編です。いろいろ試してたら最初4つだったのが6つになってました...。
画像収集
NNのトレーニング用の画像データを収集します。出力するデータは9600次元のベクトルにしました。(160*60)
機械学習
さっきの画像データを元にPybrainを使ってトレーニングさせます。ちなみにNNは9600x32x32x4の4層にしました。(Win10のみ動作確認)
自律運転(白線検知)
先ほどのNNを使って白線を検知し、走らせます。
このほかに、カメラとモータとNNのテスト用のスクリプトを作りました。
大体10Hzぐらいで処理できているので、移動速度がそこそこ遅ければしっかり白線トレースできます。カメラからのデータ読み込みさえ速ければ、もっと処理速度あげられるのに...
©2017 shts All Right Reserved.
2016年9月11日日曜日
Raspberry Pi Autonomous Car - ハードウエア2
前回問題に上がっていた電源周りのハナシ。電源の要求は以下の通り。
- モータ側に1A
- raspberry pi 側に0.5A
- lipoを使えるようにする
この条件を満たすため電源ボードとしてadafruitから出ているこれを2つ積むことにしました。
またモータ制御用にTA7291Pを、サーボにSG90を使うことにしました。あとはzeroにサイズの合うユニバーサル基板に実装して制御ユニットの完成。
ただ、この基板が仕上がったあたりで2つ使うはずだったlipoバッテリーのうち1つのケーブルが外れ、使えなくなるトラブルが発生。急遽raspberry pi 用に小型のモバイルバッテリーを調達することに...。
©2017 shts All Right Reserved.
2016年9月10日土曜日
Raspberry Pi Autonomous Car - ハードウエア1
前回から唐突に始まった謎のハナシ、今回はハード編1です。
ハードウエアに対する要求は以下の通り。
- ステアリングの機構を備えること
- FA-130が使えること
- そこそこのペイロードがあること
- 改造がしやすいこと
- Amazonで入手できること
- 改造事例が多いこと
これを満たしたのがタミヤのバギー工作基本セットでした。最初はこれをベースにarduinoとraspberry piを使って制御しようと考えてました。
©2017 shts All Right Reserved.
登録:
投稿 (Atom)
-
相変わらず引きこもり生活な中の人です。今回はMatplotlibで散布図や折れ線グラフを高速描画する話です。 1.Matplotlibの描画の話 Pythonでグラフ描画を行う際によく使うのがMatplotlibです.Matlab-likeなインターフェースで...
-
れぽーよ地獄にサヨナラしたい中の人です。 今回はれぽーよで図を描くときによく使っているdraw.ioの話。 2018/5/23 22時 追記 0.draw.ioとは 多種多様な図を書くことができるオンライン上のツールです。 (e.g.回路図、...
-
卒論も提出し終わったにもかかわらず,研究室にこもって何かしている中の人です.研究室ので使っているマシンでデータセット作成とかをやっているのですが,メモリを大量に使い果たすのでVPNでつなげず,結局来ないといけなくなっています.OTL さて,今回...