2016年12月21日水曜日

ヤフー最悪

これは酷すぎる。あまりにひどすぎるので会社名を実名で書かせていただきます。

身内が亡くなったので、いろいろな解約手続きをしたのですが、どうしても解約できないものがある。それがYahooのサービスの解約。

毎月ヤフーウォレットという会社から請求書が送られてくるのですが、何に対する請求かまったくわからない。
それだけではない。電話番号などが全く書かれていなく、どこで解約手続きをしないといけないのかが全く分からない。

請求書にはQRコードが書いてあるので、どうやらそこにアクセスすればよいんだなと思いそこにアクセスした。

問い合わせのページに行くと。わけのわからん項目がたくさんあり、どこに問い合わせてよいのか全くわからない。

酷すぎる。なんなんだヤフー。だからみんな使わねーんだよ。


いくつか入力するとやっと問い合わせのページが出てきた。

解約したい旨を書き込むと、まったく返事がこない。
一日待ってもこない。
ふざけんなよ。どんなに遅くても24時間以内に返信しろよ。
お前のところのオークションにもよく書かれているだろ。
24時間以内に応答できない人は非常に悪いの評価つけられちゃうんだよ。

ヤフーのサポート対応非常に悪いです。

さらに待ち続けます。

メールが返ってきました。
ここのURLにアクセスして解約手続きをしろと。

ふざけんな、客を散々待たせておいて、また同じようなことを入力しろと。
亡くなった人はお前のところと契約したかも知らないけど、僕はお前のところと契約した覚えはないし、お前に善意で知らせてやってんだよ。
なんでこっちがやんなきゃいけないんだ。
いったい何様のつもりなんだ。

怒りMAX。ふざけんのもいい加減にしろよ!酷すぎる。


そもそもサービスというものはお客様に価値のあるものを提供し、お客様の要望を叶えその対価としてお金をいただくものであり、客の言うことを全く理解しないどころかお客様がわざわざサービスにあわせるものではないはずです。
そんなふざけたサービスには金払わねーよ。とっととやめてやる。

とっととやめたいのに、とっととやめられないんだよ。

怒りを抑えながら、しょうがないのでもう一度同じようなことを入力。
以下の書類が必要ですと書いてある。
そんな書類ねーよ。

書類がない場合どうしたらよいのでしょうか?
先に進めないじゃねーかよ。
メールにはこのメールに返信しても届きませんと書いてある。
また問い合わせをするのかよ。

しょうがなく、とりあえず全く関係ない書類を適当なPDFにして送信ボタンを押す。
画面にはエラーと表示される。
セッションが切れました。時間がたっていますだって。
ふざけんなよ5分で入力しただろうが。
しかももう一度最初から入力してくださいと。

なんでもう一度入力しないといけないんだよ。
怒りを抑えに抑えてもう一度入力します。
また同じようなエラー

もう怒った。

お前のところ以外はすべて何の問題のなくすべて全部解約できたのに、解約できないのはお前のところのサービスと解約の電話を一時間くらい待たせたヤフーBBだけだ。

ヤフー、お前のところのサポートは最悪だ。
もうヤフーのサービスは一生使わない。メルカリに変えるからな。


もう、請求書も何の請求かわからない、解約しようとしても解約できない。
これ詐欺と全く変わらないじゃないか。

続く。




2016年12月7日水曜日

ZMQってなに?

おじさん忙しくてなかなかブログを更新できませんでした。
久々の更新。

車の自動運転のソースコード公開されたんだ
http://gigazine.net/news/20161206-commaai-open-source/

ソースコードでも見てみようかなぁ、
https://github.com/commaai

という軽い気持ちでソースコードを眺めていたら、自動運転ライブラリはZMQというライブラリを介していろんなモジュールが通信していました。

ZMQってなんなんでしょうね?
ということで今日はZMQについて勉強してみました。
ZMQとはどうやら0MQ(ZeroMessageQueue)の略らしいです。
http://zeromq.org/

