2018/11/05

はてなブログに移行をします

はてなブログに移行を予定しています。
https://naonaorange.hatenablog.com/

これまでのBloggerの記事もすでにはてなにインポート済みですので、
はてなの方で検索してもらっても同じ記事がヒットします。

Bloggerの方は他の記事でURLを記載してもらっていたりもするので、そのままにしようと思いますが、
新しい記事ははてなのほうメインにアップしていきます。

これからもはてなの方を見てもらえればうれしいです。

2018/11/04

~/.ros以下にあるROSのLogファイルを削除する方法

nodeが強制的に落ちた時などに、エラー出力で「~/.ros/log/○○○○を見てください」と書かれることが多いです。
そのファイルを探しに行く時に、過去のログファイルもある中から探すとめんどくさいので、
エラーに再現性がある場合は、一度ログファイルをクリアしてからエラーを発生させるといろいろ探す手間が省けます。

ログをクリアするときにはrmなどで強制的に消しても良いと思うのですが、ROSで専用のコマンドが

あるので、それを使ったほうが安心です。

#ログファイルの容量を確認する
rosclean check

#ログファイルを削除する
rosclean purge


https://researchmap.jp/joq6tm53s-2001408/

2018/10/16

VSCodeでPythonをデバッグを実行した時に"Timeout waiting for debugger connection"とエラーが出たら

タイトル通りでVSCodeでPythonをデバッグしたら下記のようなエラーが出た。
デバッグ構成を色々変更しても、解決しないし、ターミナルにシェルが出てきたけど、Pythonプログラムが実行されていない。。。
解決方法としては、下記URLにあるように、
https://stackoverflow.com/questions/52462599/visual-studio-code-python-timeout-waiting-for-debugger-connection

Python Debug Consoleという構成を追加する。

{
     "name": "Python: Debug Console",
     "type": "python",
     "request": "launch",
     "program": "${file}",
     "console": "none"
}

とりあえずこれでできたが、これを毎回しないといけないのだろうか?

2018/09/09

早速Ryzen 自作PCパーツを変更しました。

以前、Ryzen PCを自作しました。
http://kowaimononantenai.blogspot.com/2018/08/ryzen-pc.html

