このシリーズでは物体検出でお馴染みの「YOLOv5」を用いて、物体検出の実装を基礎から学ぶことができます。

環境構築から学習の方法、さらに活用方法までをまとめています。

Google colabを使用して簡単に物体検出のモデルを実装することができますので、ぜひ最後までご覧ください。

第6回目は小さなオブジェクトを検出するための手法である、SAHI(Slicing Aided Hyper Inference)について紹介します。

広角の画像において、どれくらい精度が向上するのか実装しながら確認をしていきましょう。

今回の内容

・SAHI(Slicing Aided Hyper Inference)の概要を学ぶ

・SAHIの実装方法を学ぶ

・オリジナル画像から人物の物体検出してみる

SAHIとは

SAHI(Slicing Aided Hyper Inference)は、2022年2月に発表されたスライシング支援推論と微調整により小さなオブジェクトを検出するための手法です。

下に示す画像のように小さな物体に対して精度良く検出することができます。

左の画像はYOLOv5での物体検出の結果です。

手前の自動車は検出ができていますが、画像の奥にある自動車までは検出ができていません。

SAHIを使用することで、右側の画像のように広角の画像の中にある小さな物体まで検出できていることがわかります。

SAHIは、Detectron2、MMDetection、YOLOv5、YOLOXなどのモデルで使用することができます。

SAHIの導入

Google colabを立ち上げて、早速実装していきましょう。

まずはGPUを使用できるように設定をします。

「編集」タブから「ノートブックの設定」の中の「ハードウェア アクセラレータ」を「GPU」に設定。

なお、今回紹介するコードは以下のボタンからコピーして使用していただくことも可能です。

Open In Colab

まずはGoogle ドライブのファイルにアクセスするため、マウントします。

from google.colab import drive
drive.mount('/content/drive')
%cd ./drive/MyDrive
!git clone https://github.com/obss/sahi
%cd sahi

必要なライブラリをインストールします。

!pip install -U torch sahi yolov5

これでSAHIを使用する準備が完了しました。

次に学習済モデルを用意します。

今回はyolov5のモデルを使用します。

from sahi.utils.yolov5 import (
    download_yolov5s6_model,
)
from sahi.model import Yolov5DetectionModel
from sahi.utils.cv import read_image
from sahi.utils.file import download_from_url
from sahi.predict import get_prediction, get_sliced_prediction, predict
from IPython.display import Image

yolov5_model_path = 'models/yolov5s6.pt'
download_yolov5s6_model(destination_path=yolov5_model_path)

合わせてテスト用の画像もダウンロードしましょう。

download_from_url('https://raw.githubusercontent.com/obss/sahi/main/demo/demo_data/small-vehicles1.jpeg', 'demo_data/small-vehicles1.jpeg')
download_from_url('https://raw.githubusercontent.com/obss/sahi/main/demo/demo_data/terrain2.png', 'demo_data/terrain2.png')

以上で準備が完了しました。

SAHIの実行デモ

ここからは SAHIのデモを実行していきます。

比較のため、yolov5を使用した場合とSAHIを順番に試していきましょう。

yolov5の実行結果

まずは通常のYOLOvで実行してみます。

detection_model = Yolov5DetectionModel(
    model_path=yolov5_model_path,
    confidence_threshold=0.3,
    device="cpu", # or 'cuda:0'
)

result = get_prediction(read_image("demo_data/small-vehicles1.jpeg"), detection_model)
result.export_visuals(export_dir="demo_data/")
Image("demo_data/prediction_visual.png")

yolov5での結果が表示されました。

冒頭でも紹介した通り、道路の奥の方に向かって検出できない自動車が増えていることがわかります。

SAHIの実行結果

次にSAHIを使用して実行してみましょう。

result = get_sliced_prediction(read_image("demo_data/small-vehicles1.jpeg"), 
                               detection_model,
                               slice_height = 256,
                               slice_width = 256,
                               overlap_height_ratio = 0.2,
                               overlap_width_ratio = 0.2)
result.export_visuals(export_dir="demo_data/")
Image("demo_data/prediction_visual.png")

結果が表示されました。

先ほど比較すると、道路の奥の方まで小さな物体でも検出できていることがわかりました。

オリジナル画像

次にオリジナル画像でも試していきます。

まずは画像を「SAHI/demo_data/」にアップします。

アップしたら、先ほどと同様に実行します。

yolov5の実行結果

まずは通常のYOLOv5による検出です。

result = get_prediction(read_image("demo_data/test2.png"), detection_model)
result.export_visuals(export_dir="demo_data/")
Image("demo_data/prediction_visual.png")

SAHIの実行結果

次にSAHIによる検出です。

result = get_sliced_prediction(read_image("demo_data/test2.png"), 
                               detection_model,
                               slice_height = 128,
                               slice_width = 128,
                               overlap_height_ratio = 0.2,
                               overlap_width_ratio = 0.2)
result.export_visuals(export_dir="demo_data/")
Image("demo_data/prediction_visual.png")

一部誤検出があるものの、細かな箇所まで検出ができていますね。

まとめ

最後までご覧いただきありがとうございました。

今回は小さなオブジェクトを検出するための手法であるSAHIについて紹介しました。

広角の画像の中にある小さな物体まで検出できるようになったことで、物体検出技術の活用の幅が広がりそうですね。

コメントを残す