過去のKaggleコンペに挑戦し始めて早数週間が過ぎようとしている。数々のエラーメッセージを乗り越えてきたおかげで、だいぶん精神力も鍛えられているように思う。過去の記事ではエラーとその対処法のみを述べてきたが、ここで一度何をしようとしているのかをおさらいしておこうと思う。
SIIM Covid-19 detectionコンペティションでは、患者の胸部CT画像を元にCovid-19の感染有無を機械学習を用いて行うことにチャレンジしている。一般的にCovid-19の診断にはPCR検査を用いることが多いが、PCR検査では結果を得るのに数日を要することがあるため、他の方法はないかと模索しているということだろう。現在でもCT画像を用いた診断はできないことはないようだが、当然ではあるが十分に訓練と経験を持った医師による視診が必要になる。感染者数が多い状況下でこの方法を主にするのは現実的ではないので、機械学習の力を使えないかと思ってコンペティション化したというわけだ。
学習用には3つのデータが与えられている。1つは胸部CT画像で、Covid-19感染者と非感染者の画像が与えられる。各患者につき画像は1枚であり、DICOM形式という形式で保存されている。これは医療用データではよく使われる形式らしい。次に各患者に対する感染状況である。これはcsv形式で与えられており、患者の状態は感染なし、Covidの症状あり、不明、なんらかの異常ありの4つの状態に分類される。最後にバウンディングボックスの情報である。CT画像に何らかの異常が疑われる場合、被疑箇所を長方形のボックスで示すものである。
テスト用にはCT画像のみが与えられている。課題はこのCT画像を使って患者の状態を4つの状態のうちどれに分類されるかを予測し、さらに異常に分類される場合にはバウンディングボックスの座標を予測するというものだ。
これは一般的には物体検知と分類と呼ばれるタスクである。これらのタスクに対して有効なモデルがいくつか存在して、まずはそれらをファインチューニングしてベースラインのモデルを作るのがセオリーらしい。前置きが長くなったが、今回やりたいのはこれら両方のタスクをこなすことができると言われるEfficientDetをファインチューニングすることだ。
ちなみに先日、ようやくモデルの学習をエラーなく完了することができた。プログラム全体については近いうちにブログにするつもりだ。
ただし、エラーなくプログラムが動いたとしても油断ならんという事態が起こったので、バグ対処ブログとしてこの事態について書いて本日は締め括ろうと思う。
予測されたバウンディングボックスに違和感
与えられた学習用のCT画像にバウンディングボックスを重ねると、概ねどちらかもしくは両方の肺の位置を示す。
(実際のデータはKaggleコンペティション用にのみ使用可能のため、ここではイメージ図を載せています。©dak)
で、学習済のモデルが出力したバウンディングボックスがこちら。
もちろんエポック1周分しか学習していないので、正確な出力を期待していたわけではないが、どうにも向きがおかしいように思う。
その原因はどうやらeffdetモデルへの正解バウンディングボックスの入力にあった。こちらのeffdet作者への質問と回答によると、effdetに正解バウンディングボックスを入力する際は、座標を次のようにyxyx形式で入力する必要があるらしい。
(y0, x0, y1, x1)
# x0, y0: バウンディングボックス左上のx, y座標
# x1, y1: バウンディングボックス右下のx, y座標
正解として間違った情報を入力しているのだから、予測結果に違和感が生じるのは当たり前である。effdetへの入力値を直したところ、バウンディングボックスの予測についてはかなりの高精度な出力を得ることができた。
ちなみに、入力値を修正した時に間違えそうになったのが、座標を入れ替えるタイミングである。画像データを使ったタスクの際には学習前に画像データにリサイズや切り取りなどの処理を施すことが多い。今回の場合、Albumentationsというライブラリを使ってリサイズを行っている。そしてこのライブラリは画像をリサイズする際、画像に合わせてバウンディングボックスの値も修正してくれる。このとき、Albumentationsへのバウンディングボックスの入力は通常のxyxy形式、effdetはyxyx形式と、座標の保持の仕方が異なる。したがって、座標の入れ替えをAlbumentationsへの入力前に行ってしまうと、新たなエラーを生むことがあるので注意が必要だ(バウンディングボックスの座標が画像の外を指すとエラーを返すようになっている)。
総じて、今回もまたいい教訓を得た。プログラムがうまく動いたとしても、今度は学習用の画像と、それに対する予測をきちんと比較して、あまりにもおかしい予測をしていないかを確認した方がよい。