どうやらIPC、RPCなどプロセス間通信とか分散処理をするライブラリみたいですね。
最近ではこのようなライブラリをつかってPythonとC++などの言語間のブリッジやWindowsとAndroid間など異なるプラットフォーム間の通信を行うんですね。
たしかに、こうすればあらゆるプラットフォームのあらゆる言語で開発できるし、C++のPythonラッパーを作るより便利だよね。

ディープラーニングとか機械学習はPythonで書かれたり、C++で書かれたりしているのでこのようなライブラリを使うんですね。


この辺日本人がなかなか理解できない苦手なところだよね。
全然使い方とか解説のブログないじゃんと思っていたら、ZMQガイドブックの翻訳版がありました。
http://www.cuspy.org/diary/2015-05-07-zmq/


ということで、ZMQのサーバとクライアントを作ってみました。
このライブラリ、軽量でかつ簡単に分散処理とか異なる言語間通信できるので、本当に面白いですね。


------------------------------------------------
// Hello World サーバー
#include <zmq.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
int main (void)
{
 // クライアントと通信を行うソケット
 void *context = zmq_ctx_new ();
 void *responder = zmq_socket (context, ZMQ_REP);
 int rc = zmq_bind (responder, "tcp://*:5555");
 assert (rc == 0);
 while (1) {
  char buffer [10];
  zmq_recv (responder, buffer, 10, 0);
  printf ("Received Hello\n");
  sleep (1); // 何らかの処理
  zmq_send (responder, "World", 5, 0);
 }
 return 0;
}

------------------------------------------------

------------------------------------------------
// Hello World クライアント
#include <zmq.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>

int main (void)
{
 printf ("Connecting to hello world server...\n");
 void *context = zmq_ctx_new ();
 void *requester = zmq_socket (context, ZMQ_REQ);
 zmq_connect (requester, "tcp://localhost:5555");

 int request_nbr;
 for (request_nbr = 0; request_nbr != 10; request_nbr++)
 {
  char buffer [10];
  printf ("Sending Hello %d...\n", request_nbr);
  zmq_send (requester, "Hello", 5, 0);
  zmq_recv (requester, buffer, 10, 0);
  printf ("Received World %d\n", request_nbr);
 }
 zmq_close (requester);
 zmq_ctx_destroy (context);
 return 0;
}
------------------------------------------------







2016年10月17日月曜日

車の自動運転ってどうやってやるんだろ

おじさん、五歳の娘に「アニアは夜になると動くんだよ」と言ったところ、うちの娘はおじさんが寝ている間にアニアをリビングに移動させ、おじさんが起きた時に「アニアがほんとうに動いてた」と言ってました。五歳児の人をまねる能力って本当にすごいです。おじさんがやろうとしていることを想像して先に自分がやるんですね。



これとくらべると最近話題の機械学習も人間のやることをまねしているだけなんですが、猿まねというか五歳児以下ですね。

おじさん、五歳児に嘘を見破られてくやしいので、頭をよくするために車の自動運転のソフトウェア技術を勉強してみました。
しばらく勝手に車の自動運転の技術について勝手に解説しようと思っています。

車の自動運転では、信号とか歩行者や対向車などを判別しないといけないんですが、まずは歩行者などを判別するところまで。

映像の中から物体を識別するには

1. 物体候補領域抽出
2. 画像認識

という二段階が必要らしいです。

映像の中からなんか人とか物がありそうな領域を抽出して、その領域一つ一つに対して画像認識をして、画像が何かを判別するんですね。

2に関しては前回のブログで比較的最先端なものをやったので今回はパス。
今回は1の部分をやってみたいと思います。


物体候補領域抽出アルゴリズムはBING(Binarized Normed Gradients for Objectness Estimation)とかSelectiveSearchとかいうものがあるそうです。

この部分、結構処理が重たいらしく、いろいろな企業や研究機関で高速物体候補領域
抽出の研究がされているようです。

この辺のライブラリ、Pythonで書かれていることが多いのですが、将来商品に入れることを考えると、PCのフルPythonでしか動かないライブラリを使うのではなくて、やはりC++でやりたいですね。

ということで今回はDlibというライブラリでSelectiveSearchをやってみたいと思います。最新の19.2はVisualStudio2015以上でしか動かないので、僕は18.16を取ってきました。

