gorogoroyasu

福岡の開発会社で働いている。

メモ golang のdefer

defer は便利でよく使うので、特性をちゃんと把握しておく必要がある。

  1. defer の実行順
package main

import (
    "fmt"
)

func main() {
    for i:=0; i<3; i++ {
    fmt.Println("1")
    defer fmt.Println(fmt.Sprintf("2-%d", i))
    fmt.Println("3")
    }
}

結果

1
3
1
3
1
3
2-2
2-1
2-0

ということで、後入先出になってることがわかる。

  1. 他の関数内のdefer はいつ呼ばれるのか?
package main

import (
    "fmt"
)

func de(s string) {
    defer fmt.Println(s)
}

func main() {
    for i:=0; i<3; i++ {
    fmt.Println("1")
    de("2")
    }
}

結果

1
2
1
2
1
2

となった。 関数のスコープを抜ける時に呼ばれるらしい。 なるほど。

この辺は、ドキュメントにも書いてあると思うが、 簡単な実験で挙動を確認できるので、サンプルを書いてみると良いと思う。
続けていこう。

"Key (id)=(1) already exists" error occurred in CakePHP3 model test.

久々にCakePHP でテストを書いている。
Fixture を整えて、TestCase を書いた。
そして、値を save するメソッドをテストした。

すると、

duplicate key value violates unique constraint "hoges_pkey"
DETAIL:  Key (id)=(1) already exists.

というエラーが出た。
悲しい。

書いてたFixture は、こんな感じ。

<?php
namespace App\Test\Fixture;

use Cake\TestSuite\Fixture\TestFixture;


class HogesFixture extends TestFixture
{

    /**
     * Fields
     *
     * @var array
     */
    // @codingStandardsIgnoreStart
    public $fields = [
        'id' => ['type' => 'integer', 'length' => 10, 'autoIncrement' => true, 'default' => null, 'null' => false, 'comment' => null, 'precision' => null, 'unsigned' => null],
        'user_id' => ['type' => 'integer', 'length' => 10, 'default' => null, 'null' => false, 'comment' => null, 'precision' => null, 'unsigned' => null, 'autoIncrement' => null],
        'fuga' => ['type' => 'text', 'length' => null, 'default' => null, 'null' => false, 'collate' => null, 'comment' => null, 'precision' => null],
        'modified' => ['type' => 'timestamp', 'length' => null, 'default' => null, 'null' => true, 'comment' => null, 'precision' => null],
        'deleted' => ['type' => 'timestamp', 'length' => null, 'default' => null, 'null' => true, 'comment' => null, 'precision' => null],
        '_constraints' => [
            'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []],
        ],
    ];
    // @codingStandardsIgnoreEnd

    /**
     * Init method
     *
     * @return void
     */
    public function init()
    {
        $this->records = [
            [
                'id' => 1,
                'user_id' => 1,
                'fuga' => 'a',
                'modified' => 1539138087,
                'deleted' => 1539138087
            ],
            [
                'id' => 2,
                'user_id' => 1,
                'fuga' => 'b',
                'modified' => 1539138087,
                'deleted' => 1539138087
            ],
            [
                'id' => 3,
                'user_id' => 1,
                'fuga' => 'c',
                'modified' => 1539138087,
                'deleted' => 1539138087
            ],
        ];
        parent::init();
    }
}

そして、原因は Fixture にあった。

解決策は、

    public function init()
    {
        $this->records = [
            [
//                'id' => 1,
                'user_id' => 1,
                'fuga' => 'a',
                'modified' => 1539138087,
                'deleted' => 1539138087
            ],
            [
//                'id' => 2,
                'user_id' => 1,
                'fuga' => 'b',
                'modified' => 1539138087,
                'deleted' => 1539138087
            ],
            [
//                'id' => 3,
                'user_id' => 1,
                'fuga' => 'c',
                'modified' => 1539138087,
                'deleted' => 1539138087
            ],
        ];
        parent::init();
    }

$this->records に入れた連想配列内の、 id を消すこと。

普通に考えたらそうだ。
ID は、 データベースのsequenceの機能を使うので、idの発行をCakePHPに任せたら、 1からID が付与され、自動的にインクリメントされる。

