あどりぶろぐ=adli"B"log

表情認識を研究する海なし県民のブログ

YouTubeから動画を一括ダウンロードする【Pytube】

研究で複数の動画が必要になりました。被験者に観てもらうためです。

 

インターネット上には、たくさんのYouTubeダウンロードサービスがあります。

普段YouTubeをダウンロードする際は、それらを使用するのですが、今回は複数の動画を一括でダウンロードしたいのです。

 

既存のサービスは、ダウンロードは1動画ずつしかできないし、いちいち広告が出てきてウザい!

 

ということで、YouTubeの動画もしくはプレイリストのURLを複数入力すると、それらを一括でダウンロードしてくれるPythonスクリプトを作成しました。

f:id:shubarie:20180628004638p:plain

概要

まず、完成品はコチラです。

github.com

 

スクリプトを見ていただければわかると思うのですが、ほとんどPytubeというパッケージを使用しているだけです笑

 

ダウンロード先ディレクトリを作成した後、標準入力から複数のURLを受け取って、そのURLリストをPytubeに流し、ダウンロードしています。

 

工夫した点としては、動画のURLとプレイリストのURLとが混在していても、問題なく一括でダウンロードできるようにしたところがあげられますかね。

使い方

準備

pip install pytube

git clone https://github.com/shubarie/batch-download-from-YouTube.git

cd batch-download-from-YouTube

実行

python download.py

あとは、コマンドラインに従って、以下の手順をこなすことで一括ダウンロードが開始されます。

  1. 保存ディレクトリ名を入力
  2. 動画かプレイリストのURLを好きなだけ入力
  3. "exit"と入力

感想

今後、趣味等でも使っていけそうなスクリプトが完成しました。

他の人にも使ってもらえるように、Herokuで公開してみようかなと思います。

adliblog.hatenablog.com

heroku+GitHubでDjangoアプリのデプロイに挑戦した

Webアプリを作りたい!

 

自分の作った成果物を誰かに試してほしい!

 

こんな思いを抱きながら悶々と過ごしていましたが、研究で複数の生きたデータを集める必要があったので、良い機会だと思いWebアプリの作成に挑戦することにしました!

 

f:id:shubarie:20180615043500p:plain

 概要

以下の流れでWebアプリを作成および公開(デプロイ)しました。

  1. herokuとGitHubを連携
  2. Anacondaで作成したローカル仮想環境上で開発
  3. GitHubにpush

めっちゃ簡単!!

公開したWebアプリ(仮)はコチラです↓

https://django-in-heroku.herokuapp.com/sample_app/input

herokuとGitHubを連携

herokuとは、Webアプリを公開するためのプラットフォームを提供してくれるもので、Paas(Platform as a Service)とよばれています。

 

最近ではGitHubのリモートリポジトリと連携することで、特に何かを追加でインストールしたりすることなく、作成したWebアプリを公開できるようです。

 

特に難しい所もなく、herokuへのサインアップ、herokuアプリの作成、GitHubリモートリポジトリとの連携が完了しました。

f:id:shubarie:20180615034344p:plain

herokuとGitHubの連携

Anacondaで作成したローカル仮想環境上で開発

イチからDjango Projectを作成して、Procfileなどを作成することも試しましたが、コレが一番簡単でした。

github.com

Djangoのプロジェクトを作成し、必要ファイルをまとめてある凄いリポジトリです。

 

READMEを見れば導入方法が書いてありますが、今回はAnacondaの仮想環境下で使用するので、Pipfileの中を見て、手打ちで各種パッケージをインストールしました。

pip install django

pip install psycopg2-binary

pip install django-heroku

pip install gunicorn

もうちょっとスマートな方法もありそうですが。笑

 

試しに以下コマンドでローカルサーバ上でWebアプリを確認してみます。

python manage.py runserver

f:id:shubarie:20180615041921p:plain

local上で確認できたWebアプリ

おお!動いてますね、Django

URLはこんな感じ。

f:id:shubarie:20180615042029p:plain

ローカルのテストサーバで動いているので、こんな感じのURLになっています。

もちろん、他の端末からはこのURLにはアクセスできません。

 

