ごはんと飲み物は紙一重

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

イベント多き1週間【TensorFlow UserGroup Okinawa vol.1】【沖縄・宜野湾エンジニア勉強会(大LT大会)】【オープンキャンパス】

さぼりだよ さぼりじゃないよ さぼりだよ

一段落したので、ブログかきまあす。

先週から昨日にかけて、以下のイベントに参加していました。

  • TensorFlow UserGroup Okinawa vol.1
  • 沖縄・宜野湾エンジニア勉強会(大LT大会)
  • 私の在籍する大学のオープンキャンパス

2つのイベントではLTを、オープンキャンパスでは所属研究室のデモンストレーション開発に、いろいろと手を動かしていたせいもあってブログを書く暇がありませんでした・・・ぐぬぬ

TFUG Okinawa

tfug-okinawa.connpass.com

こちらに参加しておりました。会場が大学ということもあり、学生の参加が多く見られましたね。

個人的にはyabooさんのとても密の濃いTensorflowによるMNIST classificationの解説がとてもおもしろかったです。Kerasばっかり楽して使っている側としては、とても衝撃があってTensorflowを触ってみたくなった良いきっかけになりました。

懇親会まで参加したかったのですが、先約があり断念・・・

LT資料はconnpassにアップロードしてあるのですが、こちらにも共有。スライドというよりもnotebookなのですが、発表スタイルがJupyter × RISEなので発表はスライド、共有はノートって感じで新しいのではないかと(?)

github.com

しかしTFUGLTの感触はむむむって感じで精度まで出せるとよかったなぁと。

沖縄・宜野湾エンジニア 勉強会

次はこちら。

connpass.com

VOYAGE GROUPに務めるjewelさんによる友達募集エンジニア勉強会なるもの。

セキュリティからwebエンジニア、データ分析者など幅広い分野からの参加があり、どのLTも見応えがありました。私の後輩も何名かLTとして登壇しており、初めてにもかかわらずいろいろがんばっているなと感心しました。

github.com

ココ最近ずっとデータ分析界隈やPython界隈でLTすることが多かったため、資料を作りながらこの発表できるのかと思い急遽軌道修正したのがよく分かるノートになっています。まぁ、なんでもありの大LT大会と銘打っていたこともあり、思っているよりも感触は良かったです。

オープンキャンパス

※ 今年度のパンフレットは7/15現在未更新 オープンキャンパス – 琉球大学 工学部 工学科

オープンキャンパスの季節ですね。今年はうちの研究室のボスが張り切っていて「今年はオープンキャンパスに出すぞ!」って感じでいつの間にかやることに。とはいえ、私自身もやりたかったことではあるので、かなり楽しかったです。

下は中学3年生から上は学生の親御さんまでわりと幅広い参加者に楽しんでいただけたのではないかと思います。

私の持つブースの内容は日本語手書き文字分類のデモでTFUGで紹介した内容を完成させたものになります。testに対して99%出ていて、これは行けると思った矢先、うまく分類しない問題が発生し、後々考察したところデータセット明朝体を中心に書かれていることでした。まぁ99%っていうのは「明朝体のような字でなおかつ丁寧な文字」に対する分類精度なので、手書きに対する汎用性が低かったのは猛省しなければならないですね・・・

多忙の1週間を終え

ひとまずオープンキャンパスまで突っ走れたので、ここからは通常モードへ。バイト先でのデータ分析なども楽しくやっていきながら、そろそろ研究の中間発表に向けて動いていかなければ行けないですね。やりたいことは山ほどあるので取捨選択をしっかりしながら頑張っていきたいですね。

etlcdb(ETL文字データベース)のETL9Bから画像を抽出するスクリプトを書いた

ETL文字データベースとは

「ETL文字データベース」は手書きまたは印刷の英数字、記号、ひらがな、カタカナ、教育漢字、JIS第1水準漢字など、 約120万の文字画像データを収集しています。1973年から1984年にかけて電子技術総合研究所(現 独立行政法人産業技術総合研究所)において、 日本電子工業振興協会 (現 電子情報技術産業協会)・ 大学・民間の研究機関の協力のもとに文字認識研究用に収集され、ETL-1からETL-9の9種類のデータにまとめられています。研究用途に限り、無料で使用することができます。本データベースは磁気テープやCD-Rの郵送によって提供されていましたが2011年4月以降インターネット経由でダウンロードすることが可能になりました。(原文ママ)

http://etlcdb.db.aist.go.jp/?lang=ja

サンプルコードをベースに書いてみた

