Pythonを使って内視鏡動画からフレームごとに画像を抽出して保存

内視鏡動画を読み込んでフレームごとに画像として保存

内視鏡動画に対して、アノテーション画像をつくったり学習させたモデルで病変を検出したりしたいことは多いと思います。ここでは、そのようなときに必須である動画から画像を取り出す方法について紹介します。

なお以下の例では内視鏡画像として、"HyperKvasir"のものを利用しています。

お持ちのデータを利用する場合はファイルの読み込みの箇所を変えるといったように適宜修正してお使いください。

必要なパッケージのインストール

今回使用するOpenCVはColabにデフォルトでインストールされているので、特に追加でインストールするパッケージはありません。

内視鏡動画のダウンロード

すべての動画をダウンロードしようとすると、25GBもあるので結構時間がかかる上にColab上では大きすぎて解凍できません。

今回はお試しに1ファイルあれば十分なので、別途ダウンロードしてきたものをColabに読み込みましょう。

HyperKvasirのファイルは"https://osf.io/mh9sj/"からすべてのファイルを見ることができるので、ここからどれか1つ選んでダウンロードしてくるのがおすすめです。

以下の例では、

labeled-videos>lower-gi-tract>pathological-findings>polyps

の1番上のファイル"0220d11b-ab12-4b02-93ce-5d7c205c7043.avi"をダウンロードしてきたとして進めます。

もちろん、今後使うことを考えて"hyper-kvasir-labeled-videos.zip"をダウンロードしてきて、そこから好きなのを選んでも大丈夫です。


動画のダウンロードの仕方

ファイル名の横にある「・・・」を押して、"Download"からそのファイルをダウンロードできます。

アップロードしたファイルの確認

今回はホームディレクトリ直下に動画ファイルをアップロードしています。

Googleドライブから読み込む場合などは適宜画像ファイルのパスを変更してください。

ホームディレクトリ直下にアップロードした場合は下記のコマンドを実行すると、アップロードした動画ファイルが表示されるはずです。

!ls

内視鏡動画からフレームごとに画像として保存

ここでは、"img_動画名"というディレクトリを作ってそこに画像を保存していくことにします。

画像を保存するときの名前は「フレーム数(5桁).jpg」とします。

import os
import cv2

file_video = '0220d11b-ab12-4b02-93ce-5d7c205c7043.avi'
dir_save = 'img_' + file_video.replace('.avi' , '')

# 保存用ディレクトリを作成
os.mkdir(dir_save)

# 動画ファイルの読み込み
cap = cv2.VideoCapture(file_video)

# フレーム数を取得&確認
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
print('総フレーム数: ', frame_count)

# フレームごとに画像を保存
for i in range(frame_count):
  # フレームを取得
  ret, frame = cap.read()

  # 画像を保存
  cv2.imwrite(f'{dir_save}/frame_{i:05}.jpg', frame)

# キャプチャを閉じる
cap.release()

保存名のフレームの桁数を変えたいときは"i:05"の5を好きな桁数に変えてください。

保存ディレクトリの圧縮

基本的に動画を画像として保存すると、画像枚数が多くなると思います。

ダウンロードしやすいように、保存先ディレクトリを圧縮してzipファイルをダウンロードするのがおすすめです。

!zip -r img_0220d11b-ab12-4b02-93ce-5d7c205c7043.zip img_0220d11b-ab12-4b02-93ce-5d7c205c7043


以上のコードがすでに記入されたnotebook(.ipynb)を有料部分で公開しております。
Google Colabにアップロードしてすぐ使えるので、よろしければご利用ください。

配布notebookの使い方についてはこちら

他にもこういった記事が読みたい!これを解説してほしい!などご意見がありましたら、アンケートフォームからご意見をいただけるとうれしいです。

ここから先は

0字 / 1ファイル

¥ 100

期間限定!PayPayで支払うと抽選でお得

この記事が気に入ったらチップで応援してみませんか?