と、いうことで、Djangoのテンプレートが用意できたので、あとは、Djangoドキュメンテーションとにらめっこしながら開発していけばよいわけです。

 

が、今回はテンプレートには何も手を加えずデプロイすることにします。

GitHubにプッシュ

先のリポジトリのREADMEでは、heroku CLIというアプリを用いてherokuに直接デプロイする方法が記載してあります。

 

今回はGitHubにPushすることで、herokuと連動して自動デプロイされるため、以下の部分を変更する必要がありました。

 

変更前:

Deployment to Heroku
$ git init
$ git add -A
$ git commit -m "Initial commit"

$ heroku create
$ git push heroku master

$ heroku run python manage.py migrate

変更後:

Deployment to GitHub
$ git init
$ git add -A
$ git commit -m "Initial commit"

$ git remote add origin https://github.com/[username]/[repository_name].git
$ git push origin master

これでなんと、デプロイが完了・・・!

簡単すぎる!

デプロイしたWebアプリを確認

 既にherokuとGitHubの連携がなされているので、herokuのアプリページに行き、右上のOpen Appボタンをクリックすると・・・

f:id:shubarie:20180615041101p:plain

heroku上で公開されたWebアプリ

おお!すごい・・・!

python manage.py runserver で確認したローカル上と同様の挙動です。しかし、URLを確認すると・・・

f:id:shubarie:20180615041250p:plain

しっかりheroku上で実装されていることが分かります。

 

もちろん、スマホ上からも確認できます。

何気に、スマホフレンドリーな表示になっている、Django凄い。笑

f:id:shubarie:20180615041534j:plain

AndroidからもアクセスできるWebアプリ



以上、「heroku+GitHubDjangoアプリのデプロイに挑戦した」でした。

 

次回はDjangoでの開発、Webアプリを作成していきます。

トラブルシューティング

工程でつまづいたところをまとめます。

herokuアプリが起動しない

herokuとGitHubを連携し、テンプレートをGitHubにpushし、HerokuのアプリページでOpen Appでアプリを起動すると、以下の画面が現れてしまいました。

f:id:shubarie:20180615044428p:plain

作成したWEBアプリが起動しない

おそらくGitHubリポジトリの変更が反映されていないのではないでしょうか。

 

リモートリポジトリへのPushなどで、GitHubリポジトリを更新したら、反映がなされたのか、無事herokuからのWebアプリ起動に成功しました。

 

簡単なことでしたが、解決するまで右往左往してしまいました。笑

到来!ブラウザだけで機械学習プログラミングが始められる時代!

技術の進歩ってスゲー!と思わず言ってしまうような素敵な体験でした。

今日はGoogle Colaboratoryを使ってみた話です。

Colaboratory is a Google research project created to help disseminate machine learning education and research. It's a Jupyter notebook environment that requires no setup to use and runs entirely in the cloud.

 

 

Colaboratoryのココが凄い!

 

  • 早い!セットアップがいらない
  • 強い!GPU(Tesla K80)が使える
  • 安い!無料で使用できる

 

 

 

この3点かなと思います。

 

早い!セットアップがいらない

僕はビックリしました!!!

「Colaboratory」って検索して出てきたページ上ですぐKerasが動く!!!

f:id:shubarie:20180416190528p:plain

 

Chorome上だとGoogleのアカウントに常にサインインした状態だから、ページを開くだけで始められるww

 

Colaboratoryの特徴としてGoogle Driveと連携できる点があります。

 

Google Driveを開いて、「新規」→「その他」→「アプリを追加」

あとは検索欄に「Colaboratory」と入力して「アプリを追加」を選択しましょう。

f:id:shubarie:20180416191609p:plain

これで、Google Driveから新規ファイル作成を選択するだけででプログラミングができる!

 

強い!GPU(Tesla K80)が使える

 

ノートブックのメニューバーから「編集」→「ノートブックの設定」でGPUを使用する設定に変更することができます。

ここからPython2/3の変更もできます。

 

f:id:shubarie:20180416192119p:plain

 

試しに、Kerasのサンプルを回して学習にどのくらいの時間がかかるか試してみます。