上記のデータセットからデータを抽出するスクリプトはまだなかったので、この際作って公開することにしました。後に必要とする方の助けになりますように。公式ホームページでは一応サンプルコードが書いてあるので変換などに助けられるのですが、結局全部抽出するためそのままでは役に立たないという感じです。「Python 2.7.5 に対応」と書いてあるんですが、「君はまだPython2系なのかい?」と煽りたくなるバージョン・・・

ということで、ソースはこちらになります。

やってることは

  • ディレクトリ内のETL9Bの分割ファイルの読み出し
  • ファイルを読み出して画像を抽出保存

の2つです。dir_name は各位の保存する場所に適宜変更していただけると良いかと思われます。ちなみに実行環境はPython3.5.2なので一応3系対応してます。最新の3.6, 3.7でも動くと思ってます。9Gについては特にやってません。もし誰かスクリプトを書いたら公開してくれたらブクマしますね。

勢いで書いてしまってるため、速度が担保できてないのでここをこうするともっと早くなると分かる人はぜひぜひコメントください。多分これ並列処理も可能なのでもう少し早くなるのではと思っています。

台風に振り回された週末

見事に台風に一撃喰らいました

twdlab.hatenablog.com

もともとはPyCon Kyushu から帰る予定でしたが、タイトル通り見事見事にこの日は台風直撃前で、個人的には飛ぶだろうと思っていたのですが、安全を見越してPeachさんは早めの欠航対応。

これまでも欠航がなかったわけではないのですが、その時は落ち着いて対応できたのでよかったのですが、今回については

土曜日に帰れないと日曜日直撃の月曜日帰沖

という感じです。もともと月曜日の朝一に講義で先生とハンズオンを開催する予定だったので、これはピンチ。

落ち着いて調べた結果

  • 土曜日欠航はPeachなどのLCC便で、JALANAは条件付き運行で飛ぶ
  • 当日券で買うとおよそ30K~33K。くっそたかい。
  • Peachで振替すると少なからず日曜まで確定で飛ばないので、月曜日

って感じでした。学生の私にはお金はないので結局、便を月曜日に振替え、宿を取り直して事なきを得ました・・・

当日にもかかわらず1泊6Kくらいの安い宿があったので、とても助かりました・・・

とにかく空港にfree wifiがあったのが救いでした・・・私の黒猫Mac大活躍でしたね。

残りの週末

  • 美味しい焼肉くった
  • 美味しいつけ麺やラーメン食べた
  • レジアイス捕まえた

こんな感じで派手に遊ぶわけではなかったのですが、美味しいものを無限に満喫してました。福岡(というか博多)素晴らしい。うまいは正義。

振り返って

とにかく沖縄は台風シーズンに飛ぶとこんなことが普通にありうる(沖縄の台風はなぜか土日に直撃する率高い気がする)ので、万が一天災のタイミングで県外遠征してたら、

  • 空港に向かう前に便がちゃんと飛ぶか確認しましょう
  • 万が一飛ばなくても、天災なら基本どこも便の振替えが効くので焦らず予報をみながら調整すると良さげ
  • そもそもLCCで取らずにSKYなどのミドルキャリア以上の飛行機に乗ればだいたい楽に解決する

上記の項目をしっかりやってれば大丈夫なんじゃないかと。要は慣れなんですがw

みなさんも沖縄から県外遠征や、県外から沖縄に来るときに台風が居たら注意しましょうねw

P.S. 結局月曜朝一でやるハンズオンは暴風警報のため休講になり、加えて取っていた午後の講義も先生の私用で休講になったので本当に運が良かったです。

PyCon Kyushu in Line Fukuoka office に参加してきたお話 +α

色々ありましたが福岡に行ってきました

この日、沖縄ではエンジニアの祭典「ハッカーズチャンプルー」がありましたが、日程丸かぶりでこちらの方に参戦してきました。

(来年こそは参加するぞ)

金曜日から土曜日までの弾丸福岡(のはず)

元々今回の参加にあたり、LCCPeach便にて飛んだため往復を超絶安く手にしていたため、イベント参加後は懇親会に参加せずに帰る予定でした。 (ちなみに往復8K行かないくらいで取れたのでだいぶ美味しい)

しかし

なんとなんと福岡に到着したのはお昼で、そのときは外では大雨やばかでかい雷がなりまくるくらい天気が悪く、そのため、

  • 本来戻りたいゲートにまだ離陸してない飛行機がいる
  • てかそもそも天気悪すぎるので地上の作業員は安全のために作業していない

って感じで。着陸して1時間ぐらい機内で待たされました・・・こういう経験はなかったのでとても疲れました・・・

