mecobalamin’s diary

人間万事塞翁が馬

OpenCVを使って物体認識その5、pythonスクリプトで物体認識

続きです
mecobalamin.hatenablog.com

まず認識結果から
f:id:mecobalamin:20200201111510j:plain
f:id:mecobalamin:20200201111606j:plain
f:id:mecobalamin:20200201111650j:plain
これだけだとそれなりに
うまくできてそうだけど

実際は認識できてないのが多い
何故か手前じゃなくて奥の猫とか
f:id:mecobalamin:20200201111715j:plain
下を向いていたり、足だけとか
f:id:mecobalamin:20200201112014j:plain
正面向いてるのに全く認識できてないとか
f:id:mecobalamin:20200201112100j:plain

なんでだろ
正面顔のデータが少ないか

ここまでは正解データをテストに使った

正解に使っていない画像を認識させた結果がこれ
f:id:mecobalamin:20200201112154j:plain
f:id:mecobalamin:20200201112226j:plain
顔以外のところを認識してる

traincascadeのパラメーター変えると
また結果が変わるんだけど
正解データが足りないだけなのかも

とりあえずここまでは動いた
あとはパラメータ調整と正解画像を増やせるか試すとして
一旦まとめは終了




使ったpythonのコードも残す
この方のコードをベースに追記して使わせてもらった
qiita.com

追加した部分とコードについて理解した範囲でメモ
opencv_traincascadeで生成したcascade.xml
ディレクトリをmodelに指定している
cats_classificationは認識に使う画像の在るディレクト
cats_outputは認識後の画像を保存するディレクト

指定したディレクトリのファイル名を取得して
それらについて猫の顔を認識させている
画像はグレースケールにしてから認識
ここのパラメータでも認識結果が変わる

Cascade.detectMultiScale(gray, 1.3, 3)

認識されたら赤い矩形を上書きして保存する
このときFile_Dateで指定した日付をファイル名に追加する

# import library
import cv2
import numpy as np
from glob import glob
from os.path import relpath

# Parameters
File_Date = "20xx"

# Path to files
Path_Classifier = '/path/to/file/model'
Path_Images = '/path/to/file/cats_classification'
Path_Output = '/path/to/file/cats_output'

# 学習器(cascade.xml)の指定
Cascade = cv2.CascadeClassifier(Path_Classifier + "/cascade.xml")

# ファイル名の取得
List_Images = glob(Path_Images + "/*.jpg")
List_Names = []
for i in List_Images:
    List_Names.append(relpath(i, Path_Images))

# 予測対象の画像の指定
for i in List_Names:
    print(i)
    img = cv2.imread(Path_Images + "/" + i, cv2.IMREAD_COLOR)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    point = Cascade.detectMultiScale(gray, 1.3, 3)
    print(len(point))

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

    cv2.imwrite(Path_Output + "/" + "Detected_" + File_Date + "_" + i, img)

画像Path_Outputで指定されたディレクトリに保存される

vimのコピーについてメモ
vimクリップボードにコピーするときは
ビジュアルモードに入って

"+y

いつも忘れる