5層のCNNをMNISTデータで学習。BATCH_SIZE=128/EPOC=12です。

f:id:shubarie:20180416193036p:plain

Acurracyは0.99。実行時間は152.sでした!

 

比較対象として、研究室PCが積んでいるGTX1050でも同様のスクリプトを回してみます。

f:id:shubarie:20180416193738p:plain

Acurracyは0.99。実行時間は170.sでした!

 

え、まじか・・・

研究室のPC要らない説浮上・・・

 

^^;

安い!無料で使用できる

そして驚くべくは、このハイパワーマシンと機械学習環境を無料で使えるということ!

Googleスゲー・・・

 

まぁ、いくつか制約はあるようです。

  • アイドル状態が90分続くと停止
  • 連続使用は最大12時間

 

それと、僕がお試しでGPUを使っている時に、

 

GPU を使用するバックエンドは利用できません。」

 

なるエラーメッセージが出て、一時的にGPUが利用できなくなったことがありました。

しばらく待って再接続したら普通に接続できたので、おそらくこれもアクセスが集中した場合の制限でしょう。

 

こういった制限が嫌ならローカルにGPU買ってきてやりましょうね、ってことですね。

今後の使い道

端末を問わず、(僕にとっては)必要十分なパワーのGPUでいろいろ試せるということで、今後はColaboratoryをメインで開発していこうかなと思います。

 

僕がColaboratoryで作成したスクリプトファイルを共有すれば、だれでも一瞬でスクリプトを動作させることができるというのも非常に魅力的です。

 

あと、

!pip install pandas

のようにスクリプトに記載するだけでパッケージを入れることもできますし、マジでローカルのPCと変わらず使っていけそうです。

 

一つだけ問題なのは、学習データをどうするか問題。

 

調べたところ、ローカル、Google DriveDrop Boxなどから学習データを引っ張ってくる方法はあるようなので、楽な方法を模索していこうかと思っています。

めっちゃ簡単!scikit-learnでConfusion Matrix(混同行列)を実装しました!

 

f:id:shubarie:20180215170920p:plain

はじめに

今週はscikit-learnを使ってConfusion Matrixの作成と図示、保存の機能を実装しました。

Confusion Matrix(混同行列)

機械学習を用いたクラス分類の精度を評価するには、混同行列 (Confusion matrix) を作成して、正しく識別できた件数、誤って識別した件数を比較することが一般的です。混同行列は横方向に識別モデルが算出した識別結果、縦に実際の値 (正解データ) を記します。

参考:scikit-learn でクラス分類結果を評価する – Python でデータサイエンス

scikit-learn

Simple and efficient tools for data mining and data analysis

参考:http://scikit-learn.org/stable/

僕は表情認識の研究を以前から連続して行っており、Confusion Matrixは実装したことがありました。

 

先週、そのスクリプトを引っ張り出してきて見たのですが、これがものsssssっすごく読みにくい。。

 

当時の僕は、「自分が作って自分が読むだけのプログラムなんてMainに全部放り込めばええやろw 動けばいいんやw」という考え方だったのですが、、いや、自分でも読めねえよ過去の俺。。

f:id:shubarie:20180215170504p:plain

1年前の自分が作ったスクリプトが吐き出した画像


というわけで書き直すに至ったのですが、どうせならライブラリ使ってスマートに実装しようぜということで、今回のscikit-learnを使っての実装に至りました。

 

結果

 冒頭にも紹介したコチラが今回実装したスクリプトから吐き出されるConfusion Matrixです。

f:id:shubarie:20180215170920p:plain

現在の自分が作ったスクリプトが吐き出した画像

横軸ラベルが若干見切れてたり、ラベルが番号(0=Angry, 1=Disgust, 2=Fear, 3=Happy, 4=Sad, 5=Surprise, 6=Neutral)になっていたりと、まだまだ手直しする部分はありますが、必要十分なものができたと思います。

 

ついでに、precision、recall、f1-scoreなどのモデル評価値の計算と可視化も実装しました。こちらはテキスト(.txt)形式で保存されます。

 

f:id:shubarie:20180215171945p:plain