一方、ID に値を入れてしまうと、Database の Sequence の機能を使わずに値が保存される。
よって、Database は、次の値は1だと思っている。しかし、1はすでに存在している。
だから、エラーになる。

細かいところだが、ハマりどころだ。

やっかいなことに、 Fixture を bake すると、デフォルトで値が挿入されるので、
Bake のテンプレートを書き換えるか (やったことない) いちいちコメントアウト (もしくは削除) する必要がある。

参考にしたのはこちら stackoverflow.com

iPhone の充電ができないときに調べるべきただ一つのこと

ここ2ヶ月ぐらいずっと、iPhone の調子がおかしかった。
これは、ライトニングケーブルが断線してるな。
勘のいいボクはすぐに気づいた。

最近買った、Magic Trackpad 2 付属のライトニングケーブルを使ってみた。
そのときはうまく充電できた。
しかし、その能力も長くは続かなかった。

それからは、iPhone を省電力モードにして、だましだまし使ってきた。
電池の色が黄色いのがデフォルトだった。
いつも、何度かケーブルを抜き差しして、ちょうどよい角度を探していた。

そして、先週の週末、夜、充電できなくなった。

充電は残り3%。
絶体絶命だ。
このまま電池が切れ、二度と充電できない状況になったら、
二段階認証 が一切できなくなる。
念の為、Google の 二段階認証 は解除した。
Authy に移行していなかった自分に腹が立つ。
また、最近 Google Photos にアップロードしていない写真たちも消滅する。
LINE も移行しなければならない。
ボクは iPhone に頼りすぎていたことに気づいた。
そして、バックアップの重要性を思い出した。

時刻は21:05。
Apple Store はすでにしまっている。
ボクは絶望に暮れた。
念の為、ビッグカメラの営業時間を調べた。
こちらも21:00 まで。
終わった。 そう思った。
しかし、次の瞬間、ボクの脳裏に、ひらめきが走った。

ヨドバシカメラApple 製品おいてるゾーンあるよな。
時間を確認する。すると、22:00 まで開いている。
自宅からヨドバシカメラまで、チャリで15分。
余裕で間に合う。

勢いで直行した。修理できない可能性はあるが仕方ない。
最悪iPhone8 を買って帰ろう。 と心の中で決めていた。

ヨドバシカメラでの体験は、最悪だった。
修理ができないのは仕方ない。
しかし、あんなに広いスペースを使って製品を展示いるにもかかわらず、販売すらしていないのだ。

値段を聞いたら、「展示してあるiPhoneApple.co.jp にアクセスすれば見れますよ」 と言われた。
そんな事も知らないんですか? 的なテンションで。

知っとるがな!w

泣く泣くヨドバシカメラを立ち去り、家路についた。
クロアチアが勝つかフランスが勝つか よりもiPhone の充電のほうが気になった。

なんとか充電してください!!!

藁にもすがる思いで何度もコネクタを抜き差しした。
しかし、何もおこらない。

ポケモンを捕まえるときに、 A B ボタンを連打したら捕まえやすくなる みたいな噂があったが、あれと同じぐらい無駄なことをしていると感じた。
ちなみに、ポケモンに関して言うと、ホウオウをモンスターボールでゲットしたことがあることを思い出した。

話を戻す。

数十分の格闘の末、iPhone が震えた。
その角度をキープしつつ、フル充電した。

次の日、起きてすぐ Apple Store に向かった。
予約せずに行ったので、予約してないやつらが並ばされる長い列の最後尾に追加された。
暇そうにしている店員に腹が立つ。

しかし、もうすぐiPhone を修理できる。
そう信じて並んだ。
並び続けた。

30分ぐらいして自分の番がきた。

店員に言った。 「充電ができなくなりました。交換だと思います。」
3秒ぐらいiPhone を見回した店員は、言った。 「あー、Dock に誇り溜まってますねー」

そして、ホコリを取り除いてくれた。 結局、原因はDock のホコリだった。

ボクのiPhone は、生き返ったかのように充電できるようになった。