このライブラリも面白いですね。allというディレクトリにあるsource.cppというファイルを一つコンパイルするだけで、ライブラリが使えます。


Selective SearchのC++のソースコードはここにあるのでそのまま取ってきます。
http://nonbiri-tereka.hatenablog.com/entry/2016/07/15/110000


先ほどのファイルと上記のメイン関数のファイル、二つをコンパイルすると実験ができちゃうんです。この10分くらいでサクッとビルドできて実験できちゃう感じがほんと便利。ライブラリの作者の頭の良さが伝わってきます。


ということで、アニアの画像を物体候補領域抽出してみました。


僕のPCでは20秒くらいかかる・・・・。
でもなんか正しいっぽいいじゃん。

2016年9月16日金曜日

TensorFlowのライブラリをC++から使って画像認識してみた

TensorFlowのライブラリをC++から使うにはどうしたらよいのか。


https://www.tensorflow.org/versions/r0.7/tutorials/image_recognition/index.html

上記のドキュメントにはC++のサンプルのビルド方法は書かれているのですが、bazelを使わない自分で作ったアプリのビルド方法はまったくGoogleno公式ドキュメントに書かれていません。

bazelを使わないで、自分のビルドシステムでmakeしたいときはどうすればいいんだろ。
なので調べてみました。



1. Tensorflowをソースからビルドする


まず、tensorflowのsoを作りたいのですが、soを作るにはTesnsorflowをソースからビルドする環境が必要です。以下のサイトをもとに頑張ってTensorflowをソースからビルドします。
https://www.tensorflow.org/versions/r0.10/get_started/os_setup.html#installing-from-sources


2. Tensorflowのsoを作る。

libtensorflow*.soをビルドしたいのですが、ビルド方法が公式ドキュメントには載ってないですよね。bazelのビルドファイルであるtensorflow/BUILDを読むと、なんとなくsoのビルド方法がわかります。

bazel build -c opt //tensorflow:libtensorflow.so
bazel build -c opt //tensorflow:libtensorflow_c.so
bazel build -c opt //tensorflow:libtensorflow_cc.so

上記のように入力するとsoが出来上がります。
bazel/binのフォルダに出来上がるようです。


3. includeファイルを集めてとってくる

これがめんどくさいのですが、以下の四つのフォルダーのヘッダーファイルを
取ってくるかビルド時にパスで指定します。
bazel-tensorflowはシンボリックリンクとかがあるので取ってくるのがめんどくさいです。

bazel-tensorflow
bazel-genfiles
~/.cache/bazel/_bazelユーザー名 /長い文字列/external/eigen_archives
~/.cache/bazel/_bazelユーザー名 /長い文字列/external/protobuf

僕はこれらのファイルをincludeディレクトリを作り、全部入れました。



4. ビルドする

試しに、Tensorflowに入っている画像認識のサンプルをビルドします。
3で作ったファイルをWindowsに持ってきて、前回の記事のbashでビルドしてみたいと思います。
tensorflow/examples/label_image/main.ccをビルドするには以下のように入力

$ g++ main.cc -std=c++11 -Iinclude/eigen_archive -I include/protobuf/src -Iinclude -L. -ltensorflow_cc -Wl,-rpath=.


びるどできたー



5. 学習データを取ってくる

いつものように以下のサイトから学習アルゴリズムと学習結果を取ってきます。

https://storage.googleapis.com/download.tensorflow.org/models/inception_dec_2015.zip



6. 実行させる

$ ./a.out

military uniform (866): 0.647298
suit (794): 0.0477196
academic gown (896): 0.0232406
bow tie (817): 0.0157355
bolo tie (940): 0.0145024


おー、結果が出た。


この写真は軍の制服らしい。
確かにスーツにも見えるね。




これでsoとヘッダーファイルさえとってこれれば、どんなビルドシステムでもコンパイルすることができます。

Windowsのbash on ubuntu on Windsowsはjavaがまだ安定して動かないため、bazelも動かないのですが、ubuntuでビルドしたsoとヘッダーファイルを取ってくれば、Windows上でTensorflowのC++開発も行うこともできます。