モデル評価値の計算と可視化

以下のリポジトリの、scripts/evaluation.pyの各種パスをお好みで定義し、実行することで、データに対する学習モデルのテストが行われ、その結果が保存されます。

github.com

実装方法

中で実際に 動いているソースコードはこんな感じです。


def evaluate(self,input_dir,result_dir,labels):
    # confusion matrixをプロットし画像として保存する関数
    # 参考: http://scikit-learn.org/stable/auto_examples/model_selection/plot_confusion_matrix.html#sphx-glr-auto-examples-model-selection-plot-confusion-matrix-py
        def plot_confusion_matrix(cm, classes, output_file,
                                  normalize=False,
                                  title='Confusion matrix',
                                  cmap=plt.cm.Blues):
            """
            This function prints and plots the confusion matrix.
            Normalization can be applied by setting `normalize=True`.
            """
            if normalize:
                cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
                print("Normalized confusion matrix")
            else:
                print('Confusion matrix, without normalization')

            print(cm)

            plt.imshow(cm, interpolation='nearest', cmap=cmap)
            plt.title(title)
            plt.colorbar()
            tick_marks = np.arange(len(classes))
            plt.xticks(tick_marks, classes, rotation=45)
            plt.yticks(tick_marks, classes)

            fmt = '.2f' if normalize else 'd'
            thresh = cm.max() / 2.
            for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
                plt.text(j, i, format(cm[i, j], fmt),
                         horizontalalignment="center",
                         color="white" if cm[i, j] > thresh else "black")

            plt.tight_layout()
            plt.ylabel('True label')
            plt.xlabel('Predicted label')
            plt.savefig(output_file)
            
        # 検証用ディレクトリを掘りながらpredictする
        y_true=[]
        y_pred=[]
        files=os.listdir(input_dir)
        for file_ in files:
            sub_path=os.path.join(input_dir,file_)
            subfiles=os.listdir(sub_path)
            for subfile in subfiles:
                img_path=os.path.join(sub_path,subfile)
                img=cv2.imread(img_path,cv2.IMREAD_GRAYSCALE)
                _,reshaped_img=self.dataset.reshape_img(img)
                label,_=self.predict(reshaped_img)
                y_true.append(int(file_))
                y_pred.append(label)
                
        # 有効桁数を下2桁とする
        np.set_printoptions(precision=2)
        
        # accuracyの計算
        accuracy=accuracy_score(y_true,y_pred)
        
        # confusion matrixの作成
        cnf_matrix=confusion_matrix(y_true,y_pred,labels=labels)
        
        # report(各種スコア)の作成と保存
        report=classification_report(y_true,y_pred,labels=labels)
        report_file=open(result_dir+"/report.txt","w")
        report_file.write(report)
        report_file.close()
        print(report)
        
        # confusion matrixのプロット、保存、表示
        title="overall accuracy:"+str(accuracy)
        plt.figure()
        plot_confusion_matrix(cnf_matrix, classes=labels,output_file=result_dir+"/CM_without_normalize.png",title=title)
        plt.figure()
        plot_confusion_matrix(cnf_matrix, classes=labels,output_file=result_dir+"/CM_normalized.png", normalize=True,title=title)
        plt.show()

 

このうち、実際にConfusion Matrixを作成しているのはこの部分。


# confusion matrixの作成
cnf_matrix=confusion_matrix(y_true,y_pred,labels=labels)

肝心のConfusion Matrixは、なんと1行で実装できてしまったw

 

それ以外の部分は、sklearn.metrics.confusion_matrixの入力調整と、出力されたConfusion Matrixを表示・保存を行っているだけです。

 

sklearn.metrics.confusion_matrixへの入力

40~53行目に対応

 

sklearn.metrics.confusion_matrixのリファレンスを見るとどうやら、入力であるy_trueとy_predは「サンプル数と同じ長さを持つラベルの入った配列」らしい。

 

そこで今回は、ディレクトリを掘りながら、画像1枚1枚をテストし、出力ラベルをy_predに格納する方法で入力を作成した。

Confusion Matrixの表示と保存

