備忘録

イケイケエンジニアになるために自己嫌悪と戦う大学院生のメモ兼モチベーション維持。

スコアヘッダ認識

やりたいこと

リザルト画像中からスコア表示部分のヘッダを認識する

手段

機械学習ライブラリdlibの物体検出モジュール(structural_object_detection_trainer)を試してみる。

qiita.com

前準備

  • dlibのインストールに数回失敗(boostが入ってなかった)
  • virtualenvを久しぶりに使ったので再度Google先生に教えを請う
  • python3 + opencv3でコケる

python3 + opencv3

/usr/local/Cellar/opencv3/3.1.0_3/lib/にpython3.5がなかった

$ brew reinstall opencv3 --with-python2 --with-python3してみる (ついでに --with-contrib)

→ ok

$ pip install numpy

virtualenvから使えるようにチマチマ

$ echo /usr/local/opt/opencv3/lib/python3.5/site-packages >>  $(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())")/opencv3.pth

blog.amedama.jp

データ

学習データ : 27 テストデータ : 14 ラベリングはimglabのGUIで行ったため、回転にうまく対応できているか不安

学習結果

Training accuracy: precision: 1, recall: 1, average precision: 1

Testing accuracy: precision: 1, recall: 1, average precision: 1

実験

また別のリザルトを拾ってきて、うまく認識できるか試す

import os
import dlib
import cv2

IMG_DIR = './experiment_img/'
cv2.namedWindow("img", cv2.WINDOW_NORMAL)

detector = dlib.simple_object_detector("detector.svm")
files = os.listdir(IMG_DIR)
for file in files:
    ftitle, fext = os.path.splitext(file)
    if fext != '.jpg':
        continue

    # Load image
    abspath = os.path.abspath(IMG_DIR + file)
    print(abspath)
    img = cv2.imread(abspath)
    if img == None:
        print('Failed to read image')
        break

    # Detecting
    dets = detector(img)
    for d in dets:
        cv2.rectangle(img, (d.left(), d.top()), (d.right(), d.bottom()), (0, 0, 255), 2)

    # Show image
    cv2.imshow("img",img)
    cv2.waitKey(0)

cv2.destroyAllWindows()
成功例

f:id:reverent_f:20170102225959p:plain

失敗例

f:id:reverent_f:20170102230019p:plain

まとめ

回転に弱いので検出失敗したら画像を少しづつ回転させて検出させる