ですが、以前書いたように不満は多かったので、マザボ・ケースを交換しました。
交換後下のような構成になりました。
今回交換したものは赤字にしています。


  • CPU

  • Ryzen 5 2400G 

  • https://www.amd.com/ja/products/apu/amd-ryzen-5-2400g

  • MBD

  • ASROCK Fatal1ty AB350 Gaming-ITX/ac 

  • https://www.asrock.com/MB/AMD/Fatal1ty%20AB350%20Gaming-ITXac/index.jp.asp#Overview

  • MEM

  • CMK16GX4M2A2666C16

  • http://www.links.co.jp/item/cmk16gx4m2a2666c16/

  • GPU

  • GTX 1060 AERO ITX 6G OC 

  • https://jp.msi.com/Graphics-card/GeForce-GTX-1060-AERO-ITX-6G-OC.html

  • 電源

  • SF600 CP-9020105-JP

  • http://www.links.co.jp/item/sf600/

  • ケース

  • Core 500

  • http://www.fractal-design.jp/home/products/cases/core-series/core-500

  • 前回は下記の2つを問題点として挙げていました。
    UbuntuでUSBが認識されない
    ASROCK Fatal1ty AB350は簡単に認識されました。やはりGIGABYTE GA-AB350N のUSB周りが悪かった(または自分が買った個体がたまたま悪かった)のでしょう。
    それどことか、ASROCKではFast bootやセキュリティー関連がUEFIでデフォルトOFFになっていたので、UEFIの設定を変えることなくUbuntuを起動することができました!
    今回ASROCKを初めて使ったのですが、とても良い印象です。

    電源のノイズ音が気になる
    これが変更後気にならなくなりました。
    電源ではなくてマザボから音が鳴っていたのか、またケースを変えたので電源の音が大きくならなくなったのか、
    とりあえず、音が小さくなったので満足です!

    2018/08/17

    ページビューが700,000を超えたので人気の記事を調べて見ました

    ページビューが700,000を超えたので、また閲覧数の多い記事を紹介していきます。
    #前回は300,000の時にやってましたね

    第1位
    mp4とm4vの違い
    http://kowaimononantenai.blogspot.com/2012/09/mp4m4v.html

    100,000、300,000の時も1位だったので、3連覇ですね。
    前回も話ししましたが、自分のちょっとした疑問を書いただけでそんなに努力して書いた記事ではないです(笑)
    個人的には頑張った記事が上になると嬉しいですが、これのようにより一般的な記事の方がやっぱりページビューが伸びますよね。

    第2位
    MPC-HCでBlu-rayを再生する方法
    http://kowaimononantenai.blogspot.com/2013/08/mpc-hcblu-ray.html

    前回3位でしたが、MPC-HCがもう開発終了になってしまったので、これからはページビューも減少傾向になっていくと思います。

    第3位
    OpenCVでfillConvexPolyを使って四角形や多角形を描画する
    http://kowaimononantenai.blogspot.com/2013/10/opencv.html

    使う機会が多いOpenCVが入ってきました。fillConvexPolyは調べた当時サンプルプログラム等がなかったので、自分で確認したものです。
    コメントに応え、Pythonでのサンプルも書きました。
    前回8位。

    第4位
    C++のコンストラクタにある「:(コロン)」について
    http://kowaimononantenai.blogspot.com/2012/10/c.html

    当時はC++メインで使っていましたが、今はC# or Pythonメインになっています。
    前回4位。

    第5位
    C++の「auto型」について
    http://kowaimononantenai.blogspot.com/2012/10/cauto.html

    これもC++関連。auto型について書いたものですね。
    前回2位。

    第6位
    std::accumulateでvectorの合計や平均値を出す(std::accumulateの第3引数について考察もあり)
    http://kowaimononantenai.blogspot.com/2013/11/stdaccumulatevectorstdaccumulate3.html

    これについては、疑問に思ったことを実際にやってみて確認した記事なので上位にきてうれしいです。
    前回圏外。

    第7位
    Windows8.1とUbuntuのUEFI環境でのデュアルブート構築方法
    http://kowaimononantenai.blogspot.com/2014/02/windows81ubuntuuefi.html

    UEFI環境下でのデュアルブートについて書いた記事です。
    Windows8.1での記事ですが、Windows10でも同様に使えると思います。
    前回9位。

    第8位
    Cygwinにapt-cygを導入する
    http://kowaimononantenai.blogspot.com/2013/12/cygwinapt-cyg.html

    Cygwinについての記事です。今ではWSL(Windows Subsystem for Linux)があるので、諸事情でCygwinを使う必要がある場合に参考になるかもしれません。
    前回圏外。

    第9位
    Ubuntuでhandbrakeを使う
    http://kowaimononantenai.blogspot.com/2012/09/ubuntuhandbrake.html

    またUbuntuでのAV関係の記事ですね。
    現在(Ubuntu18.04など)ではsnapshotsのPPAではなくて、releaseの方を使った方がいいかもしれませんね。
    前回圏外。

    第10位
    Windows7でWindows SDKのインストールする際に出るエラーの解決方法
    http://kowaimononantenai.blogspot.com/2013/11/windows7windows-sdk.html

    Windows7での記事ですね。サポートももう少しで終わってしまうので、この記事も減少傾向になりそうですね。
    前回7位。


    全体的に記事が古い(笑)
    最近あまり更新していないということが大きいと思います。

    XamarinとかDeep Learningなどを最近やっていて、使い方を知るためにサンプルプログラムなどを書いたりはしています。
    ですが、それをブログにUPするよりは、「Githubにサンプルプログラム集のリポジトリを作ってREADMEで説明を書いておく」という方法を使うことの方が多くなっています。

    このブログには、何かソフトだったりアプリだったりを作ってその説明を書いておいたり、Githubにリポジトリを作るほど書く量が多くないと思うものだったりします。

    UPする媒体は置いておいて、自分が他人が役に立つ記事を多く書いていきたいと思います。

    2018/08/16

    Ryzen PCを自作しました

    かなり今更ですが、1ヶ月前にRyzen CPUでPC自作しました。
    ここでは購入したものの型番と感想を書いておきます。

    今回の自作PCのコンセプトはこんな感じです。

    • Ryzen !!
    • Deep LearningしたいのでそれなりのGPU(だけど、先々はサーバーに転用するつもりなので、GPUを取り外しても運用できるように)
    • Mini ITXでできるだけ小さく
    • Bluetoothが使えるように(できればintelのWIFI/BTモジュールが使いたい)
    • Windowsだけじゃなく、Ubuntuも使うよ

    色々考えた結果、次のような構成になりました。Ryzen APUにグラボを足すヘンテコな構成は特に見たことがないですね。。。(Ryzen APUはGPUに PCI Express x8しか割り当てられないので、マザボのx16のところにさしても、x8の性能しか得られません。。。)

    • CPU
    • Ryzen 5 2400G


    次に1ヶ月使用しての感想です。

    • UbuntuでUSBが認識されない
      これはマザボに問題があると思うのですが、USBメモリにUbuntuのインストーラーを作成し、マザボにさして電源を入れてもUSBメモリからブートできません。(UEFIの設定やブート順番などの設定をしてもダメでした。。。)
      また、別PCでSSDにUbuntuをインストールして起動すると、起動はできるのですが、USB機器(キーボードやマウス)などが認識されません。。。
      これは自分にとっては致命的ですね。色々やってみたりしているので解決したらここに書く予定です。
    • 電源のノイズ音が気になる
    • 電源に負荷がかかると電源からノイズ音が出ます。ジージーって感じ。PCが机の下などにあるなら気にならないと思いますが、自分はモニターのすぐ横に置いているので気になります。。。

    2018/07/29

    Thinkpad USB トラックポイントキーボード(55Y9024)をWindows10で使う

    キーボードにThinkpad USB トラックポイントキーボード(55Y9024)を使用しています。
    今ではこれより新しいものが発売されており、Lenovoの製品ページでは55Y9024をみつけることはできません。。。

    USBをつなげて使用してみると、中ボタンを押しながらトラックポイントを動かしてスクロールするときの挙動がおかしいです。

    今まではWhell Ballを使用して解決していたのですが、
    Thinkpad USB トラックポイントキーボード(55Y9024)の初期設定

    Windows10で使用してみると、設定画面の起動すらできません。
    ですので、代替ソフトが必要です。

    そこで、W10Wheel.NETというソフトを使用します。

    W10Wheel.NET

    そして、駐在ソフトを右クリックして、
    トリガー -> 中央ドラッグ
    をクリックします。

    これで、おkです。

    参考にしたサイト

    2018/06/09

    インダクティブセンサ LDC1612EVMを使ってみた

    インダクティブセンサモジュールのLDC1612EVMを買ってみました。
    インダクティブセンサとは、相互誘導を用いた近接センサです。
    コイルに指や金属などが近づくことによって磁界が変化するので、相互誘導でインダクタンスが変化します。それを検出することで物が近づいているかどうかを検出できます。
    原理自体はわかるのですが、そのようなセンサを"インダクティブセンサ"っていうんですね。
    上記の説明だけだとわかりにくいと思うので、より詳細に説明しているサイトを載せます。
    https://service.macnica.co.jp/library/124761

    Digikeyで3,500円程度で購入しました。
    https://www.digikey.jp/product-detail/ja/texas-instruments/LDC1612EVM/296-39660-ND/5172354

    評価モジュールなので、USBでつないで専用のソフトをインストールするだけで動かすことができます!
    ソフトのインストール等は下記のサイトに載っているので、同じようにやりました。
    https://www.fujiele.co.jp/semiconductor/ti/tecinfo/news201608090000/
    まずは、CH0を周期的にタッチすると下記のような波形になります。
    次はCH1をタッチ。タッチしたときにその部分だけインダクタンスが変化しているので、
    しっかり検出できそうですね。
    次は、せっかくCHが2つあるので、お互いのコイル間を横に移動します。
    スワイプみたいな感じです。
    まずは青矢印のようにCH0からCH1方向にスワイプすると、CH0の変化の直後にCH1が変化しています。
    逆にオレンジ矢印のようにCH1からCH0方向にスワイプすると、CH1が変化してからCH0が変化します。
    これを使えば、スワイプも検出できそうですね。
    とりあえず、動作確認程度はできました。
    マイコンやRaspberryPiとかで制御しようとしているので、できたらまた載せます。

    2018/06/02

    BLEデバッグツール"Blue Tropical Fish"をリリースしました

    2018年6月5日 更新


    BLEのデバイス/ソフト開発用のアプリ"Blue Tropical Fish"をリリースしました。
    BLEのデバッグアプリとしては「nrf connect」や「Light Blue」が有名ですが、
    それらと同じような(というか機能縮小版。。。)アプリになります。

    Google playからインストール可能です。
    https://play.google.com/store/apps/details?id=com.naonaorange.bluetropicalfish

    Windows storeでもインストール可能です。
    https://www.microsoft.com/en-us/p/blue-tropical-fish/9p14nwqz276h?activetab=pivot%3aoverviewtab

    ソースはGithubにアップしています。
    https://github.com/naonaorange/BlueTropicalFish

    現時点では、周囲のBluetoothアドバタイズパケットを受信して表示します。
    将来的には接続・ペアリングもサポート予定ですが、現時点では未サポートです。
    リストを選択することでデバイスの詳細情報を見ることができます。

    表示するデバイスをフィルターすることもできます。
    Nameの項目に入力にした後、"Show Only Filtered Devices"をONにすることでフィルター条件にマッチしたものだけ表示します。
    また、リストの右側のスイッチをONにしてお気に入りに登録することで、
    "Show Only Favorite Devices"をONにすることでお気に入りのデバイスのみを表示することができます。

    2018/05/03

    Xamarin.Formsで画像を表示する

    Xamarin.Formsで画像を表示する方法はググるとたくさん出てきますが、
    なぜか自分の環境だと上手く表示されません。
    https://qiita.com/suzu-king/items/a0fe98e7b371e13e49b5
    http://oxamarin.com/control-image/
    ちなみに自分の環境は下記です。
    • Windows10 64bit
    • Visual Studio Community 2017
    • Xamarin.Forms(UWP + Android + iOS)
    • Prism Template Packでひな形を作成
    画像が表示されなかったり、"System.ArgumentNullException: 'Value cannot be null.'とエラーが出てしまいます。(おそらく画像へのPATHが当たっていないと思うのですが、なかなか解決できません。)

    よって、ちょっと違う方法で画像を表示させることができたのでその方法を書きます。
    まずはXamlのコードを張ります。
    
    
        
            
    
    Prism Templateをベースとしているので、余計なコードも入っていますが、重要なのはImageタグでSourceをImgにバインディングしていることだけです。
     次はViewModelのコードです。
    namespace ShowImage.ViewModels
    {
        public class MainPageViewModel : ViewModelBase
        {
            private ImageSource img;
            public ImageSource Img
            {
                get { return img; }
                set { SetProperty(ref img, value); }
            }
    
            public MainPageViewModel(INavigationService navigationService) 
                : base (navigationService)
            {
                Title = "Main Page";
                Img = ImageSource.FromFile("lena.png");
                
            }
        }
    }
    重要な点は、ImageSource.FromFileを使用している点です。他の記事ではFromResourceを使用しているものが多いですが、Resourceとしてではなく、ただのファイルとして指定します。
    Prismを用いているので、ImgはSetProertyで変更通知を行っています。

    次に画像ファイルをプロジェクトに登録します。
    ここで1つ目のポイントはForms用の画像ファイルについて
    • ビルドアクションは"コンテンツ"(なしでもいいと思います)
    • 出力ディレクトリにコピーは"新しい場合はコピーする”

    2つ目のポイントはAndroid, iOS, UWPのプロジェクトに画像ファイルを追加するときには、Formsに追加した画像ファイルを"リンクとして追加"することです。

    これで各プロジェクトに画像ファイルが登録されますが、実体はFormsに登録してある1つのみにすることができます。
    このようにすることでFormsに登録してある画像1つを変更すればすべてのPlatformにおいて変更されます。

    初めの方で紹介したURLのやり方がもしできるのであればそれの方がシンプルでよいと思いますが、もしできない場合はこちらの方法も試してもらえればと思います。

    参考にしたサイト

    http://matatabi-ux.hateblo.jp/entry/2015/05/18/120000

    2018/04/11

    Deep Learningのハリーポッター組分け帽子をLINE Botにしてみた

    先日、Deep Learningを使ってハリーポッターの組分け帽子を作りました。

    作ったはいいものの、利用するには環境を構築して、試さなければいけません。。。
    ですので、作ったソフト"Sorting Deep Hat"をLINE Botにしてみました!

    QRコードは下記です。
    LINE Botで公開しているので、誰でも利用することができるのですが、
    LINE Botのプランはフリーのものを使用しているため、送信数に限度があります。
    よって、そのうち利用できなくなる可能性があります。
    (MAXになってLINE Botが使えなくなったら、Twitter Botにでもしようかな。)

    送信された画像は送り返すために一時ファイルとして保存していますが、
    プログラム終了時に消えるようになっています。

    また、デバッグ等を行っている時には正常に動作しない場合もありますので、その場合はご了承ください。

    LINE Botの使い方

    Botに画像を送信すると、すぐに結果を文字と画像で送信してくれるというものです。
    文字を送信した場合には同じ文字をオウム返しで送り直してきます。
    もしも、画像内に顔が見つからない場合には、「もっと大きく写る写真を使う」よう言われます。
    顔認識にはOpenCVを用いていて、模様等をご認識することがよくあるので、顔が大きく写っている画像でないと認識しないよう厳し目にパラメータを設定しています。
    大まかに画像の縦1/3程度は顔になるくらい顔が大きく写っているものを送信してください。

    HerokuでWebサーバーを立てて、運用していますが、その中のプログラムはGithubで公開しています。

    2018/04/03

    Heroku, PythonでLine Botを作る

    ここでは送信したメッセージをオウム返しするLine Botを作ります。
    基本的に他のブログの引用ですが、体系的にまとめました。

    Lineアカウント作成

    Botを作るためには、下記の2アカウントを作る必要があります。
    • Line Business
    • Messasing API
    ここは下記URLを参考に
    https://qiita.com/yoshizaki_kkgk/items/bd4277d3943200beab26

    Herokuアカウント作成

    下記URLを参考に
    https://j-hack.gitbooks.io/deploy-meteor-app-to-heroku/content/step1.html

    Line Bot作成

    基本的には下記URLと同じです。

    しかし、この説明ではHeroku Gitのみを使用していますが、
    ここではGithubとHerokuを連携させて使用します。

    Githubレポジトリ作成・実装

    まずは、Githubで連携したいレポジトリを新規作成します。
    そのレポジトリ内に上記URLの「実装」章を参考にして、ファイルの追加・編集を行い、レポジトリにpushしてください。
    tree
    .
    ├── LICENSE
    ├── Procfile
    ├── README.md
    ├── main.py
    └── requirements.txt

    次にブラウザでHerokuのアカウントにログインをして、"Create new app"等を押して、アプリケーションを作成します。
    設定画面の"Deploy"タブ内のDevelopment methodでGithubを選び、先ほど作成したレポジトリを設定します。

    初期設定・デプロイ

    まずは初期設定を行います。下記コマンドでHerokuにログインします。
    参考にしているサイトではheroku createでアプリケーションを作成していますが、先ほどブラウザ上で作成しましたので不要です。
    heroku login
    次に同じようにLINEのアカウント設定を環境変数に追加する必要があるのですが、、、
    • LINE_CHANNEL_SECRET
    • LINE_CHANNEL_ACCESS_TOKEN
    参考にしたサイトと同じようにconfig:setのコマンドを打ってもエラーになってしまいます。。。
    これは、heroku createをCLIで行っていないため、config:setコマンドがどのHerokuアプリケーションを対象にしているのかわからないためだと思います。
    よって、下記のように変更して実行します。
    heroku config:set LINE_CHANNEL_SECRET="チャンネルシークレット" -app アプリケーション名
    heroku config:set LINE_CHANNEL_ACCESS_TOKEN="アクセストークン" -app アプリケーション名
    その後、ブラウザ上で手動でデプロイします。

    最後に、同じようにLine DevelopperサイトのChannel基本設定画面で、Webhook URLを登録します。
    ここで注意するのは、URLは下記のように最後に"callback"がつきます。
    (自分はこれを追加しないで長い間悩んでしまいました。。。)
    https://アプリケーション名.herokuapp.com/callback
    これで自分のスマホでBotを友達にして、メッセージを投げるとオウム返しします。

    2018/03/31

    Bing Image Search APIでネット上の画像を集める

    Deep Learningで画像を学習させるために、大量の画像が必要ですが、
    それを1つ1つ手で保存していくととても時間がかかります。

    ですので、ある言葉に関連のある(ググったら出てくる)画像を自動的に保存するプログラムを使います。

    Bringだったり、GoogleだったりでAPIが提供されているのですが、
    下記のURLを参考にして、"Bing Image Search API"を使うことにしました。
    https://qiita.com/ysdyt/items/565a0bf3228e12a2c503

    ちなみに、ユーザー登録してから1ヶ月程度はある上限まで無料で使えますが、
    それ以降は有料です。
    ですが、それほど高価な金額になるわけでもないですので、これを使っていきます。

    Microsoft Azureのユーザー登録

    Bring Image Search APIはMicrosoft Azureの一部の機能になっていますので、ユーザー登録が必要です。

    登録は下記URLを参考に。ちなみにコードについてはAPIのVerが古いので、別のサイトを参考にしました。
    https://qiita.com/ysdyt/items/49e99416079546b65dfc

    使ってみる

    下記URLを見て、コードをすべてコピペしたら動きました。
    まずはやりたいことはこれでできます。
    https://qiita.com/hirosemi/items/086f8375fd0f3fa5237b

    Deep Learningでハリーポッターの組分け帽子を作りました

    ホグワーツには"グリフィンドール"、"レイブンクロー"、"ハッフルパフ"、"スリザリン"という4つの寮があり、映画の作品を見てみると、顔だったり雰囲気だったりになんとなく違いがあると思います。
    誰しも「自分はどの寮に入るのかな??」と思ったことがありますよね!

    よって、任意の画像から顔を判別し、その人が4つの寮のどれに入るのかをDeep Learningで判断するソフト"Sorting Deep Hat"を作りました!

    (調べたところ、全く同じ動機から、全く同じようなソフトを作った人がいらっしゃいますし、そちらのほうがわかりやすいかもしれません。このSorting Deep Hatもこの記事の影響を大きく受けています。)
    https://qiita.com/tokkuman/items/aec887ff918fc164567e

    ソースはGithubに公開しています。
    https://github.com/naonaorange/sorting_deep_hat

    動作環境

    Deep Learingライブラリとしては、"Keras"を使っています。
    • Ubuntu 16.04 64bit
    • Python 3.6 64bit
    • Jupyter 4.4
    • Tensorflow 1.5
    • Keras 2.1.5
    • OpenCV 3.4

    画像集め

    映画内で各寮に入っているキャラクターの顔画像を集めます。
    学習画像としては各寮100枚ずつの計400枚。
    評価画像としては各寮20枚ずつの計80枚を準備しました。

    データ集めはDeep Learingにおいて、一番重要で一番大変な作業なので、
    他でも参考できるように別記事にします。

    下の記事で簡単に説明しました。
    「Bing Image Search APIでネット上の画像を集める」
    http://kowaimononantenai.blogspot.jp/2018/03/bing-image-search-api.html


    モデル作成

    CNNで実装していきます。
    最終的に全結合層で出力数を4にしています。
    Deep Learingについて、始めたばかりなので、パラメータ等もっとよいものがあるのかもしれません。
    from keras.models import Sequential
    from keras.layers import Dense, Dropout, Flatten, Activation
    from keras.layers import Conv2D, MaxPooling2D, ZeroPadding2D
    from keras import optimizers
    from keras.preprocessing.image import ImageDataGenerator
    from keras.callbacks import EarlyStopping, CSVLogger
    from keras import backend as K
    import matplotlib.pyplot as plt
    import numpy as np 
    
    
    img_width = 100
    img_height = 100
    train_data_dir = 'data/train'
    valid_data_dir = 'data/validation'
    
    datagen = ImageDataGenerator(rescale = 1./255)
    
    train_generator = datagen.flow_from_directory(directory=train_data_dir,
                                                  target_size=(img_width,img_height),
                                                  classes=['Glyffindor','Hufflpuff','Ravenclaw','Slytherin'],
                                                  batch_size=16)
    
    validation_generator = datagen.flow_from_directory(directory=valid_data_dir,
                                                       target_size=(img_width,img_height),
                                                       classes=['Glyffindor','Hufflpuff','Ravenclaw','Slytherin'],
                                                       batch_size=16)
    
    model =Sequential()
    
    model.add(Conv2D(32,(3,3), input_shape=(img_width, img_height, 3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2,2)))
    
    model.add(Conv2D(32,(3,3), input_shape=(img_width, img_height, 3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2,2)))
    
    model.add(Conv2D(64,(3,3), input_shape=(img_width, img_height, 3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2,2)))
    
    model.add(Flatten())
    model.add(Dense(64))
    model.add(Activation('relu'))
    model.add(Dropout(0.5))
    model.add(Dense(4))
    model.add(Activation('softmax'))
    
    model.summary()
    
    model.compile(loss='categorical_crossentropy',optimizer='rmsprop',metrics=['accuracy'])
    
    es = EarlyStopping(monitor='val_loss', patience=2)
    training = model.fit_generator(generator=train_generator,
                                   steps_per_epoch=400 // 16,
                                   epochs=20,
                                   validation_data=validation_generator,
                                   validation_steps=80//16,
                                   callbacks=[es])
    
    model.save('models/sorting_deep_hat.h5')
    


    精度確認

    作ったモデルの精度を確認していきます。
    最終的には、学習画像については約85%。評価画像については約73%の精度となっています。
    まずはこの程度でしょうか。
    引き続き精度向上のため変更していきます。

    動作確認

    任意の画像からOpenCVで顔画像を切り取り、作成したモデルで寮を判別します。
    その結果に応じて、顔に矩形と寮名を描画します。
    from keras.models import load_model
    import cv2
    import matplotlib.pyplot as plt
    import numpy as np
    
    model = load_model('models/sorting_deep_hat.h5')
    
    image = cv2.imread('data/sample/harrypotter.jpg')
    
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
    faces = face_cascade.detectMultiScale(gray, 1.1, 3)
    
    for (x, y, w, h) in faces:
        face_image = image[y:y+h, x:x+w]
        face_image = cv2.resize(face_image, (100, 100))
        
        b,g,r = cv2.split(image)
        i = cv2.merge([r,g,b])
        i = cv2.resize(i,(100, 100))
        i = np.array([i / 255.])
        
        house = np.argmax(model.predict(i))
        if house == 0:
            house_name = 'Glyffindor'
            color = (0, 0, 255)
        elif house == 1:
            house_name = 'Hufflpuff'
            color = (0, 255, 255)
        elif house == 2:
            house_name = 'Ravenclaw'
            color = (255, 0, 0)
        elif house == 3:
            house_name = 'Slytherin'
            color = (0, 255, 0) 
        
        cv2.rectangle(image, (x, y), (x + w, y + h), color, 2)
        cv2.putText(image, house_name, (x, y), cv2.FONT_HERSHEY_PLAIN, 2, color, 4)
        
    plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
    plt.show()
    

    実際にハリーポッターの画像を入力してみると、こんな感じになりました。
    きちんとハリーはグリフィンドールに判断されています。
    マルフォイはスリザリン。

    いろんな人を何枚か試しましたが、確かに間違えるときはありますが、それなりに判断しています。

    いろんな人で試してみる

    イチローはグリフィンドール。
    確かに、勇気とか騎士道精神とかありそうですね。
    トランプ大統領はレイブンクロー。
    確かに、頭はいいからね!(スリザリンだと思ったのに。。。)
    ジョブズはスリザリン。
    ちょっと意外ですが、確かに「巧妙さ」とかはあるかなと、自伝を読んで感じました。


    ガッキーはグリフィンドール。まあ、どの寮でもかわいいからOK!

    参考サイト


    2018/03/27

    pyenvとpyenv-virtualenvのインストール

    同一PCで複数のPythonのバージョンを使い分ける必要ができてしまったので、調べてみるとpyenvというものがあるそうです。
    また、pyenv-virtualenvも使うと幸せになれるそうです。

    簡単に説明すると、以下。
    • pyenv
    同一PC内に複数のバージョンのPythonの共存させるソフト。
    2系と3系とかのレベルではなく、3.5.2と3.6.4を共存させたりできる。
    • pyenv-virtualenv
    pyenvを使いやすくするためのソフト。
    virtualenvとは別物(かなりややこしい。ネットでは一緒のものとして誤って説明されていたりするのでググるときには要注意!!)
    pyenvだけでも使えるが、pyenv-virtualenvを使うことで何が嬉しいかというと。。。

    (以下、URLからの引用)
    https://qiita.com/maskedw/items/aaa2fd7abfd493cf2820
    pyenv-virtualenvはpyenvのプラグインです。pyenvでは複数のPythonバージョンをインストールできますが、各Pythonバージョンのモジュールを管理するsite-packagesというディレクトリは共通です。pyenv-virtualenvを使用すると同じPythonバージョンで別々のsite-packagesを管理することができます。
    開発中のアプリーケーションで使用しているモジュールのバージョンを全て固定したり、必要最小限だけのモジュールをインストールしたりすることによって、開発環境と実行環境の違いを最小限にすることができます。



    pyenvのインストール

    基本的にGithubのREADMEと同じです。
    https://github.com/pyenv/pyenv
    gitから持ってきます(pipでインストールできればいいのに。。。)
    git clone https://github.com/pyenv/pyenv.git ~/.pyenv
    次に、設定をしていきます。
    echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
    echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
    echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bashrc
    pyenvコマンドを実行して使えるかどうかを確認してください。

    pyenv-virtualenvのインストール

    こちらもGithubの説明と同様です。
    https://github.com/pyenv/pyenv-virtualenv
    git clone https://github.com/pyenv/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
    echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile

    使い方

    #Pythonのコンパイルに必要なライブラリ軍をまずはインストール
    sudo apt-get install git gcc make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev
    
    #pyenvでインストールできるバージョンの確認
    pyenv install --list
    #使用するバージョンのPythonをコンパイル
    pyenv install 3.6.4
    
    #仮想環境を作成
    #ENV_NAMEは仮想環境の名前を入れます
    pyenv virtualenv 3.6.4 ENV_NAME
    
    #現在ある仮想環境を確認
    pyenv virtualenvs
    
    #仮想環境の有効化、無効化
    pyenv activate ENV_NAME
    pyenv deactivate
    
    #仮想環境の削除
    pyenv uninstall ENV_NAME
    

    参考にしたサイト

    https://qiita.com/akito1986/items/be5dcd1a502aaf22010b

    2018/03/23

    Jupyter Notebookを起動するとAttributeError: type object 'IOLoop' has no attribute 'initialized'とエラーが出る

    Jupyterをインストール後、Jupyter Notebookを起動すると、下記のようなエラーが出てしまいます。

    AttributeError: type object 'IOLoop' has no attribute 'initialized'

    GitHubにはissueがすでに上がっているそうで、
    https://github.com/ipython/ipython/issues/8374

    下記コマンドを実行して、tornadoというソフトをダウングレードすることで、一時的に回避できるそうです。
    pip3 uninstall tornado
    pip3 install tornado==4.5.3
    

    2018/03/21

    Tensorflowが"Illegal instruction (コアダンプ)"で動かない

    Tensorflowをインストールして実行しようとしたところ、エラーで動かなくなってしまいました。
    Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
    [GCC 5.4.0 20160609] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import tensorflow as tf
    Illegal instruction (コアダンプ)
    
    環境は下記です。
    • Tensorflow 1.6
    • Python 3.5
    原因はよくわかっていませんが、一応TensorflowのVerを1.5にすることでエラーが出なくなりました。
    (Ver 1.5.1では同様のエラーが出てしまいました。)
    とりあえずはこれでやっていきます。
    pip uninstall tensorflow tensorflow-tensorboard
    pip install tensorflow==1.5

    2018/01/26

    Galaxy S7 Edge SC-02H をAndroid6にダウングレード

    Galaxy S7 Edge SC-02HをAndroid6にダウングレードしてみました。

    ROMを書き込むにはOdinを使用するので、ダウンロードします。
    現時点での最新3.12.3をとってきました。
    https://samsungodin.com/

    次にSC-02H用Android6のROMをダウンロードし、展開しておきます。
    下記URLのStock ODIN firmwareを落とします。
    https://forum.xda-developers.com/s7-edge/samsung-galaxy-s7-edge-snapdragon-roms-kernels-recoveries--other-development/rom-kernel-twrp-snapdragon-sm-g935d-t3540431

    次はGalaxy S7 Edgeの設定です。
    1. 開発者モード内のOEMロック解除をON
    2. 一度電源を切り、電源ボタン+音量下ボタン+ホームボタンを同時長押ししてDownloadモードで起動
    3. 注意事項を読み、音量上ボタンで承諾
    4. USBでPCとつなぐ
    5. Galaxy S7 Edgeが認識されたか(ドライバは入ったか)確認
    次に、Odinを起動します。
    ログ画面に"Added."と出力されていれば、スマホが認識されています。

    Odinの画面の右側に"BL"、"AP"、"CP"、"CSC"の入力欄があります。そこにダウンロードしたROMファイルの先頭の名前が対応するように選択していきます。
    (APなどの容量の大きいファイルを選択した際には、認識までに時間がかかるので、待ちます。)

    次に"Start"を押します。

    これでOKです。
    しばらく待つと、スマホが自動的に再起動して、初期設定画面になります。

    参考にしたサイト
    http://reviewdays.com/archives/56765