5~38行目および71~77行目に対応

 

 これに関しては公式のサンプルを流用した。

Confusion matrix — scikit-learn 0.19.1 documentation

 

感想

比較的、再利用性の高いスクリプトがかけた(気がする)。

今後はたくさんデータをとり、それを学習モデルにかけて、生成されたConfusion Matrixを見ながら映像コンテンツ推薦アルゴリズムを開発するための知見を集めていきます。

 

あと関係ないけど、ブログにスクリプトを張るのが想像以上に面倒くさかったです。

まだまだ見た目が悪い…

以下、参考にしました。

mae.chab.in

Raspberry PIで作るIoTパズルゲーム「借り物クロスワードパズル」

f:id:shubarie:20180210183030j:plain

 はじめに

2017年11月、岐阜県で行われた親子向けの理科系イベント「ぎふサイエンスフェスティバル2017」の1ブースに「ひらめきパズル教室~借り物クロスワードパズル~」というテーマで出展させていただきました。

 

「借り物クロスワードパズル」は上の映像のように、現実世界の物体を撮影することで空きマスを埋めていく形式のクロスワードパズルゲームで、キーとなる物体を探すために実際に体を動かして物を見て、人とコミュニケーションをとることと、現実世界とインターネットのつながりを感じてもらうことの2つを目的として作りました。

 

僕ともう一人(非プログラマー)でグループを作り、プログラミングは僕が、それ以外の資材調達や外装作成、クロスワードの問題作成と資料作成をもう一人にやってもらうという体制で、1カ月程かけてのんびりと完成させました。

 

企画段階では「パズルとIoTを絡めて何か作ってほしい」と、やんわりしたテーマが与えられたので、その範疇で子供に興味を持って遊んでもらえるものは何だろうと考えました。

 

パズルの種類をリストアップして、インターネットを使えばそれぞれのパズルがどう面白くなるか…考えた末に出した結論が「クロスワードパズル x 一般物体認識API」でした。

 

つぎはハードウェアの選定。

 

持ち運びできてインターネットに繋がり、複数台揃えてもコストが低く抑えられる、、、となると槍玉にあがるのはやはりRaspberry piです。

 

今回もこの例にもれずRaspberry Pi 3 Model BRaspberry Pi Camera Module V2を使うこととしました。

処理フロー

 

まずはざっくりした処理のフローチャートを図示します。

f:id:shubarie:20180210191904p:plain

借り物クロスワードパズル フローチャート

要は、キーに対応した物体をカメラで撮影したら、画像がAPIに投げられて、API上で一般物体認識がなされ、意図したレスポンスがAPIから却ってきたら空きマスが埋まっていくということです。

 

なお、タッチ対応の3.5インチLCDを使ったので、フローチャートの「タッチ」という記述は内部的には「クリック」で判別しています。

 

スクリプトはこちらで公開しています

github.com

 

核となるAPIには「Google Cloud Vision API」を使いました。これに関しては、前々から触ってみたかったので良い機会でした。

 

「借り物クロスワードパズル」のガワは、いつものようにPyQt5で作ったGUIアプリケーションです。こうやって見ると自分、何でもかんでもPythonで作ってますね…笑 あんまし良くないな。スキルが先立ったモノづくりじゃなくて、プロジェクトに合ったスキルを身に着けていくクセを付けないといつまでたっても成長しないよな…

 

とはいいつつも、問題なく要件を満たす動作をしてくれるのがPythonの偉いトコロです笑

 

話を戻します。

 

スクリプト内部では、クロスワードパズルの空きマスの部分をそれぞれPyQtのプッシュボタンとして、クリックされた場合に問題が表示されるようになっています。

 

問題が解けたら撮影ボタン(これもプッシュボタン)をクリックします。するとダイアログが立ち上がり、カメラモジュールからの入力画像をプレビューするようになっています。

 

クリック検出で画像を書き出し、書き出した画像をそのまま「Google Cloud Vision API」に送信します。

 

Google Cloud Vision API」のlabel_detectionからは写っていると予想された物体の「単語リスト」が却ってきます。この「単語リスト」と、あらかじめ設定しておいた「回答リスト」を参照し、1か所以上一致した場合は対応した空きマスが「回答」で埋まります。

 

