google colabにdarknetを使用した画像処理サーバーを建てる方法

導入

google colab 偉大です。
ブラウザでpythonの実行ができて、共有リンクが発行できて、主要な機械学習系のライブラリが一式インストールされているだけでなくgooglegpuリソースで計算することもできます。 しかしせっかく画像認識ができても認識用の画像を上げるにはボタンを押してエクスプローラから選択する方法ではスクリプトから実行することはできないし、google drivedropboxから読み出す方法ではファイルアクセスの時間がかさばります。 そこでhttp requestで画像を受信してdarknetを実行した結果を返してくれるipynbとscriptを書きました。

構成・実行方法

以下のリポジトリのdark.ipynbをgoogle colabで読み込んですべてのセルを実行してください。 app.pyがserver sideで実行されているpython のscriptで client.pyがclient sideでのサンプルのpython scriptです。 github.com

http serverはflask,portのトンネリングにngrokを使っています

.
+ - dark.ipynb 
                #load this notebook from ipynb and execute all cells
+ - app.py 
                # flask server script
+- *.cfg
+- *.weights
+- data/
        +- *.jpg
+- client.py
                # sample script for client side
+ ....

パフォーマンス

あとで書く

結論

結局サーバーにアクセスする時間があまりに長くて使い物にならなかった印象。やはりローカルの環境を使うべきなのであろうか。jetson tx2が欲しい。 今後はipynbを介さずローカルでdarknetを使おうかなと思っていますがpull request,issue,fork来たらうれしいのでどんどん対応すると思います。ちなみにこういった使い方にgoogleは24時間ごとにインスタンスの初期化をして対応しているみたいです。
google colab 偉大です。

関連リンク

pypi.org

medium.com

medium.com

学校の文化祭で新しく部門ができたのでコードを書いた

学校の文化祭で新しく演出部門というのができてミクライブをやっていたりしたのですが、 その部門の活動の一環で学校のサーバーとドメインを借りて情報系の土台が整えられていたのでいろいろコードを書きました。 この記事はその後ゆるはち.itというイベントで発表した資料をブログ用に改変したものです。

  • 概観
  • 実装したもの
  • 設計
  • 当初の設計
  • 反省
  • 来年やりたいこと

概観

100%

裏側で模擬店の店員がスラックを通して、画像やテキストを登録できるようになっています。データを内部でjsonとして管理したうえでhomepageとline botから高専に来たお客さんが情報を見れるようになっています。 よりリアルタイムに近い感覚で情報を送ったり、こちらからのフィードバックができるようにするためにslackをcmsとして使いました。文化祭中も実際の模擬店の画像を受け取ったり、値上げ、販売終了のお知らせなどを更新することができました。

実装したもの

homepage

模擬店情報・地図・ギャラリーなど

https://kunugida2018.tokyo-ct.ac.jp/

トップページ

100%


linebot

ぎりぎりになってクラスの友達を巻き込んで実装した。 友達のブログのほうが詳しく経緯とか書いてあるので引用しておきます。

taitti.hateblo.jp

slack bot

設計

60%

ホームページはnodejsで作られたhexoというstatic site generaterを使用して静的なファイルを生成してnginxを通してアクセスできるように配置しました。ユーザーからのいいねをカウントするなどのリクエストを受けるためにexpress serverがたっています。

当初の設計


変わったこと

  • 管理システムを作った 模擬店からの画像を受け取った時にチェックするためにslackとdropboxで管理するためのシステムを作りました。 流れとしては模擬店ごとのslackのグループに画像が投稿されたときに管理者用のチャンネルに転送されるようになっていて、それに対してチャンネルに属する人がコメントを送信すると公開するなり、非公開することができるようにしました。また定期的にdropboxにバックアップを取ることで実際にサーバーに載っているものを確認できるようにしました。

  • homepageのframework
    keystone.js -> ghost -> hexo ホームページのフレームワーク選びはかなり紆余曲折しました。ghostはuiがきれいでかなり好みだったのですが、自由度が低かったために最終的にカスタマイズ、管理、運用がしやすいhexoを採用しました。

反省

  • 運営、お客さんからの情報を集めきれなかった。 現在、体育館のイベントのスケジュールが体育館の予約状況でしかわからなく、実際の展示が始まる時間がわからないという問題があるみたいです。この問題を把握するのがぎりぎりになったので対応することができなかったのですが、slack botの特性を生かすチャンスだと感じたので来年は何とか対応させたいです。

  • 優先度をつける。
    落ち着いてから振り返ってみると、裏側のサーバーの構成や、log管理なのでの仕組みを充実うさせるのに時間をかけすぎてしまった感じがします。 自分が好きな分野は無限に改善点が見つかり、無限に時間が食われることに気が付いたので、定期的に自分の時間の使い方を振り返っていく必要を感じました。

  • 一定のスパンで集まって振り返り、目標設定をする 進捗が悪くなると全員で集まるみたいなことがしたくなってきます。人月の神話の「悪い知らせを伝えるのが好きな人いなどいない」みたいな言葉の意味が今になってわかりました。問題を後回しにしないために嫌でも定期的に集まってイシューの管理をする必要性を感じました。

