ITや趣味など気軽に投稿しています。

【python】OpenCVで物体検知 – Mask R-CNN

Mask R-CNNは深層学習ベースの物体検知モデルで、物体検出クラス識別セグメンテーションの3つの機能を統合しています。

この記事では、Mask R-CNNの仕組みとPythonでの実行方法を解説します。

Mask R-CNNの概要

物体検出・クラス識別

Mask R-CNNは、入力画像に対して以下の2つの処理を行います。

  • 物体検出: 画像中の「どこに」物体が存在するかを特定する
  • クラス識別: 検出された物体が「何」であるかを特定する

処理の仕組みとしては、画像を特定の領域に区切り、すべての領域で物体らしいかどうかを評価します。「物体らしさ」が指定の閾値を超える領域のみに絞ることで、精度の高い検出結果を得ます。

物体検出とクラス識別

セグメンテーション

物体検出が領域単位だったのに対し、セグメンテーションはピクセル単位でクラスを検出します。ただし、画像全体に対して実施するのではなく、物体検出で物体と認められた領域のみに実施することで効率化を図っています。

セグメンテーション

物体検出で検出された領域内で、さらに車のピクセルが色で塗りつぶされていることが確認できます。

Pythonで実装する

学習済みモデルとサンプルコードのダウンロード

learnopencvがGitHub上で提供するモデルとサンプルコードを利用します。

https://github.com/spmallick/learnopencv

ダウンロードして展開後、Mask-RCNNフォルダを使用します。

実行前の準備

以下のURLから学習済みモデルをダウンロードし、Mask-RCNNフォルダに展開します。

http://download.tensorflow.org/models/object_detection/mask_rcnn_inception_v2_coco_2018_01_28.tar.gz

Windowsでtar.gz形式を解凍するには、7-Zipなどのツールが必要です。

画像の物体検知

入力画像で物体検知を実行します。

cars.jpg
python mask_rcnn.py --image=cars.jpg
検出結果

動画の物体検知

動画でも同様に物体検知を実行できます。

python mask_rcnn.py --video=cars.mp4

学習済みモデルでも高い精度で検出できていることが確認できます。

動画をMP4で出力する

デフォルトではAVI形式で出力されますが、MP4で出力する場合はmask_rcnn.pyの以下の箇所を修正します。

130行目・144行目.avi.mp4に変更:

outputFile = "mask_rcnn_out_py.mp4"
if (args.image):
    if not os.path.isfile(args.image):
        print("Input image file ", args.image, " doesn't exist")
        sys.exit(1)
    cap = cv.VideoCapture(args.image)
    outputFile = args.image[:-4]+'_mask_rcnn_out_py.jpg'
elif (args.video):
    if not os.path.isfile(args.video):
        print("Input video file ", args.video, " doesn't exist")
        sys.exit(1)
    cap = cv.VideoCapture(args.video)
    outputFile = args.video[:-4]+'_mask_rcnn_out_py.mp4'
else:
    cap = cv.VideoCapture(0)

151行目のVideoWriter設定をMP4に変更:

if (not args.image):
    vid_writer = cv.VideoWriter(
        outputFile, cv.VideoWriter_fourcc('m', 'p', '4', 'v'), 49,
        (round(cap.get(cv.CAP_PROP_FRAME_WIDTH)),
         round(cap.get(cv.CAP_PROP_FRAME_HEIGHT)))
    )

まとめ

今回は、Mask R-CNNの仕組みとPythonでの実行方法を紹介しました。

  • Mask R-CNNは物体検出クラス識別セグメンテーションを統合したモデル
  • 物体検出では画像を領域に区切り、物体らしさを閾値で判定する
  • セグメンテーションでは検出領域内でピクセル単位のクラス検出を行う
  • 入力映像の品質が精度に影響するため、必要に応じて前処理を実施する