ちょっとわかりにくい気がしたので、以下に例を示します。

問題:"雨の日は長くなって、2つそろって1つのもの"

想定するレスポンス: ["footwear","shoe","sneakers","boot","outdoor shoe"]

実際のレスポンス:["asphalt","shoe","pattern","joiont","sneakers"]

表示される単語:クツ

 

感想

かなり力技で一般物体認識とクロスワードパズルを絡めた感がありましたが、子供たちは熱心に遊んでくれました。

f:id:shubarie:20180210183021p:plain

「借り物クロスワードパズル」で遊ぶ男の子たちとそれを見守る我々

f:id:shubarie:20180210183208j:plain

エキ(液)を撮影する女の子

今回の製作で難しかった点として、APIから却ってくる単語群だけでクロスワードパズルを作成すること、Raspberry PI Camera Moduleから画像を得てプレビューすること の2点があげられます。

 

1点目は地道にAPIをテストし、使えそうな単語をリストアップすることで(気合で)解決しました。

 

2点目はLinuxにおいてカメラデバイスにアクセスするためのVideo for Linux 2 (V4L2)という技術を見つけてそれを使うことで解決しました。ただし、実装まで紆余曲折を経てクタクタになったので、次からはUSB接続のWebカメラで撮影することにしようと決意しました笑

 

実はもう1点、タッチ対応LCDのセットアップも手間取ったのですが、そちらは以前に記事を書きました。

adliblog.hatenablog.com

 

知見

・子供が楽しそうに遊ぶ姿はモノづくりの醍醐味かもしれない

GUI実装はユーザ層に合ったわかりやすいものを作る必要がある

Raspberry PI Camera Moduleは(俺にとっては)クソだった

【インターンシップ体験談】岐阜県情報技術研究所に行ってきました

f:id:shubarie:20180210034128p:plain

この文章および図表、写真等については、実習先より掲載許可を受けております

はじめに

 2017年8月、僕は「岐阜県情報技術研究所」というところに1か月間インターンシップに行ってきました。

f:id:shubarie:20180210035353j:plain

岐阜県情報技術研究所の外観

岐阜県情報技術研究所は、岐阜県商工労働部に属する公設試験研究機関で、研究開発と技術支援を主要業務としています。また、情報システム研究部とメカトロ研究部の2つの部署があり、合計で14人が所属していました。

 

インターンシップの内容

今回のインターンシップでは、情報システム研究部で「運動器機能のリハビリ支援を目的とした安価な身体動揺解析技術」というテーマの研究開発に参加させていただきました。

 

具体的にこの研究は、リハビリテーションの経過観察等に資する情報をPT(理学療法士)等に提供する目的で、身体の動揺をWii Board(WB)を利用して定量化するための、床反力計測・解析システムを開発するものでした。このうち、僕が参加した業務は以下の3つでした。


・データ収集の補助
・データ分類アプリケーションの開発
・アプリケーションを用いたデータの分類

 

データ収集の補助

この研究では県内の健康増進施設やイベントに出向いてデータの収集を行っていて、インターン中に行われた4回の出張すべてに同伴させていただきました。

f:id:shubarie:20180210041801j:plain

データ収集の様子

データは、WBに配置された4箇所のフォースセンサ情報をBluetooth経由で取得しており、そのデータから足圧中心の位置や床反力の時間変化を求め医学的な知見を得ているようです。

 

お年寄りやインストラクターの方々と話すのは楽しかったです。いろんな人がいました。

 

おばあさん「私は朝4時に起きて毎回こうやって1時間くらい体操やるのよ ほらお腹触ってみてよ カッチカチやろ?」

おじさん「ちょっと 片足で立てんから つかまらしてや」

おばさん「お兄さんかっこいいねぇ 22歳か??」

 

この研究を主でやっている研究者の方に聞くと、地道にデータを集めるこの作業を数年間続けているらしく、こういう作業が結果につながるんだろうなと感心しました。

 

生きたデータって貴重なんだなあ…

 

データ分類アプリケーションの開発