commitment

結局いろいろ挫折したり試行錯誤したのでコミット数が1000に達してしまいました。contributorsも今までで一番多く、それぞれの得意分野ごとに仕事を分担することができてよかったです。

(https://github.com/teamet/2018.perform)

来年やりたいこと

コンテンツを増やす

  • twitterのhashtagで画像を収集、wordcloudで表示できるようにしてみる ツイッターハッシュタグで検索してよくあらわれる単語を集めると面白いものが見れそうな気がする

  • beaconとgoogle 360° mediaをつかったスタンプラリー これはもともとやりたかったけど、位置情報の管理をする仕組みがなくて挫折しました。せっかくline botがうまく動きそうなので来年はline beaconとgoogle 360° mediaを組み合わせてスタンプラリーみたいなのを作ってみたいです。

ビルディットにインターンしてきた ( 2018夏期 )

はじめに

5月中盤から8月の中盤までにかけてビルディットインターンとしてコードを書いていました。 もともとは友達にインターンできるところがあると聞き、ホームページを見て行くことに決めました。
BuildItは京王八王子駅から徒歩五分程度で主にweb系の開発をしている会社です。 インターンの課題としてtwitterのいいねをしたリストを分析することで、ユーザーの興味のあるツイートを分析するサービスを製作しました。

f:id:sakakendo0321:20180903000934p:plain なんかうまい具合にかっこよくなってしまったraspberry pi側のui画面。フォント、写真のソースことなどについて教えてもらい、色の組み合わせとかを相談した。

f:id:sakakendo0321:20180902235736p:plain

念願のフルカラーledを買ってもらって試しに光らせているところ

実際に作成したアプリケーション
友達の書いたブログの記録

設計

自分はweb系の分野に対しての興味がありながらフロントのhtmlやcssの仕事内容、考え方についての理解が浅いという問題意識があり、このインターンを通じて、web系の分野を俯瞰できるような知識を身に着けたいという気持ちがあったので、今回の製作ではバックエンド、フロントエンドの多岐にわたるプログラムを書きました。 デザインでは少し勝手が違い、タスクとしての切り出し方や、はじめ時、切り上げ時を考えることが難しかったことなどの知見を得られることができました。またworkerとwebでpython,node.jsという違う言語を使いそれぞれの言語の特性の違いを身をもって学びました。開発のフローのこともたくさん教えてもらい、インセプションデッキ、kptを使った振り返り、gitを使ったworkflowや、dockerを使った環境の統一などを実際に行いました。

反省点

  • 設計段階
    設計の段階で、決定事項に具体的なライブラリなどを組み込んでしまい、実際に着手してみるとうまい具合に動かないことがあったりした。いままで使いたい技術だけを先に決めてしまいどんどん詰んでいくみたいなことがあった。今回設計のサポートをしてもらって、最初は内部の仕様よりも外部から見た動作や、要件に絞って決定すべきということを学んだ。
  • dbの設計
    今回、データベースにはuserというテーブルのみを作成したのですが、実際に実装していく中でどんどん情報が増えてきてしまい、細かいデータはどんどんjsonに入れたり、一度更新するとデータを全部取得してしまうので、今までのが消えてしまうみたいな問題が発生してしまいました。今回はサービスの規模が小さかったのでその場その場の対処で何とかしのいだのですが、これによりあきらめた機能も何個かあったので、次回からはよりデータベースの設計に時間をかけて詳細なことまで考えるべきだなと感じました。
  • raspberry piとnode.jsの相性
    今回ledを使って、ユーザーに通知をするシステムを作成するにあたり、raspberry piでpigpioを使ったプログラムを製作しました。最初の段階ではとくにpythonでもnode.jsでもライブラリは用意されているので問題は起きないだろうと思っていたのですが、gpioを触るときにはsudo 権限が必要で、そのためにユーザーごとにインストールして使っているnode.jsは少し相性が悪いかなという印象を受けました。

一緒にインターンした友達

一緒にコードを書いていた友達です。うまい具合に分担、消化してくれて本当にありがたかったです。 何回かじぶんのわがままで友達を振り回してしまうようなことはあったのですが、コミュニケーションをとりながら無事にお互いが納得できるものを作ることができてよかったです。
https://github.com/Akari000

雑感

社員さんにはインターン期間中には自分の質問に忙しいなか答えてくださり周辺知識も教えてくださったり、 仕事終わりにご飯に連れてってもらったりとても充実した経験をすることができ、本当によかったです。 また社員さんの面倒見がよく優しかったのですが、質問も痛いところを突かれたりして、自分もこういうことができるようになりたいなという刺激になりました。 今後はアルバイトとして勤務させてもらえることになったので、アルバイトのための勉強もしながら、 より深い知識や広い知識を身に着けていきたいと考えています。

darknetをpythonから叩けるようにしたスクリプトを書いた

darknetが公式referenceではコマンドラインから実行する方法しか記載されていなかったので、pythonから叩けるようにしたスクリプトを書いたのと、それまでにいろいろソースコードを読んだのでそれのまとめ。 このスクリプトを使用すると、動画のストリーミングで物体の検出をして、座標値もpythonの値として扱えるようになります。

いまいち正確に理解していないが、ディレクトリ構成とか探し方とかの話

.
├── cfg
├── data
├── examples
│   ├── detector-scipy-opencv.py # darknet.pyをimportしてfilename,scipy,opencvそれぞれの形式でデータを投げるコードのサンプル
│   ├── detectmp4.py # darknet.pyをimportして処理している、シンプルなサンプル用のファイル
│   └── *.c
├── include
├── python
│   ├── darknet.py    # pythonのプログラムが呼び出してるclassが書かれている
│   └── proverbot.py  
├── scripts
├── src
└── Makefile

構造は以下のリポジトリ

GitHub - sakakendo0321/darknet: Convolutional Neural Networks

以下かいたスクリプト

libdarknet.soが生成されていれば実行できるはず。main.pyDARKNET_DIRにcloneしたgithub repositoryのディレクトリ、VIDEO_NAMEopencv からみれるVideoCaptureのdevice番号で書き換えるか、xxxxx.mp4を対象のmp4ファイルの名前で書き換えると画像だけでなくストリーミング形式で実行できて、検出した画像を72行目のrから取得することができる。

同様のライブラリについて

GitHub - madhawav/YOLO3-4-Py: A Python wrapper on Darknet. Compatible with YOLO V3.

僕がやりたいことほとんどやってた。これを使うのがいいと思う。

所感・今後の予定

LICENSE.fuckというのがあって、この開発者なんかようわからんめちゃすごい人なんやなぁという感じがした。 若気の至りで開発してしまったんだろうか。すごすぎる。 opencv形式で取得したframeをそのままdarknetに渡そうとしたが、ctypesを使ってpythonからc++に変換する時に画像データよりファイル名で渡したほうが単純だと思って、現在は一度ファイルに保存して、ファイル名をc++に渡すようにしている。影響を調査し、改善するかもしれない。 もうすこしpython-c++間のつなぎをYOLO3-4-Py辺りを読みたい

google colaboratoryを学校のレポートで使ってみた話

もともとjupyter notebookでレポートを書くのを試してみたりしていたのだが、エディタソフト用がローカルネットワーク内でしか使えないことに不満を覚えていたときに出会ったのがgoogle colaboratory。 googleのサーバで動いているのでログインするだけで学校のpcからでもスマホからでも常に最新版を見ることができる。 データサイエンティストの層から人気があったのだが、数式、グラフの挿入もきれいだし、markdownを書き込むこともできるのでいろいろなことに使用することができそうだと思った。 重いレポートにいきなり使用して実用に耐えなかったらば徹夜確定しかねないので時間がったときに軽いレポートで実際に使えるか一通り試してみたのが本記事。結果としてはmarkdownでは限界があったのでhtmlを書き込むという裏技っぽいテクニックが必要だったのでそれについて。
めんどくさいので今後colabって略すことがあると思う

実際にやってみたものを公開用に簡略化したもののリンクが以下
レポートのコピー - Google ドライブ
googleにログインすると上部にアプリケーションで開くと表示されるはず

今までに書いたノートまとめ
GitHub - sakakendo0321/notebook

google colaboratoryを使用する理由

word特有の型崩れがない

今まで使っていたword卒業したい理由として、画像を挿入したり、改行コードを入れたりしたときに意図しない場所に入ってしまい収拾がつかないことがあるのがある。またgoogle driveにアップロードしてgoogle documentで閲覧するとwordで編集した状態から崩れていることがある。 その点colabではすべてがコードして管理されており、ブラックボックスになっていないので突然意味不明な沼にはまる心配がないのは大きいと思っている

googleが運用してる

もともとのjupyter notebookでは自分でサーバを建てないといけなかったがcolabではインターネット環境があればどこでも編集できるようになった。またgoogleが運用したことによって、ほかのサービスとの連結が強固になった。例えば共有リンクを渡すことでほかのpcから同時に閲覧、編集することができる。またgoogle drive,githubでの管理もワンクリックでできるのでスマホからの閲覧、編集履歴の閲覧もできる。

tex,python,markdown,htmlで書ける

多数の言語をサポートしているので、綺麗な図表、数式の挿入が簡単になっている。 今までwordでグラフを挿入する場合はexcelを勉強しなければいけなかったが、普段使っている言語を使用することで学習コストを削減できる。また初心者にもわかりやすい言語といわれており、インストールの必要もないのでpython学習用の環境にしてもよいと思う。またtexは書きこむとすぐに更新されるのでかっこの数を間違えた時のリカバリも早く済む。コマンドのtexではpdfに変換して、ビューアを起動してと手間が多いはず。何より環境構築がめんどくさかった。
先頭に!を付けるとbashコマンドの実行ができるので一応cの実行もできる。(ちょっと無理があると思うけど) f:id:sakakendo0321:20180506180804p:plain
pipとかpythonのライブラリインストールのために使うらしい。

!echo '#include"main.c"'>main.c;cat main.c;gcc main.c -o a.out;./a.out
こんな感じのコマンドを投げると、ちゃんと怒ってくれる。  

実際に使ってみてわかったこと、苦労したこと

文字列を右寄せしたいときなどにmarkdownのシフト演算子では微調整ができなかった。また右寄せとアンダーバーを同時にすることができなかった。

markdownでは内部的にhtmlに変換しているので(はず、実際に文献を読んだわけではないが、markdown内でbrやhを入れてもちゃんと仕事してくれているのできっとそういうことなのだと思う) 右寄せは <div class="center"> アンダーバーは<u>を使うことで解決した。これによりmarkdown入れ子問題を解決した。 f:id:sakakendo0321:20180506174026p:plain f:id:sakakendo0321:20180506173510p:plain

印刷する際にheader,footerのリンク、ページ数、日付等が意図しないところに出る。

pdfに印刷するときに詳細設定のoptionからheader,footerのチェックを外すと表示が消える。

改ページの位置が意図していない

brをtext cellに大量に入れることで改行の位置を無理やり変えた。

matplotlibのラベルの設定とかで苦労した

特に裏技とかではなく、ただの知識不足。 以下のサイトが参考になった。 python-remrin.hatenadiary.jp 表示する軸の値 : plt.xticks([-2*np.pi,-1*np.pi,0,np.pi,6.28],['-2π','-π','0','π','2π'])
表示する範囲 : plt.xlim([-2*np.pi,2*np.pi])
ラベルの文字列 : plt.xlabel("t[s]")
出力する図のサイズ : plt.figure( figsize=(15,6)) とかってのを使った。大体これできれいになると思う。

pandasの表の表示ができない

jupyter notebookの記事ではできると書いてあったがcolabではできなかった。これに関しては外部エディタを使って画像を挿入するか、markdownかtextで何とかするしかないように思われる。

参考文献

markdown,texでお世話になった記事

markdownの書き方

日本語版最速!? jupyter notebookをgoogleが神改造 colaboratoryについてまとめてみた。 - Aidemy Tech Blog

texの記法

LaTeXコマンド集

jupyter notebookとgoogle colaboratoryの関係について

日本語版最速!? jupyter notebookをgoogleが神改造 colaboratoryについてまとめてみた。 - Aidemy Tech Blog

Bash On Windows 標準設定

Bash On Windowsのデフォルトの設定で困っている人が多かったのでちょっとでも足しになれば(と思ったのだが、もう使う機会はなかったのかな..)

plugin入れずにオプションでできる範囲で。

以下のvimrcという設定ファイルをbash on windowsのhome ディレクトリに保存すると設定が適用される

swapファイルについて

WindowsでVimが勝手に作成する4つのファイルを作成されないようにするには。 - システムオペレータの週末

gistdf5877a53ef45a9a85e1a92f85c97def

linux from scratchをやってみたい。

  • 前書き linux上でどのようなソフトウェアがそれぞれ何をしていて、どのような関係で動いているのか知りたいのでlinux from scratchをやりたい。 shell,c compilerがどのように呼ばれているのか知りたい。 友達に書けと言われたので書いているけれど、lfs-bookに全部書かれているはずだかほとんど書くことがない….

  • 参考資料

lfs-book (html,pdf)

http://www.linuxfromscratch.org/lfs/downloads/stable/LFS-BOOK-8.0-NOCHUNKS.html

http://www.linuxfromscratch.org/lfs/downloads/stable/LFS-BOOK-8.0.pdf