RのWeb制作

Webサービス制作のための技術情報を。

Python データサイエンス

[社内コンペ] 細胞画像認識 2019/01/15版(未完成)

投稿日:2020年1月16日 更新日:

これは何?

某社で行われている社内コンペのメモです。私の備忘録でもあります。

結果:3月末だそうです
現在の精度:63%(01/15)
記事としては未完成ですが、ある程度は記載しています。

今回の目的変数

「画像が何にカテゴライズされるか」の3値分類問題です。

回答は、
・通常細胞
・変性細胞
・変性細胞(悪化型)
とよくある形です。

今回の評価指標・ベースレート

Accuracy(精度)です。

導入の意味も込めてAccuracyだそうです。
普通なら複合指標による評価が妥当とされています。
Precision(適合率:真の陽性をいかに漏れなく見分けられたか)やAUC(認識性能の高低を表す)、MAP(Mean Average Precision、Precisionの応用)などなど。

ベースレートはaccuracy60%です。

今回の説明変数の特徴

画像

訓練に使用できるのは1,200画像

 極度に少ないです。
 通常10万~とある場合が多いのですが、今回はこの制約下で行います。
 ただし、カラー写真ですので染色等での色の変化(非常に重要)は確認できます。

見分けるのに訓練が必要

 「変性細胞である」とは見てわかるのですが、「悪化している」かはわかりません。
 * 一応生化学系の修士→製薬会社に居たのである程度は…他の人はわからないそうです。
 そのために本を実家から取り寄せ&知り合いのおすすめを新規購入しました。

分け方が雑

 画像を確認したところ、採取部位別にデータがまとまっているわけではないようです。
 なぜなら通常細胞の形がそもそも違うとひと目でわかりました。

 一般的に組織ごとに細胞の形は異なりますし、それらが変化した変性細胞も見た目が異なります。
 細胞への症状としては、核の膨張や(免疫機構の攻撃による)細胞の生死が確認できました。

 問題としては画像の中心に変性細胞がなかったり、写っている細胞数がごく少なかったり、同じ細胞を回転させただけで撮っている可能性がある写真も確認できました。

今回の目標

コピペしない。
画像認識の良い解決法を見つける。

ある程度個人で古典的な画像認識から深層学習を学んでいたので、どんな手法があるかなどは少し分かる状態でした。
Kerasなどの説明書をメインに、解説書(Kaggle等のDiscussion含む)、論文を見てモデルを構築します。

今回行った作業の流れ

まだ詳細に書いていないので概要だけ…。

画像を見る

当たり前ですが、最初に画像を確認しました。
難しいポイントは何かアタリを付けましょう。

自作Sequentialモデルを作成

よくあるConvを重ねただけの単純なモデルを作成しました。(精度30%)

学習済みモデルのファインチューニング(1)

これもよくあるVGG16を〇〇層付近でファインチューニングしました。

学習済みモデルのファインチューニング(2)

Xceptionを〇〇層付近でファインチューニングしました。

評価指標の変化を確認

ここまでで3モデルを作成しました。
・自作簡易モデル
・VGG16ファインチューニング
・Xceptionファインチューニング

それぞれ、Trainのloss(損失関数)とaccuracy(精度)と比べTestがどれくらい離れていたか、
Testと回答の精度とどれくらい離れていたか確認しました。

基本的にファインチューニングを行うようなモデルは表現力が高い(意訳:色々と細かいところまで学習できる)がゆえに過学習しやすいので、Testと回答の精度が離れがちです。
そのため、どのモデルがTestで見える見た目の精度と回答の精度が近いか確認しておきます。
その後、
予測に使うDense層の前にDropOut層を追加すること
画像数の水増し(Data Augmentation)
などを検討します。

適切に評価できる状態を作らない限り、改善が実際に進んでいるか全然わからなくなります。
暗闇の中で歩いている状態になるので、評価体制はしっかり作りましょう。

