ごはんと飲み物は紙一重

Pythonを中心とした、データ分析や機械学習・深層学習関連の記事を書いてます。あとは気まぐれで書く日記や大学のことなどなど・・・

たいふう 24 ごう が あらわれた !

たいふう 24 ごう の チャーミー が しょうぶ を しかけてきた !

というわけで、昨日から今日の朝方にかけて襲った大型の台風24号ことチャーミーさんが来沖されたので、その参加レポートを記載していこうかと思います。

さきにまとめから

台風のとき役に立ったやーつ

  • カセットコンロ (おゆわかせる!カップ麺食える)
  • 湯船に水を張る (断水するとトイレ使えなくなるので、小の場合ながしたりするよう。あと手洗ったり。)
  • モバイルバッテリー (スマホ系統の充電やusb機器の電源として。今回はライトとして活躍)
  • 耳栓 (台風の音は意外に大きいので耳栓あると環境よくなくてもそれなりに寝られる。睡眠大事。)
  • 紙コップや割り箸 (断水する(ry。とくに洗い物が必要なくなるので結構便利)

この辺は本土の人も準備していると家に引きこもるにあたって割と良いかと。

今回の規模

ryukyushimpo.jp

よく沖縄では台風の規模を「ユニオン」という地元の24時間スーパーで例えることが多く、ユニオンが開いていれば基本的に規模は大きくなく台風でも遊びに行ったりそのまま出勤したりなんてこともあるくらい信憑性が高い存在となっています。今回の台風は、

ユニオンが一時閉店するレベル

あたかもネタかのように書かれている内容ですが、わりと正しくて県民すら家に引きこもるレベルでやばい規模でした。

台風来沖の朝

だいたいこのへんはお昼入る前なので、一部地域では起きたら停電しているなんてこともあるくらいです。午前中の段階でちらほらとtwitterには被害報告が流れてくる感じです。

大学ではすでに車が風で流されていたり、大きな木が折れていたりと結構散々な状況でした。

そんな私はというと

まだ停電していなかったので、各種バッテリーやスマホなどを充電しながらkaggleしてました。kaggle楽しいゾイ。

午後

ちょうど13時前後から台風の目に入り、静かな時間が2時間ほど続きました。

目に入っている間は風がほとんど吹かず、この間にコンビニやあいているスーパーに色んな人が駆け込んでいるという話をtwitterで目にしていました。そんな危ないことせず事前に準備するべきでは(ry

そして17時。

ついに我が家も停電。ネットがスマホからしか使えないので仕方なくkaggleは断念。静かに過ごすことに。台風なので窓を締め切ってしまうこともあり部屋はわりと扱ったです。USB扇風機とかうちわとかあると幾分かは快適になるかなと。

看板すら倒れてしまったようです。恐ろし屋。この時点で停電は20万戸以上にも登るらしく、これは沖縄県の3分の1の家(世帯)が停電していることになるようです。やばい。中には断水している家庭もあり、この記事を書いてる現在も復旧していない地域があるとか。

ひとまず停電するとどうしようもないので寝ました。

次の日の朝

朝9時過ぎぐらいには暴風域を抜けてひとまず台風の大きな被害が収まってきた感じです。しかし電気などのインフラ系統はこれから復旧し始める感じになるのでそれまでの辛抱。

ちなみにそんな沖縄では

ほんと怖いったらありゃしない。気持ちはわかるのですが、信号が停電してるのに運転するとかどこの絶体絶命都市ですかね。どう考えても交差点とか我先にって感じで走るから余計危ないのよ。とはいえおそらく実家が停電&断水しているところは復旧しているおばあちゃんちなどに行ったりしているようで、そういう理由ならまぁわかるわなって思います。県は一定の復旧ができるまで通行禁止とか連絡するべきだと思うんだ。安全を考慮して。この辺難しいと思った。

どんぐらいやばいかっていうと

主要道路や高速道が通行禁止にするくらいです。そこまで出てるなら(ry

次の日の夕方

停電から約24時間ごろに電気が復旧しました。わーい。ほんと沖縄電力の方に感謝ですね。

台風来沖から約36時間ぐらいの出来事ですが、それまでの間に色々と準備していたからこそ余裕を持った自宅避難生活ができたのではないかと思います。さらにいうと私の家は海抜が高いため、被害が小さいですが、海抜が低いところ(沖縄市泡瀬など)だと浸水していたり2次被害が発生していて、この場合本格的に避難も必要になるのかなと思うレベルでした。

改めてまとめ

ユニオンが閉まるくらいの台風が来たら他人事だと思わず 事前に災害に備えた準備 をしような。お兄さんとの約束だ。

PyConJP 2018に参加してきたお話

気づけば1ヶ月ぶりの更新

言い訳させてください。9月は絶賛東京出張で沖縄にいるよりも東京にいる時間のほうが長いという問題が。というわけで朝から晩まで働いていたので気づけば「飯・風呂・寝る」の3コンボをキメてました。というわけで今日はこちらに参加しながら記事をまとめています。

retty.connpass.com

先日のPyConJPで野球セッションの引退を表明(?)した「やきうの人」こと中川さんによる主催のもくもく会です。今日中にかきあげていく&並列してみられなかったセッションを見ていく のを目標に書いていこうかと。

会場へ

今回のPyConは900名を超える参加登録者がいたということで、もはやコミケですかねと思わせるくらい多かったです。特に1日目は受付に列ができるほどで改めてPyCon参加者の規模を感じさせてくれましたね。東京は天気が不安定でしたが1日目の朝は晴れていたので良かったなって感じでした。

今回のPyCon盛りだくさんすぎ問題

Keynote以外は完全に同時並行で進行しており、一部の会場は立ち見不可ということから急遽サテライト会場が生まれるほど。「こんなん(困難)みられるわけないやん」と思ったので、事前に見たいセッションを絞ってはいたのですが、方向転換し「質問したいセッションを見に行く」という方向へ。結局質問したのはどりらんさんのJupyterセッションだけでしたが、まぁセッションの感想などは後ほど。

1日目:Keynoteスピーカー Manuel Kaufmann さん

上記がざっくりとしているのですが、もう少し深ぼっていくと南米を中心にPythonの普及を頑張った方で、様々な苦難や困難を乗り越えながら普及の活動をおこない遂にPSFからも評価されるようになったというようなPythonと人生を絡めた最高にエモエモな内容でした。

2日目: Keynoteスピーカー 磯 蘭水 さん

実はこの日トラブルが合って宿泊先のチェックアウトが2日目に設定されており予約をしくじってしまったので、荷物を移動させたりしてたのでリアルタイムで見れず、youtubeで見る形に・・・

内容としてはとてもおもしろい内容で、個人的には「それでは一曲お聞きください」までの中でものすごくたくさんの技術と知識が詰まっていて、それを通して「Pythonには大体の開発ツールが詰まっているからだからこそやりたいことにチャレンジしてみてほしい」というメッセージがとても素晴らしかったです。

いろいろ聞いたセッション

一つ一つ感想を書くと恐ろしく長くなりそう(怠慢)なので当日見たセッションを羅列すると

  • Jupyterで広がるPythonの可能性
  • Pythonistaの選球眼(せんきゅうがん) - エンジニアリングと野球の目利きになる技術
  • Python研修の作り方-Teaching Is Learning-
  • オンザフライ高速化パッケージの比較:Numba, TensorFlow, Dask, etc
  • 実践・競馬データサイエンス
  • 料理写真が美味しく撮れる! 開発現場から覗くAI料理カメラの裏側

な感じです。他にも見たりしたのですが、この辺が興味あって覗いたところになります。それ以外の時間はブースを眺めたりしてました。Jupyteのセッションでは個別で質問することができたりできて個人的には収穫が非常に大きかったです。

各セッションの詳細などは動画を直接見ていただけるといいかななんて思ってます。

www.youtube.com

おやつうまうま

おやつが素晴らしかったです。全部pythonな上に味も確かという最高な感じでした。昼ごはんの写真は取り忘れたのですが最高に美味い弁当でした。

ノベルティ良い

今年もいろんなノベルティを頂いたのですが、個人的にとても評価しているのが 株式会社スカラコミュニケーションズ さんのノベルティですね。去年はzen of pythonの入ったマウスパッドだったのですが、今年はzen of pythonの入ったステンレスボトルでした。

去年に引き続き実用的なノベルティを配っているので個人的にはそれを楽しみにしていたりしています(笑)

ポスター

今年は様々な場所でPythonのイベントが開催されていてそのレポートが多かったように感じます。pyladiesやpython札幌、来月開催のpycon mini 広島、pycon kyushuなど全国各地で開催されているのがよくわかりました。特に今回のPyConの「ひろがるPython」にちなんでいて良さ味が深い(語彙力)

2日間のイベントを終え

ここまでずらずらとかきあげて思ったのは「不完全燃焼」な感じでした(←!?)

というのも今年は CfP or LT を出す予定だったのですが、研究との兼ね合いで断念していました。しかし蓋を開けてみると実はできたんじゃないかということや、「PyConをすべて受動的に参加してしまうのはもったいないな」 という考えが浮かんだのが思った経緯です。

もっと周りの実力に追いつきたい。自分の足りない技術力や知識を深めていきたい。それを発表してフィードバックを得たい。そう思った今年のPyConJPでした。

来年は県内で就職するのでPyCon Kyushu in OkinawaやPyConJP 2019に向けて力をためて挑戦していこうかなと思います。非常に考えさせられ刺激を受けられたPyConJPでした。運営のみなさま本当にお疲れ様でした&ありがとうございました。

PyData.Okinawa #36 で講師してきました!【OpenCV】

念願の

エモい話になるのですが、私がPyData.Okinawaに参加したのが#16回でその時がちょうど深層学習の回で

pydataokinawa.connpass.com

密の濃い内容と、見やすいノートが印象的なもので、いつかはそんなPyDataコミュニティで講師をしてみたいと思ってから早二年。

ついに私自身が講師をするときがやってきました。ここまで2年ですね。

pydataokinawa.connpass.com

学生のうちにPyData.Okinawaのオーガナイザーになること講師を務めることの2つを達成できて感無量でございます。

ほんへ

github.com

OpenCVを使って様々な関数を触ってみようという内容でもりもりに盛り込んだ90分にしました。

よかったらノートを覗いていただいて、手元で実行していただけるといくつか応用できそうな関数を知っていただけるかと。

講師を終えて

PyDataの講師ってすごいと思いました。特に現在の体制になる前は1人で資料作成からイベント開催をやっていただいていて、なおかつ恐ろしいクオリティで準備していたわけですからまだまだ技量不足なところを感じました。今後もオーガナイザーとして自分自身の技術力も向上させながら講師を再度やることができたらなと思います。

pythonで外部サーバからデータを読み込んで変数に格納する【python・pandas・paramiko】

研究室の少ないリソースを活用していきたい気持ち

いつもJetsonのお供として使用している3TBの外部ストレージを他の研究生も使いたいとのことだったので貸し出すことに。そんでせっかくなら別のJetsonにつないでいる外部ストレージをネットワーク経由で読み出しできないかと思って試してみました。3TB一人で使うにはもったいねぇ(貧乏性)

んでやっていきたいことは、Jetsonで立ち上げたJupyterからもう一つの研究生Jetsonにアクセスし、そこからストレージの中のデータを引っ張ってくるというものです。内容的にはpandasでaws s3にアクセスしてread_csvする内容に近い感じですかね。

f:id:ST_ha1cyon:20180814200838p:plain

コード例

from paramiko import SSHClient, RSAKey, AutoAddPolicy

client = SSHClient() 
client.set_missing_host_key_policy(AutoAddPolicy())
k = RSAKey.from_private_key_file("鍵の場所")
client.connect(hostname = "address", username='hoge', pkey=k)

paramikoをimportしてそこからsshclientを呼び出しています。そこでアクセスしたいアドレスに鍵を使ってアクセスするという形。ちなみに鍵を使ってなくても、 client.connect のオプションにはpasswordもあるので一応どうにかなる。

そこから、今回の場合のように読み出す場合は、

sftp = client.open_sftp()

with sftp.open(df_path, "r") as f:
    df = pd.read_csv(f, encoding="utf-8")

な感じでsftpを使用してアクセスしてデータを引っ張ってきます。上記のコードは別にpandasでなくてもやりたいことに合わせてやれば基本的には問題ないかと。

Jupyter上で毎度叩くのが面倒ならば

モジュール化してしまってimportすることで予め変数に必要なファイルを入れてしまうというのも手かと。そうすると、Jupyter上ではモジュールをimportするだけでよいので手間が省けるかなと。

まとめ

paramiko使っていけば自作PCをサーバにしてあんなことこんなことできちゃうよ。

(素直にAWSGCP使えっていうのはあるけど)

追記(2018/08/14)

簡単にモジュール化してみました。これでデータフレームを複数読み込みたい場合もばっちし。最小限しかできてないけど。

Jupyter で sudoコマンドを使ったシェル文を書くときは

知らなかった

Jupyter数年使ってるはずなのに知らなかったというあれです。

echo password | sudo -S command

で行ける模様。もはやJupyterではなくシェルのお話でした。

opencv × multiprocessing がどうもうまくいかない【cv2.cvtColor】

画像処理を並列に動かしたい

研究関連ですね。

動画を読み込んで画像処理やパラメータ取得やらいろいろやって結果を取得するとなったとき、 while (cap.isOpened) しているわけです。このwhile回してる間の処理をできるなら並列にやっていきたいって感じです。

n_frame = 30
a1, a2 = [], []
output_path = "/path/to/img_output_path"

cap = cv2.VideoCapture("/path/to/video")
frame_all = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
frame_idx = [_ for _ in range(frame_all) if _%n_frame == 0]


for idx in tqdm(frame_idx):    
    cap.set(cv2.CAP_PROP_POS_FRAMES, idx)
    _, frame = cap.read()

    img = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    cv2.rectangle(img, (0, 0), (600, 100), (0, 0, 0), -1)

    keypoints, output_image = openpose.forward(img, True)

    a1.append(keypoints[0][[keypoints_dict[i] for i in get_parts_list]].ravel())
    a2.append(keypoints[1][[keypoints_dict[i] for i in get_parts_list]].ravel())

    cv2.imwrite(os.path.join(output_path, "img/{0:04d}.png".format(idx)), cv2.cvtColor(output_image, cv2.COLOR_RGB2BGR))

これを必要な箇所だけ関数化して

from multiprocessing import Pool, Manager
import multiprocessing as multi

n_frame = 30
a1, a2 = Manager().dict(), Manager().dict()
output_path = "/path/to/img_output_path"

# 動画のサンプリングフレームのインデックスを取得
cap = cv2.VideoCapture("/path/to/video")
frame_all = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
frame_idx = [_ for _ in range(frame_all) if _%n_frame == 0]

def get_features(idx):
    print("Processing to {}".format(idx))
    cap = cv2.VideoCapture("/path/to/video")
    
    cap.set(cv2.CAP_PROP_POS_FRAMES, idx)
    _, frame = cap.read()

    img = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    cv2.rectangle(img, (0, 0), (600, 100), (0, 0, 0), -1)
    
    keypoints, output_image = openpose.forward(img, True)
    
    if len(keypoints) == 2:
        a1.update({idx:keypoint[0][[keypoints_dict[i] for i in get_parts_list]].ravel()})
        a2.update({idx:keypoint[1][[keypoints_dict[i] for i in get_parts_list]].ravel()})

    cv2.imwrite(os.path.join(output_path, "img/{0:04d}.png".format(counter)), cv2.cvtColor(output_image, cv2.COLOR_RGB2BGR))
    
if __name__ == "__main__":
    with Pool(multi.cpu_count()) as p:
        p.map(get_features, frame_idx[:5], 1)

な感じでアウトプットするのですが、Jupyterだとこれがどうもうまくいかない・・・。と思ってスクリプトに変換してもだめ。

どうやらopencvcv2.cvtColor が並列実行の際にひっかかるらしいです。そんなん言われても、opencvで使う関数の中で1,2を争うくらいよく使う関数なのに君が引っかかると非常に困るんやが・・・

issueやstack overflowを見てみる。

github.com

見てみるのですが、解決しているらしい?issueをずらずら見ていくと、 cv2.setNumThreads(0) を設定することでopencv側のマルチスレッドを無効にして、multioprocessing側で実行できるようになるっていう感じですかね。

するとマルチプロセスで実行できました。

んで上記のコードは動くの?

動かないです(きっぱり)

というのも、opencv側の問題は解消できたのですが、openposeのAPI側もおそらく同じ理由で駄目っぽくて、諦めて普通に直列に実行しました・・・まぁopenposeの場合は仕方ないかってかんじです。

まとめ

opencvを用いた関数をmultiprocessingで並列実行するときに、cv2.cvtColor関数でエラーが起こる時は

cv2.setNumThreads(0)

を設定して実行しましょう。

この土日をこの時間に費やしたことでちょっとだけmultiprocessingさんと仲良く慣れたような気がします。はい。(ただし並列化で早くなったとは言ってない)

F値をよくどわすれするのでオレオレ備忘録

よく使う評価尺度なのにたまにわすれる

https://ja.wikipedia.org/w/index.php?title=情報検索#検索性能の評価

RandomForestなどの決定木アルゴリズムの評価に使われるF値ですが表だけ丸暗記してもちっともイメージがつかないので、例えも使っていきながら抑えていこうかと

親の顔より見た表

予測した値
実際の値TPFN
FPTN
  • 精度(適合率・precision) :「正しい」と予測したデータのうち、実際に正しかった割合

Precision = \frac{TP + FP}{TP}

  • 再現率(recall) :実際に「正しい」データのうち、予測が「正しい」と推測した割合

Recall = \frac{TP + FN}{TP}

  • F値(F-measure): 精度と再現率の調和平均

\frac{2 \cdot Recall \cdot Precision}{Recall + Precision}

覚えるときに参考になった例え

  • やきうのボール見極め⚾
    • バッターになったつもりで考えていきましょう。ピッチャーマシンが10球投げてくるので「ボール(0)」か「ストライク(1)」かを見極めます。

https://2.bp.blogspot.com/-RhBtPltHTpE/WOdDd1xUCoI/AAAAAAABDjU/O5cdrtClFN40ui-iSTFxtyWliKDg0DEFQCLcB/s400/baseball_batter.png

  • TP(True (Predict) Positive)
    • 「ストライク」(P)を投げられたときに「ストライク」と判断(T)した
  • FP(False (Predict) Positive)
    • 「ストライク」(P)を投げられたときに「ボール」と判断(F)した
  • FN(False (Predict) Negative
    • 「ボール」(N)を投げられたときに「ストライク」と判断(F)した
  • TN(True (Predict) Negative
    • 「ボール」(N)を投げられたときに「ボール」と判断(T)した

※'Predict'はイメージを付けるためにわざとつけてます(実際には付きません)

ということになります。つまりこの見極めの例えを上記の用語に適用すると、

  • 精度
    • 10球中「ストライク」(TP + FP)投げられたうち、「ストライク」(TP)と判断した割合
  • 再現率
    • 10球投げられた(TP + FN)のうち、「ストライク」(TP)と判断した割合

ということになります、上記2項目は片方の数値をあげようとするともう片方が下がりやすい傾向にあることから、この2つのパラメータを加味したF値を使って計算すればいい感じに評価できるという形になります。

3つ以上に適用

やっていることは上記と一緒で「ストライク(Strike)」「ボール(Ball)」の他に「大暴投(Outside)」という項目を加えて、たとえになぞらえると以下のようになります。

予測した値
S B O
実際の値 S SP BN ON
B SN BP ON
O SN BN OP

このときストライクについて精度と再現率をみるならば

  • 精度 \frac{SP}{SP + SN}

  • 再現率 \frac{SP}{SP + BN + ON}

ということになります。

書いてみて

とにかく覚えたらアウトプットして自分が混乱しないかを確認するのが最も知識が定着するいい方法なんじゃないかと思ってまとめてました。

表で覚えるより例えやエピソードと絡めて記憶すればよりわすれることはないんじゃないかと。もし上記の説明で「これちゃうやんけ」的なやつがあればコメントしていただけるとmm