特にお腹も減ってきていたので、降りたあとはダッシュでラーメン凪福岡空港に走っていきました。煮干しラーメン超うまいです。

懇親会参加できないので、有志の前夜祭には参加するぞ!

もともとその予定だったので、当日の会場下見も兼ねて前夜祭に参戦。

実行委員を始め、トークセッションを行う方や、事務局の方まで様々な方が参加していました!

私がちゅらデータでバイトしていることもあり、実際にその話や今回のkeynoteでもある真嘉比さんについてだったりお話してました。

締めのラーメンという頭の悪いムーブも決められたので大満足の前夜祭でした。

ほんへ

というわけで土曜日は朝からPyCon Kyushuへ参加!

Line Fukuoka office はきれいで素晴らしいですね。

Keynote ちゅらデータ社長 真嘉比さんの発表

prologueにふさわしい発表でした。「地域コミュニティを盛り上げて、競争力を上げていこう」というまとめで、最高にかっこよかったです!実際にちゅらデータがたちあがってから、Python界隈もより活発になったように感じています(オーガナイザー並感)

トラック

その後は興味あるものを中心に覗いていき、主にデータサイエンスや機械学習関連のトラックを聞いてました。全体のざっくりとした感想として、

  • Python * OpenCV はとても便利で可読性がある <- わかる
  • Open3D * SLAM 面白そう。Python2でしかできないところどうにかならないかな
  • 深層学習ライブラリにKeras採用している発表者多いな
  • 深層強化学習はとにかく愛を持って優しく育てましょう

な感じでした。

運営とかイベント参加したときの所感

  • Line Fukuokaさんの協力の下、フリードリンクで美味しい飲み物がたくさんいただけたの爆アドだった
  • 相変わらず弁当が非常に豪華な弁当だった。これで学生500円なんだから本当に感謝。
  • 運営さんの下準備がしっかりしていたこともあって、特に会場内で問題が起こることもなくスムーズな印象を受けた。

そして伝説へ

次なる伝説の先は・・・沖縄 !!!そう!!!沖縄!!!

来年の PyCon Kyushu は沖縄ですよみなさん!! O K I N A W A !!

いざ来年かと思うとすごくテンション上がりますね!去年にはYAPCが沖縄であったりと、沖縄での大きなカンファレンスが続々と展開されていくのは非常に良い流れですね!!

というわけで、来年は運営の手伝いや、次こそスピーカーとして応募しようと思います!思うじゃない!応募します!

というわけで、今回初開催となったPyCon Kyushuを支えていただいた運営・スタッフ・すべての参加者にこの場を借りてお礼申し上げます!楽しいイベントを本当にありがとうございました!

P.S. イベントを終え帰路へ・・・

懇親会では飛び入りLTが開催されたらしく、参加したかったのですが飛行機の都合であえなく断念・・・

断腸の思いで福岡空港へ・・・

すると

欠便・・・というわけで、この記事に書いてしまうと長くなるので続きはひとまず次のエントリで・・・

html5のcanvasで書いた文字をbase64に変換して画像保存したときに透過してしまう問題

めずらしくpython以外を調べてました

uchidama.hatenablog.com

手書き文字をデモンストレーションするべく、上記のサイトを見ながらcanvasで書いた文字を、base64に変換してモデルに食わせて分類してもらうと思っていたのです。

普通に食わせる文には問題ないのですが、通常canvasで作った画像は透過する(RGBA情報をもった状態)らしく、alpha情報を保持したままbase64に保存されるらしいです。

普通に聞けば、アルファ情報を持ってくれていてありがたいのですが、これが今回の場合は罠になっており、

背景白の描画色黒だと、RGBはすべて0として保存されるみたいです(要検証)。

つまり、上記のコードを使って普通に手書き画像を生成すると、実際に描画した際の色パラメータはアルファチャンネルに保存されるわけです。

アルファチャンネルに情報を残す問題

これの何が問題なのかというと

f:id:ST_ha1cyon:20180627232947p:plain

opencvでいじろうとするときに、rgb情報に色情報はのこってないので、変換した際に真っ黒になるわけです。

そりゃそうなんですけどね。当たり前の話なんですが、この原因を突き止めるまでに時間を食いまして・・・

「描画したはずの情報がぜんぜん保存されねえ!background-colorをホワイトにしたり、canvasのcontext.fillStyleでRGB指定してるのに全然反映されない!なんでやねーん(キレ気味)」

