概要

「教師データとして使われるデータセットのPersonクラスの画像は通常大人で、立っていることが多そうである一方で、乳幼児は寝転んでいることが多い。このため、乳幼児が写っている画像を回転させて推論を行うと認識精度(confidence-score)は向上するのか」という仮説を検証しました。

乳幼児が写っている公開画像を用意して、一人の乳幼児をクリップした画像に対して様々な回転角で回転させた後に、YOLOXの推論をかけて予測の信頼度がどのように変化するのかの実験を行いました。

物体検出器はYOLOXを採用しています。

環境はGoogle Colaboratoryです。

YOLOXについて

YOLOXは2021年に公開された物体検出器で、YOLOXのREADME.mdを参照するとYOLOv5を超える性能を持っていることがわかります。

LICENCEもMITと使いやすいLICENCEが採用されています。

YOLOXのセットアップ

以下のコマンドにしたがってYOLOXをセットアップしていきます。
今回事前学習の重みはyolox_s.pthを使います。

Google Colaboratoryのランタイムのタイプを変更よりハードウェアアクセラレータの項目でGPUを選択し、コードセルで以下のコマンドを実行します。

!git clone https://github.com/Megvii-BaseDetection/YOLOX/
%cd YOLOX
!pip install -v -e . 
!wget https://github.com/Megvii-BaseDetection/YOLOX/releases/download/0.1.1rc0/yolox_s.pth

Preprocess

利用させていただく元の画像は以下の画像になります。

出典:雑貨&カフェ momo「5/19第一善隣館保育所様夢ステーションでベビーマッサージ、5/26ピーチクラス開催しました♪」

この画像に対して、一人の乳幼児にフォーカスしたクリップを画像を作成し、様々な回転角で回転させる前処理を適用します。

Clip

一人の乳幼児にフォーカスして精度の推移を確認したいため、手動でトリミングを行いました。

Rotate

OpenCVという画像処理ライブラリを用いて画像を回転させます。
今回は10度ずつ回転させて、0度~350度に回転させた画像を36枚生成します。
角度の情報はangleという変数に格納され、getRotationMatrix2D関数とwarpAffine関数を組み合わせて画像を回転させます。

import cv2
import numpy as np

img_path = <path/to/image>
img = cv2.imread(img_path)
assert img is not None
h, w = img.shape[:2]

angle = 0
while True:
    angle = (angle + 10) % 360
    a = np.radians(angle)
    w_rot = int(np.round(w*abs(np.cos(a)) + h*abs(np.sin(a))))
    h_rot = int(np.round(w*abs(np.sin(a)) + h*abs(np.cos(a))))

    M = cv2.getRotationMatrix2D((w/2,h/2), angle, 1)
    M[0][2] += -w/2 + w_rot/2
    M[1][2] += -h/2 + h_rot/2

    img_rot  = cv2.warpAffine(img, M, (w_rot,h_rot))
    cv2.imwrite(f"<path/to/preprocessed_dir>/{angle}.jpeg", img_rot)

    if angle == 0:
      break

36枚の画像を連続して表示してみると以下のgif画像のように10度ずつ回した画像を生成できていることが確認できます。

Inference

上記のコードで前処理された画像が1つのディレクトリに格納されている状態で、YOLOXの推論可視化コードdemo.pyを動かします。

!python3 tools/demo.py image -c ./yolox_s.pth -f exps/example/custom/yolox_s.py --path <path/to/preprocessed_dir> --conf 0.25 --nms 0.45 --tsize 640 --device gpu --save_result

予測結果は特に設定していなければ./YOLOX_outputs/yolox_s/vis_res/{日付}_{時間}/に予測結果が可視化された画像が保存されています。

Google Drive配下にYOLOXのリポジトリをCloneしていない場合は、Google Colaboratoryのセッションが切れると消えてしまうので、copyコマンドでGoogle Driveに持ってきます。

!cp -r ./YOLOX_outputs/yolox_s/vis_res/{日付}_{時間}/ /content/drive/MyDrive/<path/to/output_dir>

Result

結果を確認します。

10度ずつ回転させて見ると、頭が上・足が下になるように回転させるほど、Confidence-Scoreは向上し、逆に頭が下の方に向いているような画像はCondidence-Scoreの低下だけでなくBoundigBoxもうまく予測できていないことがわかります。

以下の画像は頭が上にきていて、一番体が垂直になっている画像の例です。

一方、頭が下にきている画像はわかりやすく不安定な予測になっています。

体が横向きになっていても予測はできていますが、やはりConfidence-Scoreは低く出てしまします。

まとめ

今回は、「乳幼児が写っている画像を回転させて推論を行うと認識精度(confidence-score)は向上するのか」という仮説を検証しました。

保育園に固定カメラを設置する際には、カメラに写る乳幼児の画像は、頭が上にくるような前処理をかけた状態で深層学習モデルに入力すると安定した精度が出る可能性があります。
また、データセットのPersonクラスにそもそもの乳幼児の画像が圧倒的に少ない可能性はあるので、アノテーションを行ってTrainingに組み込むと乳幼児の物体検出精度が向上する可能性があります。


作者・著者

岩崎学園 IoTゼミ 橋本俊甫さん

Appendix

カテゴリー: Blog