Pythonでディープラーニングをすることが流行っていますが、スマホや組み込みではフルスペックのPythonは動きません。
しかし、Tensorflowは演算部分がC++で書かれているので、Tensorflowでグラフを作れば、スマホや組み込みですぐにその学習結果を利用することができるます。
ディープラーニングを使ったアプリを簡単に商品化できるだけでなく、大変時間のかかる学習もGPUを使ったサーバで簡単に分散処理できます。
Tensorflowって深層学習のアプリを実際に商品化する時に発生するたくさんの問題をすべて解決してくれます。
本当によく考えられています。すごいです。




2016年9月8日木曜日

コンピュータにゲームをさせてみた

「コンピュータにゲームをさせてみる」のいよいよクライマックスです。
今日はコンピュータにゲームを学習させたり、その結果でコンピュータにゲームを
させます。

コンピュータにゲームをさせるにはたくさんのライブラリをいれないといけないので、設定がめんどくさくてなかなかハードルが高いです。なので順を追って説明していきます。

ソースコードは学習することも含めて367行しかないのに。

1. OpenAI GYMをインストール

まずOpenAI GYMをWindowsで動くようにします。
Windows用って書いてますが、実はLinuxでもやることは全部同じです。
なので同じやり方でLinuxでもコンピュータにゲームをさせることができます。

以下のサイトを参考にどんどんいろんなソフトを入れていきます。

Windows 10のLinux/Ubuntu互換環境でbashを使う
http://www.atmarkit.co.jp/ait/articles/1608/08/news039.html

Windows上でOpenAI/gymを実行してみる
http://qiita.com/onelittlenightmusic/items/11eefde5ddad57fd0727



2. いろいろインストール

上記で一応OpanAI GYMだけは動くようになったのですが、Atariのゲームや、機械学習のライブラリのTensorflowとKerasがまだ入っていません。なのでインストールします。


apt-get install python-dev
apt-get install python-opengl
apt-get install python-skimage
apt-get install cmake
apt-get install zlib1g-dev
apt-get install tensorflow
apt-get install git

pip install gym
pip install gym[atari]
pip install keras
export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.10.0-cp27-none-linux_x86_64.whl
pip install $TF_BINARY_URL



こんな感じでどんどんインストールします。



3. Kerasのバックエンドを設定

次にKerasはデフォルトではtheanoを使うように設定されているのでtensorflowを使うように設定を変更します。

KerasをTensorFlowバックエンドで試してみた
http://tjo.hatenablog.com/entry/2016/06/09/190000

上記のサイトを参考に
~/.keras/keras.json
を変更します。

変更前
{"epsilon": 1e-07, "floatx": "float32", "backend": "theano"}

変更後
{"epsilon": 1e-07, "floatx": "float32", "backend": "tensorflow"}



4. Atariのゲームをするプログラムと学習結果をとってくる

ゲームをするプログラムと学習データを取ってきます。

DQNをKerasとTensorFlowとOpenAI Gymで実装する
https://elix-tech.github.io/ja/2016/06/29/dqn-ja.html

上記のサイトにコードとデータがあるので取ってきます。

サイトでは
python dqn.py
と入力すればコンピュータがゲームをしてくれると書いてありますが、実際にはデフォルトではゲームの学習を始めてしまいます。
学習はGPUがあるPCでも非常に時間がかかるので今回は省略します。



5. ソースを一部直す

dqn.pyのソースを以下のように変更し、学習結果をテストするモードにします。
学習結果をテストするくらいならばGPUが載っていない普通のPCでもできます。

変更前
LOAD_NETWORK = False
TRAIN = True


変更後
LOAD_NETWORK = True
TRAIN = False


6. コンピュータにゲームをさせる。

python dqn.py
と入力します。



やったーーーーーー。
きちんとゲーム画面が表示されて生意気にもゲームしてるじゃん。
長かったけどついに僕のWindowsマシンでコンピュータにゲームをさせることができました。
冒頭にも書きましたが、ゲームを学習したりプレーする部分のソースコードは367行しかありません。たったそれだけでゲームすることができちゃうんです。深層強化学習って面白いですね。




2016年9月7日水曜日

WindowsでLinuxのアプリを動かしてみた