という状態が発生するわけです。まぁそりゃRGBに値が保存されないか(ry

白黒画像をどうにか抽出するべく我々はnp.arrayの奥地へ

チャンネルの保存場所はわかったので、

アルファチャンネルのマスク情報を抽出して元の白黒画像に変換するわけです。

もともとJupyterで作業していたので、base64で抽出したRGBA画像に対して、

img_prop = []
for x in img:
    tmp = []
    for y in x:
        tmp.append(255 - y[3]) # Aの値を抽出して白黒反転
    img_prop.append(tmp)
img_prop = np.array(img_prop).astype("uint8")

マスク情報を抽出して、値を反転させてあげるわけです。そうすると。

f:id:ST_ha1cyon:20180627233540p:plain

ほら、できた。こうすればOpenCVで引き続き、手書き画像に前処理ができるようになります。

原因を解決してみて

お恥ずかしながら、この問題タイトルにキーワードガッツリ書いたのに、一つも問題がかすらない(そもそも画像の保存形式の問題)という悲しい自体に。html5さんすまねぇ。

分類モデルに通す前に一度前処理を通したかったという理由でこの問題にぶち当たったので、どうにか私と同じような「pythonしか触ったことないけどtensorflow.jsとか使ってリアルタイム手書き画像分類とかしたい」っていうコアな層の助けになってくれればと思います。

それと同時に調べながら、「フロントエンドも勉強してみたいな」と思いました。


6月28日(木) 0:17 追記 ソースに追記しました。astype("uint8")つけないと、結果がfloatになるので、opencvで画像処理できなくなる問題が発生します。気をつけよう。

os.walkの罠

stackoverflow.com

これですね、os.walkでフォルダやファイルのリストとpathを取ってくるのですが、

とってくるフォルダのリストがどうやらバラバラに取得されるらしい。(正式にはascii?あんまり詳しくない)

とりあえず想定していたフォルダ名を辞書順にとってくる方向をやりたければ、

for root, dirs, files in os.walk(path):
    for dir in sorted(dirs):

sorted関数噛ませば解決。

この罠のせいで、深層学習周りのデータ読み込みで苦しめられたので、
次からはglobつかおうかな・・・

ちゅらデータ分析合宿に参加したお話

初のデータ分析合宿参加

つい先日の土日に、ちゅらデータ株式会社主催の分析合宿に参加してきました。バイト生の私も参加できるということで参加してたくさん勉強してきました。細かい詳細はあんまり外に出せないので、合宿を通して得た知見などをずらずら書いていこうかなと思います。

大まかな分析合宿の流れ

  • ルール説明
    • データを渡すのでこれを目的変数を元に分類してくださいね
    • グループを組んで協力してやってね
    • 1日目夜に中間発表、2日目昼で最終発表なんで、そこまでにtestデータに対する精度を高めてね

というものでした。グループでの作業だったので、チームメンバー内での認識を合わせたり、方向を確認したりをしっかりしなきゃいけませんでした。

データ分析の流れ

私達チーム(というか全チーム)はこんな感じで分析してました。

  1. データの俯瞰
    • どんなデータ構成になっていて、どういう特徴が見られるかを確認
  2. 仮説を立てる
    • 理解したデータの特徴を元に、どういう特徴量が必要になるかを提案
  3. 仮説の検証
    • 特徴量にする前に、その仮説が本当に特徴量として適していそうかを調べる
  4. 特徴量の作成
    • 実際に分類に用いる特徴量を生成する
  5. 分類モデルの作成
    • 作成した特徴量を元に、分類モデルを作成
  6. 作成したモデルの確認とその考察
    • 精度や細かいパラメータを確認して、次にどのような特徴量が必要・どうやったら精度が上がるかを考える

合宿で精度トップだったチームは、このサイクルがとても早く回っていたんじゃないかなという印象でした。3の検証の段階では、自分のpandas力のなさ・matplotlib力のなさが身にしみてわかりましたね・・・ぐるじい。

2日間を通して

中間発表まではこのサイクルが回っていたのかと思うのですが、その後はのんびりしすぎてしまった?結果、2日目に焦って検証がうまくいかないなんてことがありました・・・そのせいで特徴量を作成できずなんてことがあったので、サイクルの各項目にどれだけ時間を使えるか、どこまでの範囲までできればよいのかを予め共有できてたら良かったのかななんて思いました。

とにかく、2日間を通して、大きく思ったのは、

上記のサイクルを回すだけの経験と知識がまだまだ足りてないなと感じました。

自分に足りないところがわかるとても良い機会だったので「無知の知」ってやつですね。今週から、足りないところの知識や技術を埋めていけるように再スタートしていこうと思います!2日間どうもありがとうございました!