先述のデータ収集作業で繰り返し蓄積されたデータ群を機械学習に利用するためにはラベル付けが重要になります。

 

ラベル付けをやってくれないか?と言われたのですが、このラベル付け作業というのは至極めんどくさいものです。

 

それならばラベル付けを効率化するGUIアプリを作っても良いですか?と相談したところ、快くOKしてもらえたので、これに取り組むことになりました。

 

とはいうものの、僕はGUIアプリを作った経験はありませんでした。そこで、最も慣れ親しんでいるPythonGUI開発できないかな、と調べるとどうやらPyQtなるものがあるようで、今回はそれを使うことにしました。

PyQtは、クロスプラットフォームGUIツールキットであるQtのPythonバインディングにして、PythonGUIプログラミングをするときの選択肢の一つである。

実装のためにいろいろ調べて分かったのですが、

①QtDesignerというソフトウェアでGUIのガワ(.uiファイル)を作る

②変換スクリプトで.uiファイルをPythohモジュールに変換

③実行スクリプトからモジュールを呼び出してGUIインスタンスを生成

という流れでGUIアプリは実現できるようです。

 

簡単なサンプルから少しずつグレードアップしていき、最終的に完成したのが冒頭にも表示したこちらです。

f:id:shubarie:20180210034128p:plain

最終版GUIアプリ

具体的にこのアプリでは、左の被験者のデータと右のサンプルを見比べながらラジオボタンでラベル付けをし、保存ボタンでCSVファイルに書き出すという処理を行うことができます。また、被験者移動ボタンで次/前の被験者データに表示を切り替えることができます。

 

その他、左上のメニューボタンでダイアログも起動します。

f:id:shubarie:20180210044445p:plain

ラジオボタンの表示/非表示を切り替えるダイアログ

f:id:shubarie:20180210044449p:plain

データのあるディレクトリを切り替えるダイアログ

 

内部的な処理は以下の通りです。

①被験者データ(複数のCSVファイル)をpandasで読み込む

②matplotlib+seabornでデータをグラフ化しpng形式で保存

③被験者データ画像とサンプル画像をPyQt5で読み込んで表示

④保存ボタンが押された時のラジオボタンの位置に応じてラベルリストを作成

⑤ラベルリストをpandasでCSVファイルに書き出し

 

画像を読み込んでGUI上に表示するのが地味に難しく、実装までに数日かかってしまいました…笑

 

結構面倒なことやってます。ざっくりとまとめると

①pixmap=PyQt5.QtGui.QPixmap(filepath)

②item = PyQt5.QtWidgets.QGraphicsPixmapItem(pixmap)

③scene=PyQt5.QtWidgets.QGraphicsScene()

 scene.addItem(Item)

④imageviewer=PyQt5.QtWidgets.QGraphicsView()

 imageviewer.setScene(scene)

という感じ。以下のサイトが参考になりました。

melpystudio.blog82.fc2.com

 

まぁやりたいことはできるアプリが完成したし、何度かアプリを使ってもらって不満な点も洗い出してもらった上で、それを改善することができたので満足はしています。

 

初めてにしては上出来でしょう…笑

アプリケーションを用いたデータの分類

実際のデータを自分で作ったGUIアプリでラベル付けしました。基準に基づいてラベル付けを行ったのですが、微妙なラインのデータもあり、ラベル付けの難しさを感じました。

 

ラベル付けの作業自体はアプリのおかげで大分ラクに行うことができました。

 

感想

企業でのインターンではなく、官公庁でのインターンだったのでかなり独特な経験ができたと思います。

 

よく言えばゆったりとした。悪く言えば刺激が少ない環境のように見え、合う合わないは人を選ぶと思いますが、働いていらっしゃる方々は皆話しやすい方たちで、自分の研究の相談にも乗っていただいたりとたくさんお世話になりました。

 

あと、みんな6時には帰宅していてホワイトに感じたのも印象的だったなぁ。笑

 

技術面では、GUIアプリに初挑戦してスキルアップできたことと、実地でのデータ収集を体験できたことが今回の収穫です。

 

