オリンパスが精子の運動性を高精度に算出するAIを開発
今日は、画像からの物体検出するための手法であるフレーム(間)差分について学んでいきましょう。
まずは、オリンパスが11月11日にプレスリリースした以下の記事からどうぞ。
精子の運動性を高精度に算出するAIを開発
オリンパス株式会社(社長:竹内 康雄)は、東京慈恵会医科大学(学長:松藤千弥)と良好な精子の選定作業をアシストする精子判別補助AIの開発を目指して共同研究する中で、精子の運動性を高精度かつリアルタイムで算出することに成功しました。今後は精子の形態を評価するAIの開発に移行し、引き続き、顕微授精作業の負荷軽減と均質化を目指して研究を進めていきます。
情報元:
【解説】フレーム(間)差分
フレーム(間)差分とは
『動画から物体の移動を検知する手法』のことを指します。
物体検知の手法
物体を検知する方法は、多数ありますが、簡単に実装できるものとして以下の手法があります。
- フレーム(間)差分:動画をフレームに分割し、フレーム間の差分を検知する。
- 背景差分:事前に用意しておいた画像との差分を検知する。
- 色域抽出:画像を色空間(RGB,HSV,Lab等)に分割して検知したい物体の特徴色と比較する。
- CAMShift(Continuously Adaptive Meanshift):追跡したい物体を選択し、選択した領域の特徴(色相)を計算、物体が移動した際に画面上で計算した特徴が最も近い場所を物体が移動した場所として追跡する。
- オプティカルフロー:物体が動いたとき、連続するフレーム間では物体の明るさはだいたい同じ、隣接する画素も同じように動くという前提で物体を追いかける。
- Haarカスケード:画像の一部分を切り出し、局所的な明暗差を算出し、予め学習した顔、目、鼻、口などの特徴量と比較する。このとき複数の識別器を用意して順番に判別していく。1つでも識別器が違うと判断したらそこでおしまい。
フレーム(間)差分の実装
フレーム(間)差分をPythonで実装する方法を紹介します。
ライブラリとしてOpenCVを利用します。"pip install opencv-pthon"でインストールします。
Pythonコード
import cv2
# 1.動画のキャプチャ
cap = cv2.VideoCapture(0) # 内蔵カメラ
# cap = cv2.VideoCapture(1) # USB接続カメラ
# cap = cv2.VideoCapture('movie.mp4') # 動画ファイル
# 2.フレーム分割
prev_frame = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY)
curr_frame = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY)
next_frame = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY)
# 3.フレーム間の差分抽出
diff_prev = cv2.absdiff(prev_frame, curr_frame)
diff_next = cv2.absdiff(curr_frame, next_frame)
# 4.フレーム間差分を表示
try:
while True:
# フレーム間差分画像の論理積
diff = cv2.bitwise_and(diff_prev, diff_next)
# 画像を表示
show_image(diff)
# フレームの更新
prev_frame = curr_frame
curr_frame = next_frame
next_frame = cv2.cvtColor(cap.read()[1], cv2.COLOR_RGB2GRAY)
# すべて見終わったら終了
if next_frame is None: break
# なにかキーが押されたら途中終了
except KeyboardInterrupt:
print('Interrupted')
cap.release()