Windows10をアップデートするとWindows Subsystem for Linuxという機能が使えるようになるらしいので、8月にリリースされたばかりのWindows10 Anniversary Updateを自分のパソコンにいれてみました。

Windows Subsystem for Linux とはどういう機能かというと、WindowsでLinuxの実行形式のファイルをそのまま実行できる機能です。

すごいですね、LinuxのアプリがそのままWindowsで実行できてしまうのです。
Linuxのgccとかpythonとかapt-getとかのバイナリーがそのままみんなWindowsで動くのです。

ということで、Windows Subsystem for Linuxを動かして、gccやxeyesをapt-getでいれて、本当に動くのか実験してみました。


おーすげー。本当に動く。

この機能は、Linuxで数値計算や深層学習をやっているデータサイエンティストや研究者にとっては大変便利な機能でLinuxしかサポートしていないさまざまなソフトをWindowsで動かすことができます。

これでWindowsでOpenAI GYMを動かして、「ゲームをするコンピュータ」を動かすことができる!
ということで次回はWindowsでOpenAI GYMを動かして「ゲームをするコンピュータ」が本当にゲームをするのか見てみたいと思います。

2016年9月6日火曜日

コンピュータをしゃべらせてみた。

忙しくてしばらく放置していましたが、しゃべるロボットを作ろうとしているおじさん。やっとしゃべる部分を作ることができたので、今日はロボットをどうやってしゃべらすかについて書きます。
音声認識の方はいろいろな書籍がそろっているのですが、音声合成の本ってあまり見かけません。不思議です。まぁいいや。

オープンソースのOpenJTalkというライブラリを使うとコンピュータに日本語をしゃべらすことができます。正確に言うとテキストファイルを音声に変えることができます。

http://open-jtalk.sourceforge.net/

しかし、使っておいて文句を言うのも何なんですが、このページとてもわかりずらい。
ドキュメントをよーくよむとどうやら以下のものが必要らしいです。

(1) Open?JTalk本体
open_jtalk-1.xx

(2) 解析用辞書ファイル
open_jtalk_dic-1.xx

(3) 音声合成エンジン
hts_engine_API-1.xx

(4) 音響モデルデータ
hts_voice_nitech_jp_atr503_m001-1.xx

(1)、(2)、(4)は上記のサイトから入手可能なようですが、(3)は以下の別サイトから取ってくるようです。

http://hts-engine.sourceforge.net/


この四つのファイルを全部取ってきて、ビルドします。
Windowsはサポート対象に含まれていないようなんですが、Windowsでも問題なくビルドできるようです。

ビルド方法も通常のLinuxビルドのようにConfigureをかけるほうもあるのですが、使う漢字コードとライブラリのバージョンの#defineを設定すればどのコンパイラでもビルドできるようです。

ぼくはソースを全部同じフォルダにぶち込んで、適当に#defineを設定してVisualStudio2015でビルドしました。

フォルダがたくさんあって大変なんですが、全部同じフォルダにぶち込んでコンパイルすれば意外と簡単にビルドできます。

input.txtに「こんにちは、ばーか」などと打ち込んで、以下のコマンドを実行すれば話すみたいです。

open_jtalk -m nitech_jp_atr503_m001.htsvoice -x dic -ow output.wav input.txt


喋る部分って意外と簡単。
ラズベリーパイなんかでも余裕で動きます。

これで「音声からテキスト」-->「いろいろ処理」--->「テキストから音声」ができるので、人がしゃべったことを理解して何かを処理して結果をしゃべるロボットを作ることができます。

最近なんでもオープンソースなので、オープンソースを使えたり自由に変更できたりするといろんなことができる気がします。オープンソースがどの程度自由に使えるか?これがソフトウェア技術者として重要な気がします。

音声処理飽きたので、次回は、OpenAI GYMで自動制御とかゲームをするコンピュータでも作ってみようかなぁ。

おじさん、大学時代に音声信号処理と自動制御の研究をしていたのですが、最近ロボットの自動制御に深層強化学習を利用していたりして、なんか勝手に10年以上前の技術が旬になっています。でもおじさんはなぜか仕事がありません。誰か雇ってくれないかなぁ。