ライフサイエンス画像解析カジュアルハッカソン!
2017年7月26日に行われた「ライフサイエンス画像解析カジュアルハッカソン!」(https://goo.gl/9mjwfc)
に参加しましたので,イベント概要および感想を投稿させて頂きます.ハッカソンの雰囲気やKerasを用いたニューラルネットの構築に興味がある方はぜひ一読してみて下さい.
に参加しましたので,イベント概要および感想を投稿させて頂きます.ハッカソンの雰囲気やKerasを用いたニューラルネットの構築に興味がある方はぜひ一読してみて下さい.
筆者のレベルは? どんな人が参加しているの?
まずは筆者の自己紹介および画像解析のレベルを述べます.筆者は薬学系研究科に所属しており,研究室に配属されてからは,ケミカルバイオロジーと呼ばれる分野で研究活動を行っています.研究室には画像解析の専門家はおらず,画像解析を学ぶ機会は全くありませんでした.
しかし,4ヶ月前に「東大人工知能学生団体HAIT」というサークルに入り,それから毎日コツコツと機械学習や画像解析についての勉強を行っていました.その成果を試してみたくハッカソンに挑戦してみました.因みにハッカソン参加時の筆者のレベルは,
・Pythonの基本的な構文が書ける
・Numpy・Pandas・OpenCVなど一部ライブラリが使用できる
であり正直かなり不安でした.
本ハッカソンには,お医者さん・学部生・ライフサイエンス研究者など,多種多様なバックグラウンドを持つ人たちが集まっていました.機械学習や画像解析を専門にしている人は少なく,筆者のように独学で勉強している人が多いという印象を受けました.しかし各チームに少なくとも1人は専門の方が割り振られており,どのチームも円滑にお題に取り組めていました.
機械学習や画像解析を専門にしている方は,LPixelエンジニアの方と接するまたとない機会ですし,専門外の方でも十分に楽しめる非常に有意義な会でした.
しかし,4ヶ月前に「東大人工知能学生団体HAIT」というサークルに入り,それから毎日コツコツと機械学習や画像解析についての勉強を行っていました.その成果を試してみたくハッカソンに挑戦してみました.因みにハッカソン参加時の筆者のレベルは,
・Pythonの基本的な構文が書ける
・Numpy・Pandas・OpenCVなど一部ライブラリが使用できる
であり正直かなり不安でした.
本ハッカソンには,お医者さん・学部生・ライフサイエンス研究者など,多種多様なバックグラウンドを持つ人たちが集まっていました.機械学習や画像解析を専門にしている人は少なく,筆者のように独学で勉強している人が多いという印象を受けました.しかし各チームに少なくとも1人は専門の方が割り振られており,どのチームも円滑にお題に取り組めていました.
機械学習や画像解析を専門にしている方は,LPixelエンジニアの方と接するまたとない機会ですし,専門外の方でも十分に楽しめる非常に有意義な会でした.
ハッカソンのお題は?
本ハッカソンでは,細胞画像の分類を行いました.与えられた訓練用の細胞画像には,「観察した時刻:t」と「z軸方向の位置:z」の情報がラベルづけされており,これを元にラベルがついてない画像に対してtとzを予測するというお題が課されました.
Kerasで初めてニューラルネットを構築した!
出されたお題に対して筆者のチームが取った戦略は次の2つです.①KerasでCNNを実装する.②特徴量を抽出しSVMで分類する.筆者はこれまでにニューラルネットを構築した経験がなかったが今回,チームのメンバーの助力を得て,初めて実装することができたので解説を行います.
画像の前処理,特に画像の水増しに関しては,Deep learningで画像認識⑦〜Kerasで畳み込みニューラルネットワーク vol.3〜 (IMACEL ACADEMY内の記事) を参考にしたので,そちらを参照していただきたい.KerasでのCNN構築コードは以下に記載しました.
前処理およびCNN構築の際に注意・工夫した点は,
・計算時間を短縮するため425 × 434の画像を100 × 100にした
・正規化しないと学習が進まない
・二値分類であるので,最後の出力を "softmax" でなく "sigmoid" にした
訓練データで学習させた結果,accuracyが95%以上と,良い学習器ができました.
前処理およびCNN構築の際に注意・工夫した点は,
・計算時間を短縮するため425 × 434の画像を100 × 100にした
・正規化しないと学習が進まない
・二値分類であるので,最後の出力を "softmax" でなく "sigmoid" にした
訓練データで学習させた結果,accuracyが95%以上と,良い学習器ができました.
from keras.models import Sequential from keras.layers import Dense, Activation, Dropout, Flatten from keras.layers import Conv2D, MaxPooling2D from keras.optimizers import RMSprop from keras.callbacks import EarlyStopping, ModelCheckpoint from keras.preprocessing.image import ImageDataGenerator nb_filters1 = 32 # 畳み込みフィルタ1の数 nb_filters2 = 64 # 畳み込みフィルタ2の数 nb_conv1 = 3 # 畳み込みフィルタ1の縦横pixel数 nb_conv2 = 2 # 畳み込みフィルタ2の縦横pixel数 nb_pool = 2 # プーリングを行う範囲の縦横pixel数 nb_epoch = 30 # 最適化計算のループ回数 batch_size = 32 # 計算効率化のために分割した1グループに含まれるデータ数 img_rows = 100 #入力データの縦ピクセル数 img_cols = 100 #入力データの横ピクセル数 model = Sequential() model.add(Conv2D(nb_filters1, (nb_conv1, nb_conv1), padding="same", input_shape=(img_rows, img_cols, 3))) model.add(Activation("relu")) model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool))) model.add(Conv2D(nb_filters2, (nb_conv2, nb_conv2), padding="same")) model.add(Activation("relu")) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Flatten()) model.add(Dense(256)) model.add(Activation("relu")) model.add(Dropout(0.5)) model.add(Dense(1)) model.add(Activation("sigmoid")) model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy'])
CNNの構築.py
今回用いたのは簡単なCNNのネットワークですが,より複雑にすることで,精度向上が期待できます.