(「AI課題2:AIで生菌数をカウント(1)」の続きです。)
まず比較的簡単にできそうな「(2) 既存の自動カウンタのアルゴリズムの前処理としてディープラーニングの学習結果を使う場合」について考えることにします。
ディープラーニングを利用して寒天培地の生菌数を自動カウントする予定ですが、その前にOpenCVを利用して既存のアルゴリズムでどこまでカウントできるか検証するためにサンプルプログラムを作成してみました。
基本的にはOpenCVの輪郭検出機能 findContours を利用してカウントします。
プログラム(言語 Python、テキストファイル UTF-8)
【解説】
培地の写真を入力ファイルとしますが、ファイル名はとりあえず下記のようにプログラム中で固定としています。
ファイルパス 入力ファイル名
FILE_ORG_IMAGE = ‘data/counter/bctimage.jpg’
ファイルパス 出力ファイル名
FILE_CNT1_IMAGE = ‘data/counter/cntiamge1.jpg’
FILE_CNT2_IMAGE = ‘data/counter/cntimage2.jpg’
テストに使った培地の写真。
この培地の写真はテスト用に作成したもので実際に培養したものではありません。
この写真はスマートフォンのカメラで撮影したもので、専用の設備で撮影した写真にくらべて余計な反射や影などが映っている条件の悪い写真です。
実行すると培地の写真を読み込み、ウィンドウにグレースケールで表示されます。
必要に応じて培地の範囲とコントラストを手動で調整します。キー操作は以下のように適当に割り振りました。
・Enterキーで次の処理へ
・Escキーでやり直し
・培地範囲の円 ‘o’ = 大きく ‘c’ = 小さく
・培地範囲の円 中心位置の調整 ’u’ = 上 ‘d’ = 下 ‘r’ = 右 ‘l’ = 左
・コントラスト ‘s’ = 強く ‘w’ = 弱く
Enterキーを押すと二値化された画像がウィンドウに表示されます。
白い領域が抽出されてカウントさてています。
元の画像にもカウント値を入れました。
プログラムではOpenCVの関数で輪郭を検出しています。
cv2.findContours(img_cnt1, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
二値化の閾値の初期値は、平均値+標準偏差の2倍程度に設定してあります。
threshold = int(new_img.mean() + (np.std(new_img) * 2) )
cv2.threshold(img_cnt1, threshold, 255, cv2.THRESH_BINARY)
オープニング、クロージング処理でノイズ除去をしています。
cv2.morphologyEx(img_cnt1, cv2.MORPH_OPEN, None, iterations=iterations_open)
cv2.morphologyEx(img_cnt1, cv2.MORPH_CLOSE, None, iterations=iterations_close)
カウントできる領域の面積の最大最小を設定しています。
list(filter(lambda x: cv2.contourArea(x) > cnt_area_small, contours))
list(filter(lambda x: cv2.contourArea(x) < cnt_area_large, contours))
キー操作は以下のように適当に割り振りました。
・二値化の閾値は ‘+’ ‘-‘ キーで上下
・オープニングは ‘o’ = 増加、クロージング ‘c’ = 増加
・領域サイズ ‘l’ = 最大値を下げる ‘s’ = 最小値を上げる
・Escキーでやり直し
・Enterキーで終了
カウント値はコンソールに表示されます。
count=130
目視で数えた場合は127だったので有効数値2桁と考えるとまあまあな結果となりました。
二値化の画像とカウント付きの元画像は cntiamge1.jpg, cntiamge2.jpg として保存されます。
既存の輪郭検出アルゴリズムを利用した簡単なサンプルプログラムですが、ある程度の成果はあげられていると思います。しかし、培地に映った影・反射光などの問題や培地の淵・コロニーが一部重なっている場合など正確にカウントできていない部分もあります。
ディープラーニングにより解決するべき課題
・解像度・明るさ・コントラストの調整
・光の反射・影などの調整
・泡、ゴミのような余計なものを消去
・コロニーの大きさや色の調整
・コロニーの重なりの補正
これらについては「tensorflow 自動着色 + OpenCV 輪郭抽出で花の数をカウント」や「TensorFlow + OpenCV 植物写真のマスキング」のような考え方で応用きると考えられます。
また、培地の範囲の設定については、培地を認識して自動検出するか、培地の枠を消すなどの学習方法が考えられると思います。
(2022/06/07 Shin Onda)