基本的に最新のモデルになればなるほど最終的な精度は高くなりやすい傾向にあります。
最新のモデルは下記などで検索可能です。
State of The Art…Image Classification on CIFAR-100
レビュー論文と言って、論文をまとめた論文があるのでそちらで検索も非常に早いです。
下記は2017年時点のレビュー論文です。
Deep Convolutional Neural Networks for Image Classification: A Comprehensive Review

英語が苦手でも大丈夫。
ページごとGoogle翻訳するか、PDFはGoogleDriveに保存してDocumentで開くとテキスト化できます。

実装可能モデルで良いモデルを1つ確立

(以下は予定です。)
Xceptionをはじめ、Kerasで実装できるもので精度70%程度を目指します。
DropOutの強さ、結合層(全結合層やGlobalAveragePooling)の検討をします。

最新のモデルの自作

 Kerasでよく使われるSequentialモデルではなく、直線ではない構造を作ることができるFunctional APIを使用し、旧モデルから最新モデルを作成します。
 拡張できるかどうかの確認と、学習のため。
 アンサンブルを作成するときにも使います。

画像水増し

下記のように画像に加工を加える方法があるので、それぞれ試します。
・ノイズを加える
・平滑化する(ガウシアンフィルタ)
・明度・彩度の調整
・グレースケール化
・ImageDataGeneratorの改良

1,200画像データから適切に学習するのは非常に難しいので、いろいろな角度から画像を学習できるようにします。

画像水増し適応用モデルの作成

上記に対応できるモデルを作成します。
グレースケール化であるとRGB3色から白黒1色になるため、一般的なモデルのファインチューニングは困難になる・・・のか?
(RGBからグレースケールへの計算式は存在するので変換は可能か?)

アンサンブルモデルの作成

いろいろな視点を持ったモデルと、最新モデルをアンサンブルしたモデルを作成します。
モデルの出力をConcatenateすればいいと思っているが、実際どうなのだろうか。

未検証

画像を大きくすると精度は上がるのか?(フルカラーの写真のため。データ量爆発しそう)
pythonのモジュールの改良(エラーがどうすれば出るのか等)
ガウス?でモデルの適正さ?を計算し、アンサンブルの重み付けを最適化できるらしい(未確認)
輝度勾配ヒストグラムを局所特徴量として扱うことができる(普通画素のみだが)

とりあえず今はここまで

コード

それぞれの作業に従って、あとで書きます。

完成は3月末になる予定。

-Python, データサイエンス

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

[python]MNISTの学習モデルを保存し、テストする

機械学習のHello World的なMNISTにて、学習モデルを保存し、実行する際のメモ。 用意するもの PC コマンドプロンプト インストール(python、sklearn、numpy) 学習時のコ …

手書き数字診断士(機械学習)を作り始めました

Python(Flask)+機械学習の勉強がてら、「手書き数字診断士」を作っています。 元ネタは2chの中小企業診断士です。 「う~ん、これは中小企業!w」 やること 1・index.html  1. …

[Meisyo] 練習の不均衡是正

練習に不均衡が生じているので、アップデートで改善します。 ちなみに練習の方法自体を変更しようと思っています。 すぐには実装しません。(案が固まっていないです) 基本的に平均が150より大幅に高い(また …

pythonでシグモイド関数と階段関数の表示

ディープラーニング目指して初心者は今日も行く。 初見じゃ何もわからない初心者です。 シグモイド関数?階段関数??なにこれ。 シグモイド関数! 階段関数! 目で見たらわかりますね! コード シグモイド関 …

【社内コンペ】回帰分析メモ 完全版

これは何? 某社で行われている社内コンペのメモです。私の備忘録でもあります。 結果:1問差で2位でした。残念。 今回の目的変数 建築物の坪単価 ※「え、建物の単価じゃないのか」と思ったあなたは正常。 …