このころは自分が何を成したいか定まっておらず、ふわふわしていたのですが、このインターンを経ていくつかの職業観?的なものが定まりました。

 

・一般の人に役立つ製品やサービスに関わりたい

機械学習やIoTなど新しい分野のスキルを学び、駆使して生活を豊かにできるような製品・サービスを創るエンジニアになりたい。

 

・新しいことに果敢に挑戦するような企業で働きたい

既存の事業だけではなく、先端技術を恐れずに、効果的な形で取り込んで変容していくような、リスクを恐れない企業で働きたい。

 

・個人だけでなくチームでプロジェクトに挑みたい

個人だと出せるアイデアや技術に限りがあることが分かった。人とかかわりながら仕事をすることで分かることも多いと感じた。

 

・個人としても成長できる企業で働きたい

常に新しい風が入ってくるような、そんな場所に身を置きたい。また、それらに敏感に反応できるエンジニアでありたい。

世の中アウトプットが大事らしい。ソースコードを公開しました

f:id:shubarie:20180208105931p:plain

自分語り多めです←

 はじめに

ここ1年間で機械学習、データサイエンス、IoT、ロボティックス等の分野にかかわっている時、自分が一番ワクワクしていることに気づいたことと、大学院で研究するよりも企業で人とかかわりながら生きた技術を学び、使いたいと感じたので、就職という決断をするに至りました。

 

就職の思いが固まってからは、じぶんのやりたいことができそうな企業をリストアップして調査していたのですが、2月ともなればエントリーが解禁されている企業がほとんどです。

 

昨日、期末試験も終わったので、そろそろエントリーを始めることにしました。

 

今まで自分は作品を作り、ローカルで誰かにプレゼンテーションすることはあっても、オンラインでソースコードを公開したことはありませんでした。

 

ところが、エンジニア職でエントリーする際は、新卒といえど何かしらのアウトプットが求められるようです。

 

というわけで今回は今まで作ったソースコードをかの有名なGithubにアップロードしました、という報告です。

 

公開したもの

Anaconda3環境ではコマンド一つでgitをインストールすることができました。

conda install git

 

以下にGithubリポジトリへのリンクと、当ブログの記事をセットで羅列します。

 

CNNを用いた表情認識技術とそれを用いた映像コンテンツ推薦アルゴリズムの開発

学校(高専)で3年間行う研究テーマです。Kerasディープラーニングを使った表情認識モデルを実装して、それを活用して映像コンテンツの推薦アルゴリズムを開発します。

来夏の学会発表に向けて現在進行形でアップグレード中…。

リポジトリ

github.com

記事

adliblog.hatenablog.com

 

借り物クロスワード(GUIアプリ)の開発

数百以上の親子が参加するイベント「ぎふサイエンスフェスティバル2017」で発表したRaspberryPi3上で動作するGUIアプリケーションです。

リポジトリ

github.com

記事

adliblog.hatenablog.com

 

身体動揺データの表示とラベル付けアプリ(GUIアプリ)の開発

2018年夏に参加した「岐阜県情報技術研究所」の1か月インターンシップのなかで作ったアプリケーションです。現在も所内で使っていただけてるそうです。

リポジトリ

業務の範疇で作成しており掲載許可は得ていません

記事

adliblog.hatenablog.com

 

感想

Githubすげぇ…めっちゃ簡単にアップロードしたり同期したり複製したりできるやん…

なぜ今まで使わなかったんだろうという感じ。知ろうとしないことが一番の損失ですね…。

 

今まではGithubの存在はもちろん知っていましたが、なんとなく敷居の高さを感じていてちゃんと調べようともせず、DropBoxとかOneDriveとかUSBフラッシュメモリとかでソースコードを共有したり、リモートデスクトップで作業したりしていましたが、すべてが過去のものになりました…笑

 

ただ、簡単がゆえに大事な情報が載ったソースコードやデータをアップロードしてしまわないように気を付けようと思いました。

 

参考文献

超わかりやすかったです↓

qiita.com

 

もうちょっと詳しく書いてある。豊富なリンクをきれいにまとめてあって分かりやすかった↓

qiita.com

 

身の毛もよだつGithubの失敗談↓

qiita.com