TensorFlow の ObjectDetection API を Fine Tuning する

TensorFlow には、Object Detection を行うためのコードが用意されています。
今回は、TensorFlow 1.8.0 でObject Detection を行ってみました。

github.com

実行した環境は以下の通り。

Ubuntu 16.04 に Mac Book Pro から ssh で接続
nvidia-docker: 18.03.1-ce
CUDA: 9
cudnn: 7
tensorflow-gpu: 1.8.0

参考にしたもの

自分は、以下の動画を見ながらどのように行えばよいかを学びました。
非常に丁寧に説明されているので、おすすめです。
ただ、問題は解説がWindows 向けにされていること。
なので、今回は Ubuntu でどのようにやればよいかを書いていきたいと思います。

www.youtube.com

準備

実行するソースコードの準備

上記の環境の任意のディレクトリに、 github.com をclone します。

cd /path/to/dir
git clone https://github.com/tensorflow/models

また、先程の動画の作者の方が作られたレポジトリがあるので、そのコードをclone します。

git clone https://github.com/EdjeElectronics/TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10.git

その後、TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10 ディレクトリの中身を
models/research/object_detection にコピーします。

rm -r models/research/object_detection/doc
rm -r models/research/object_detection/images
rm -r models/research/object_detection/inference_graph
rm -r models/research/object_detection/training
cp TensorFlow-Object-Detection-API-Tutorial-Train-Multiple-Objects-Windows-10/* models/research/object_detection/

環境の整備

protobuf の準備をします。

apt-get install protobuf-compiler

を行い。 protobuf をインストールした後、

cd path/to/dir
git clone https://github.com/cocodataset/cocoapi.git
cd cocoapi/PythonAPI
make
cp -r pycocotools ../../models/research/
cd models/research
protoc object_detection/protos/*.proto --python_out=.

というコマンドを実行します。 これらのコマンドは、
models/installation.md at master · tensorflow/models · GitHub に載っています。

ラベルの準備

次に、ラベルの準備を行います。 自分は、MacApp Store から¥240 で購入できます。
とても使い勝手がいいのでおすすめです!

RectLabel for object detection

RectLabel for object detection

  • Ryo Kawamura
  • 開発ツール
  • ¥240

RectLabel を使ってラベルをつけていきます。

他にも labelbox.com というツールが有るようで、動画ではこちらを使っています。

こんな感じでラベルをつけていきます。

f:id:adiboy:20180713152914p:plain

ラベルの作成が終わったら、 Ubuntu 上、 /path/to/dir/models/research/object_detection/images に画像をコピーします。
その後、 cd /path/to/dir/models/research/object_detection/images && mv annotations/* ./ && rm -r annotations && mkdir test train を実行します。

動画内で、学習データは200枚以上必要と言っていたので、
頑張ってラベリングしてくださいw

また、画像のサイズは、720x1280 以下にすることが推奨されるようです。

これらが終わったら、適当に jpg と xml のペアを
train, もしくはtest に振り分けていきます。

/path/to/dir/models/research/object_detection/images にて、

import glob, shutil
import numpy as np

xmls = glob.glob('*.xml')
assert len(xmls) > 200

train = np.random.choice(xmls, 200, replace=False)

for xml in xmls:
    name = xml[-4:]
    if xml in train:
        shutil.move(xml, 'train/{}'.format(xml))
        shutil.move('{}.JPG'.format(name), 'train/{}.JPG'.format(name))
    else:
        shutil.move(xml, 'test/{}'.format(xml))
        shutil.move('{}.JPG'.format(name), 'test/{}.JPG'.format(name))

みたいなコードを実行して、適当にディレクトリを振り分けていきます。
上記のコードは、実際に動かしたわけではないので、動作保証はしません。

これで、ラベルの準備は完了です。

fine tuning する対象の重み

今回は、Faster R-CNN をファインチューニングしていこうと思います。
事前に学習された重みは、下記サイトに掲載されているので、

github.com

cd /path/to/dir/models/research/object_detection/
wget http://download.tensorflow.org/models/object_detection/faster_rcnn_inception_v2_coco_2018_01_28.tar.gz
tar -zxvf faster_rcnn_inception_v2_coco_2018_01_28.tar.gz

というふうに、ダウンロードして解凍します。

その後、

cp samples/configs/faster_rcnn_inception_v2_pets.config training
cp data/pet_label_map.pbtxt training/label_map.pbtxt

とし、これらの中身を編集していきます。

training/label_map.pbtxt の中には、アイテムのID と名前を書きます。

item {
  id: 1
  name: 'madatsubomi'
}

item {
  id: 2
  name: 'otachi'
}

item {
  id: 3
  name: 'pijotto'
}

faster_rcnn_inception_v2_pets.config は少し修正箇所が多いのですが、

# 10行目
num_classes を自分が学習させたいラベルの数に書き換える
# 107行目
fine_tune_checkpoint を /path/to/dir/models/research/object_detection/faster_rcnn_inception_v2_coco_2018_01_28/model.ckpt に書き換える
# 122 行目
input_path を、 /path/to/dir/models/research/object_detection/train.record に書き換える (未作成)
#124 行目
label_map_path を /path/to/dir/models/research/object_detection/training/label_map.pbtxt に書き換える
#128行目
num_examples を テストデータの数に書き換える
#236行目
input_path を、/path/to/dir/models/research/object_detection/test.record に書き換える (未作成)
#238行目
label_map_path を /path/to/dir/models/research/object_detection/training/label_map.pbtxt に書き換える

これらの操作により、設定は完了です。

TensorFlow が読み出すデータの作成

generate_tfrecord.py というファイルを編集します。
編集するのは、class_text_to_int という関数の中身です。
この関数の中身を、自分のデータセットと training/label_map.pbtxt に書いた内容を見比べながら編集していきます。

def class_text_to_int(row_label):
    if row_label == 'madatsubomi':
        return 1
    elif row_label == 'otachi':
        return 2
    elif row_label == 'pijotto':
        return 3
    else:
        None

その後、train.record, test.record というファイルを作成していきます。

cd /path/to/dir/models/research/object_detection/
python xml_to_csv.py
python generate_tfrecord.py --csv_input=images/train_labels.csv --image_dir=images/train --output_path=train.record
python generate_tfrecord.py --csv_input=images/test_labels.csv --image_dir=images/test --output_path=test.record

これで、TensorFlow が学習時に読み出すデータが作成できました。

学習の実行

学習を実行します。

cd /path/to/dir/models/research/object_detection/ 
nohup python -u  train.py --logtostderr --train_dir=training \
--pipeline_config_path=training/faster_rcnn_inception_v2_coco.config \
> success.log 2> error.log &

これで、学習が開始されます。
学習の経過を見たい場合は、 tailf error.log を見てみてください。
(なぜ success.log ではなく error.log の方に吐かれるのかは不明)

loss の平均値が 0.05 を下回るようになったら学習完了らしいです。 (動画で言っていた。)

出力

では、出力を確認してみましょう。
出力の確認には、 export_inference_graph.py というファイルを利用します。

python export_inference_graph.py --input_type image_tensor --pipeline_config_path training/faster_rcnn_inception_v2_coco.config \
--trained_checkpoint_prefix training/model.ckpt-X --output_directory inference_graph #ただし X は、 training/model.ckpt-X となっているX の値

その後、 Object_detection_image.py の中の IMAGE_NAME を変更し、

python Object_detection_image.py

を実行します。

そうすると、NN が元画像に box を上書きした画像を出力してくれます。

なにか問題点があったら教えてください。

以上。

PyCon Kyushu 2018 実行してきた

2018 年の前半最後となる6/30 に、
LINE Fukuoka さんの会場をお借りしてPyConKyushu 2018 を開催してきました。

なんか、発言が上からですいません。 でも、本当に開催してきたんです。

今回は、登壇者・参加者としての参加ではなく、
実行委員として関わってきました。

きっかけは、去年の秋に福岡で Python Boot Camp in Fukuoka が開催されたことでした。
その懇親会で、@yk さんと @kiyotamanさんと PyCon を福岡で開けたらいいねー みたいな話で盛り上がりました。

ただ、今年はPHPカンファレンス福岡のスタッフに参加しようと思っていたので、 6月頃開催しようと思っている と言われたとき、どうしようか揺らぎました。
揺らいだ理由は、弊社からPHPカンファレンス福岡に登壇する人間は多いのに、
スタッフをする人間が少ないからでした。
しかし、PHPカンファレンスは、何年も実行してきた経験がある団体。
僕一人がいなくてもなんとかなるだろう。
そんな思いで、PyCon Kyushu の実行委員に参加しました。
来年は、PHPカンファレンスのスタッフをやらせていただきたいと思います!

PyFukuoka を主催されている @yujikawa_py さんと @tsurubee3 さんのちからが凄まじく、
すごい勢いでスタッフが増えていったのを覚えています。

スタッフは、

  • 企画
  • 会場
  • 事務
  • 広報

に分類されました。

自分は、広報のしごとをしていました。

多分、一番何をしているかわからないと思われていたんじゃないかなと思いますw

自分の主な仕事は、公式Webサイト の更新と Twitter業でした。
仕事でWeb を触ることはありますが、HTML はあまり触らないので、
新鮮さを感じたりしていました。

Webサイトの感想とかTwitterの感想とかもお待ちしています。

そんなこんなで迎えた当日、他の班の方々が慌ただしくしている中、
自分はずっとPCに向かっていました。
なんか、申し訳ない気持ちでいっぱいでした。

あまり皆さんの発表を見ることができなかったため、
後ほどビデオで復習しようと思います。
質問があったら Twitter などでメンションを飛ばすかもしれません。
その際は、めんどくさくてもニコニコと答えてくださると嬉しいです。

2次回へは行かずに帰っちゃいましたが、
懇親会で @terapyon さんとかとお話できて楽しかったです!

来年は沖縄!
完全に参加者として楽しませていただくつもりです!
楽しみにしています!!!よろしくおねがいします!!!

PHPカンファレンス福岡で平成最後のLTをしてきた!

先日、 2018/06/16 に開催された PHPカンファレンス福岡にて、
5分間のLTスピーカーとして登壇させていただきました。

phpcon.fukuoka.jp

運のいいことに(?)、 LT順が最後!
つまり、来年の4/30 までにPHPカンファレンス福岡2019 が開催されなければ、
平成最後のLTスピーカーということになります。

例年通りだと、PHPカンファレンス福岡は 6月開催なので大丈夫なはず!
ですよね?次期委員長

ということで、簡単に、登壇内容について書かせていただきます。
(スライド上げないので。)

発表内容

タイトル: PHPerが1年間機械学習勉強した
内容:
- TensorFlow というライブラリの紹介
- 機械学習界隈では、驚くような勢いで論文が出ているということの紹介
- TensorFlow.js の紹介 (<- 一番大事!)
- デモ(Reptile)
- デモ(PoseNet)

という流れでした。

デモに関しては、

blog.openai.com

と、

PoseNet - Camera Feed Demo

という2つのWebサイトのものを使わせていただきました。

Reptile に関しては、少しカスタマイズしたものを

github.com

においてます。
まだjQuery 使ってるの? みたいなツッコミお待ちしてます悲

以上が発表内容でした。
ちなみに、応募するときに、 - 45分 - 30分 - 15分 - LT みたいなのを選択する枠(複数選択可)があるのですが、
今回自分は 30 分と 15分と LTにチェックを付けました。
そしたら、ギリギリ LT に滑り込めました。
念の為LTにチェックを付けておくのおすすめです! (これは、 ペパボの @k1LoW さんから習った)

以降、スピーカー・スポンサー・スタッフの前夜祭からFusicという会社で開催されたAfter Hack までの様子を
ちらほら書いていきます。

スピーカー・スポンサー・スタッフの前夜祭

前夜祭

料理がとても美味しかったり、
普段からお付き合いさせていただいている会社の方とじっくり話せたりして、
とても楽しかったです。

エールズ

2次会はいつもどおりエールズでした。
東京でお世話になった方たちにいっぱい会えたり
@youukkariさんからメルチャリ便利話を聞いたりして
大満足でした!
近い内にマグロ食べに行きましょう!

とても楽しい前夜祭でしたが、
特に初めてお会いした方とあまり話せなかった印象です。
自分が人見知りだからでしょうが。。。
ぜひ、積極的に声かけてください!w

一番の成果は、@tanakahisateru さんと初めてお話したことです。たぶん。
全く話したことないのに気軽に話しかけてすいませんでした。

その後、 @kis さんに連れられてもぐおれに行く人々を見送って、
F社の人だけで3次会したのは内緒です。
まー、そこそこ、いや、とても熱い話ができたのでそれはそれで楽しかったです。

当日

当日は、少し遅れて会場入りしました。
実は会社にPC等を置いていたので、
メルチャリで会社に出社して地下鉄でFFG入りというプランを立てていました。
が!!!
残念ながらメルチャリと自分の相性が悪く乗ることができませんでした。

会場についてからは、ブースの方回ったり、色々おしゃべりしたりしていました。
最初のセッション見逃したのは内緒です。

skaffold を使って Kubernetes してみた

見に行きました。
k8s を全く使ったことがなかったのでところどころ難しかったです。
が、Ask The Speaker で聞きに行って、
なんとなく概要を理解することができました。
ATS でディスカッションしたことを先週会社で試してみたのですが、
今の自分達の用途にはうまくマッチしなさそうだったのが少し残念でした。

【プラチナスポンサーセッション】Fusic n本の矢 〜生きた集合知の作り方〜

土星が盛り上がってた印象でした。

【ゴールドスポンサーセッション】「未経験からの挑戦!超速ネイティブアプリ開発

知見がない中、Dartで記述する Flutter というフレームワークを使ってネイティブアプリを開発した話でした。
主な感想は、
- チャレンジャー精神半端ない
- PHP関係ない
でした。
とてもおもしろかったです!

昼休み

天下一品に行きました。
美味しかったです。
あと、ヨーギラス捕まえてました。
進化させるのを忘れてたのだけが心残りです。。。。

SOLIDの原則ってどんなふうに使うの?オープン・クローズドの原則編 拡大版

とても丁寧な解説で、わかりやすかったです!
自分は圧倒的に後輩くん立ち位置なので、
あんな感じの良い質問して先輩を困らせていこうと思いました!w

裏になっちゃった "Event Sourcing, CQRS For PHP" もとても聴きたかったです。
ビデオ上がるの楽しみにしていますw

【プラチナスポンサーセッション】ロリポップ!マネージドクラウドを支えるコンテナ技術のすべて

実はこの発表見てないんですよ。
ただ、僕にとって重大な発表でした。
なぜなら、
自分がやるデモを ロリポップ!マネージドクラウド からホスティングすることを思いついたから!
この発表を聞かなかったら思いついていなかっただろうし、
これより後で思いついても時間の関係で無理だったと思うので、
助かりました!!

Phoenix + Reactで社内システムを密かに作ってる

難しい話でした。
ただ、登壇者の方が淡々と語ってたのが面白かったです。
あと、登壇者の方の左胸に sigfy シールが貼ってあったのが印象的でした。

PHPerのためのよくわかるCPU脆弱性解説

PHP語で語られていたのでわかりやすかったです。 あと、おまけコーナーの CPU の話とかが面白かったです!
ちょっと勉強してみたくなりました!

ちなみに、裏では @rina さんがやらかしてたらしいので、
そのセッションも見たかったです ><
動画上がりますように!w

LT

LT は、"社内SEは(VBAを投げ捨てて)PHPの夢を見るか?初級 - For Beginner" が全てだったように思います。
自分も職を失ったり投げ捨てたりしたらLTするので、そのときは拾ってください泣

懇親会

LT で機械学習の話をしたら、本職の方から声をかけていただきました。
少し業務形態は違いますが、だいぶすごい業務をされていました。
先日あった DLL 1周年記念行事のときに探したけど、見つけられませんでした。
また機会があったらお会いしましょう!

あと、加賀澤さんの悔しそうな顔が脳裏から離れませんw
ちなみに、加賀澤さんの周りで話してた マイクロソフト社の話、めっちゃ面白かったです!

2次会

中洲ハイボールに行きました。
そうだいさんやP山さん、うずらさんとお話しました。
P山さんはじつは去年もお会いしたんだけど、おそらく覚えられてなかったからお話できて嬉しかったです。
そうだいさんは、怖い人かと思ってたけど、あまり怖い人ではなかったです。

エールズ

その後、エールズに行きました。
エールズでの衝撃は、@yui_tang さんとお会いしたことでした。
会ってそうそう当日朝のメルチャリの不満ぶちまけたりしてすいませんでした。
色々なお話が聞けて超楽しかったです。

ラーメン

エールズでうんちしてたらほとんど人がいなくなっていました悲
同じく置いていかれた@hamaco @ichikawa_0829 前田さん(弁護士(嘘)) とラーメン屋を探すたびに出ました。

ここからが大変。
元祖は嫌だとかshinshin は昨日食べたとか言われ海鳴まで歩くも長蛇の列。。。
風び は閉店、大砲ラーメンも閉店と不運が続いて、
結局たどり着いたのは 鳳凛。
4km ぐらい歩いたんじゃないかなー?w

まあでも、一応ご満足いただけたようなので、良かったです。
今思ったけど、一幸舎行けばよかった。

After Hack

11:00 開始だったのに余裕の遅刻を噛ましてしまった。。。
11:30 頃到着。
それから電源ない問題とかをくぐり抜け、ちょっと開発。
@tenkoma さんや @s_kozo さんと CakePHPの話とかしつつ、
皆さんのLT を聞く。

うずらさんの発表では、Swoole という全く聞いたことがない PHP のエクステンションのことを教えてもらいました。
Guzzle との違いとか調べると言っていたので、一応調べました。
ベンチマークとかろくにとったことないので、調べ方が正しいかどうかわかりませんがw

qiita.com

@mao_sum のLT再演なんかもあったりして、超盛り上がりました!
そういや、まだ .phpstorm.meta.php 調べてないので、明日調べます!

そんなこんなで、無事無限ビールを達成して解散。
こうして僕のPHPカンファレンスは無事幕をおろしたのでした。

雑記

以上、僕の PHPカンファレンス福岡 を書かせていただきました。
何文字書いても書ききれないところばかりであります。
お話したのに書けていない方も多くいらっしゃいます。
文句行ってもらえたらラーメン奢るので許してください。

スタッフの方々、今年も開催していただきありがとうございました!
とても楽しかったです!
嬉しいことに来年の開催が発表されたので、
来年は自分もスタッフとして参加させていただこうと思っている所存であります。
スタッフへの応募方法とかわからないけど、たぶん時期が来たら教えてもらえるはず。。。
その際はよろしくおねがいします!

f:id:adiboy:20180624224503j:plain

宣伝

6/30 に PyCon Kyushu 2018 を LINE Fukuoka さんで開催するので、
暇な人はチケット買ってください!
僕の発表より圧倒的に面白い話が聞けます!
また、Python でWeb やってる人の話とかも聞けます!
おすすめです!
応募は こちら から!

DeepLab V3 をADE20K のデータセットでトレーニングする際にハマったこと

DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs を手元で動かしてみました。

実装は、 Tensorflow 公式 に公開されています。

ADE20K のデータセットを使うためのREADME.md はこちら。
github.com

こんな感じで、とても親切にコードとドキュメントを準備いただいているのですが、
一つだけ、致命的ではないですが一つだけ漏れがありました。

それは、

cd /path/to/dataset/ && python build_ade20k_data.py 

を実行すること。
これについての言及が一切ない。

おかげでけっこうハマリました。

ちなみに、

marunouchi-tech.i-studio.co.jp

の記事を参考に VOC2012 のデータセットで試した時は特に問題は置きなかったので、
ADE20K のデータセットを使う時のみ発生する問題なんじゃないかな? と思っています。

実はまだ学習を回せてない(リソースの都合上)ので、正確には解決に至ってはいません。
このやり方で問題なく学習・評価等ができたら、
README 修正のPR でも書こうと思います。