end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

opencv3 + python による物体検出 (失敗でしたが、間取り図の引違い窓検知)

今回は上手く行きませんでしたが、今後の為にメモ

以下は参考url

gihyo.jp

STEP1 正解画像と、画像listの準備

f:id:end0tknr:20171111202506p:plain f:id:end0tknr:20171111202516p:plain f:id:end0tknr:20171111202510p:plain

↑こちらのような引違い窓のpng(80×44 ~ 15×137)を10コ作成し、 これらの一覧を img_ok_list.txt に記載しました。

画像listには「file名、物体数、座標x, 座標y, 幅, 高さ」を指定するようです

./win_img_ok/window_900_h.png   1 16 16  49   8
./win_img_ok/window_900_v.png   1 17 14   7  50
./win_img_ok/window_1800_h.png  1 12 14  97   8
./win_img_ok/window_1800_v.png  1 14  9   8  97
./win_img_ok/引違い外窓_h.png   1  8  8  60  10
./win_img_ok/引違い外窓_v.png   1  7  8   9  60
./win_img_ok/引違い窓_3枚_h.png 1  6  4 124   7
./win_img_ok/引違い窓_3枚_v.png 1  4  6   7 124
./win_img_ok/引違い窓_4枚_h.png 1  6  4 124   7
./win_img_ok/引違い窓_4枚_v.png 1  4  6   7 124

STEP2 opencv_createsamples の実行

以下の通り。この辺りの引数の意味を理解していないことが、よくなかったのかも

$ /usr/local/bin/opencv_createsamples \
  -info ./img_ok_list.txt \ # 正解画像list
  -vec window_hikichigai.vec \  # 出力するサンプルfile
  -num 10 \                     # 出力するサンプル数
  -bgcolor 255 \                # 背景色
  -w 24 -h 24                   # サンプル画像のsize...?

STEP3 NG画像と、画像listの準備

NG画像は適当に用意し、 img_ng_list.txt にはfile名だけ記載しました

f:id:end0tknr:20061230161422j:plain f:id:end0tknr:20100620181922j:plain f:id:end0tknr:20171111202724p:plain f:id:end0tknr:20171111202732p:plain

./win_img_ng/alcatraz2.jpg
./win_img_ng/AquaTermi_lowcontrast.JPG
./win_img_ng/book_frontal.JPG
./win_img_ng/book_perspective.JPG
./win_img_ng/boy_on_hill.jpg
./win_img_ng/calibration_setup.JPG
./win_img_ng/ceramic-houses_t0.png
./win_img_ng/climbing_1_small.jpg
./win_img_ng/crans_1_small.jpg
./win_img_ng/empire.jpg
./win_img_ng/fisherman.jpg
./win_img_ng/FIX窓.png
./win_img_ng/sf_view1.jpg
./win_img_ng/sunset_tree.jpg
./win_img_ng/turningtorso1.jpg
./win_img_ng/Univ1.jpg
./win_img_ng/両引き戸.png
./win_img_ng/両開き戸.png
./win_img_ng/出入り口.png
./win_img_ng/引込み戸.png
./win_img_ng/引違い内戸.png
./win_img_ng/折り畳み戸.png
./win_img_ng/片引戸.png
./win_img_ng/片開き戸.png
./win_img_ng/窓一般.png

STEP4 opencv_traincascade の実行

/usr/local/bin/opencv_traincascade \
  -data ./model/1/ \             # model出力先
  -vec ./window_hikichigai.vec \ # opencv_createsamples で作成したvec
  -bg ./img_ng_list.txt \        # NG画像list
  -numNeg 25 \                   # NG画像数
  -numPos  9 \                   # sampleデータの8-9割とするらしい
   -w 24 -h 24 \                 # opencv_createsamples と同じにするらしい
  -numStages 8                   # 何のステージだろう...?

STEP5 失敗に終わりましたが、物体認識実行

#!/usr/local/bin/python
# -*- coding: utf-8 -*-
import cv2
import numpy as np
import sys


def main():
    org_file  = sys.argv[1]
    # 学習器(cascade.xml)の指定
    cascade = cv2.CascadeClassifier('./model/1/cascade.xml')
    # 予測対象の画像の指定
    img_org = cv2.imread(org_file, 0)
    
    ret, img_mono = cv2.threshold(img_org,
                                 200,               # 閾値
                                 256,               # 画素値の最大値
                                 cv2.THRESH_BINARY) # 2値化type

    point = cascade.detectMultiScale(img_mono, 1.1, 3)

    if len(point) > 0:
        for rect in point:
            cv2.rectangle(img_org,
                          tuple(rect[0:2]),
                          tuple(rect[0:2]+rect[2:4]),
                          (0, 0,255),
                          thickness=2)
    else:
        print "no detect"

    cv2.imwrite('detected.jpg', img_org)

    
if __name__ == '__main__':
    main()

↑こう書くと↓こう表示されます

f:id:end0tknr:20171111202826p:plain:w270 f:id:end0tknr:20171111202832j:plain:w270