RのWeb制作

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

Python データサイエンス

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

投稿日: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)の検討をします。

とりあえずXceptionが強そうですね。
最新のモデルはいろいろと調べられるので、1から作ってみたも面白いかもしれません。

最新のモデルの自作

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

画像水増し

下記のように画像に加工を加える方法があるので、それぞれ試します。
・ノイズを加える
・平滑化する(ガウシアンフィルタ)
・明度・彩度の調整
・グレースケール化
・ImageDataGeneratorの改良
→ とはいえ、CNNのフィルタ構造と同じような感じで調整すると意味がないので、その点は気を付けます。

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

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

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

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

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

未検証

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

とりあえず今はここまで

コード

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

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

-Python, データサイエンス

執筆者:


comment

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

関連記事

[Anaconda]Anacondaが動かない!TypeError: expected str, bytes or os.PathLike object, not NoneType

Anaconda Navigatorが起動できません。 昨日まで動いていたのに・・・。 エラー文はこちら TypeError: expected str, bytes or os.PathLike o …

TensorFlow RNNで詰まるの巻

DeeplearningのフレームワークTensorFlowの学習まで漕ぎ着けました。 CNN(画像認識用と言っても過言ではない)はゼロから始めるディープラーニングでだいたいOK。 何度か読み返してわ …

[Python:Predict Gollira]2枚の画像でどちらがゴリラっぽいかを人間が予想する。

「あーこの人ゴリラっぽい。」と思うことはありませんか? ゴリラっぽさってどこから来るんだろうかと悩んでいました。 前回、[Python] ディープラーニングのモデル「VGG16」を使って画像認識をし、 …

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

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

機械学習の勉強から見えた「間違いだらけのAI認識」

「AI」という字面が新聞にもネットニュースにも数多く出てくるようになりました。 ただ、機械学習を勉強してて思ったんですが・・・・AIの定義が曖昧すぎる 内容が書いてある記事も殆ど無いし…。 AIが行っ …