みなさんこんにちわ、こんばんわ

SAIです。

 

ちょっと番外編です。

というか、ぼやきです。

 

 

OpenCVを使ってSAIがやりたいことは、

任意の画像を認識させて遊びたいんです。

 

具体的には、自動車で走行中に道路標識を認識させたい。

 

 

というわけで、いろいろカスケードを作成しては失敗を繰り返しています。

 

最初に↓の記事に書いた通り、

「特徴抽出の方法や、サンプル画像の出来栄え」が目に見言えないので難しい。

 

 

 

予想敵中です。

 

深層学習の難題ですね。

 

そして、

お盆中、何度も何度もカスケードを作っては消し手を繰り返しています。

 

 

実は、8/6の金曜日の夜にスタートして

OpenCVに既存で含まれている、

顔認識とか目の認識は簡単にできてしまいました。

 

そして、8/7にカスケードの作成を始めたのですが・・・・

これがなかなかうまくいかないんですよね。

 

OpenCVにはtraincascade.exe というのがあり、

これでカスケードファイルを作るんですが、

認識がイマイチだったり認識しなかったり。

(他にもいろいろ準備がいりますけど)

 

 

どんなかというと、↓こんな感じ。

 

 

確かに止まれを認識できてる箇所もありますが、

それ以上に誤認識が多すぎて使い物にならないじゃん。


 

カスケードの作り方はいつかメモとしてブログにとは思うのですが、

こんなでたらめな認識でブログを書くわけにもいかず。。


 

というわけで、

SAIは壁にぶつかっております(爆)うずまき

 

ここで、記事を読んでくださっている方ならお気づきかもしれませんね。

 

8/8の記事で、標識を認識させていたじゃんと。

↓これです。

 


SAIが撮影した画像には違いないんですが、

 

実はこれ、

OpenCVでうまく認識してくれなさ過ぎて、

8/7の深夜というか・・・8/8の早朝に、

にっちもさっちもいかなくてむしゃくしゃしてきました。炎炎

 

ええ、純粋なOpenCVに怒りさえ覚えた瞬間でした。

(おぃ)ムカムカ

 

 

そんな中、いろいろ調べてみると、

TensolFlowに組み込まれているKerasを使って

ニューラルネットワークの学習をさせた学習ファイルを使う方法もあるというのも見つけました。

 

!

 

というわけで、

 

例の画像は、

①Pythonで、

②OpenCVを使い、

③Kerasで学習させたファイルを使い、

画像認識させていたのでした。

 

 

OpenCVのtraincascadeでも、

同等レベルの認識をさせられないものかと期待したのですが、

なかなかうまいこと行かないものですね。

 

 

 

 

 

間違いなく言えることは、

学習方法が悪い。

 

ということでしょうけど・・・・

 

 

誤認識するものの傾向が全くつかめない。

そして、学習過程で何が要因でそうなるのか、

ブラックボックスで意味不明なんですよね

 

つまり、

ヒントすらない位から、

何が悪いかわからんのじゃ!

 

 

となるわけです。

 

単純に、学習用のファイルを増やせばいいのか、

 

それとも学習に使った画像に悪いところがあるのか・・・・

 

 

 

 

困った困った。

 

 

とっとと見切りをつけて、

kerasに力を注ごうかしら。。。

 

 

 

SAIでした。

 

 

 

みなさんこんにちわ、こんばんわ

SAIです。

 

前回、監視カメラを作りたい!

 

といったのに顔を認識させるだけでした。

 

どうせなので、

画面内に人が現れたら警報を鳴らしてみましょうか。

 

 

今、SAIが使用しているのはWindowsPCです。

 

RaspberryPIとかなら、GPIO端子にPWM出力したりすればよいですが、

PCでブザーはどうしたらいいかな?

 

 

調べてみたところ、Pythonでは、winsoundをインポートすれば

簡単にビープ音を鳴らせるようです。

 

というわけで、

ブザーを鳴らすために

winsoundをインポートします。

 

import winsound

 

そんでもって、音を鳴らすためには・・・

ビープ関数Beep()を使えばよいですね。

 

この関数、第一引数が周波数、第二引数が吹鳴時間になります。

 

そして、ビープ音が鳴っている間は、スレッドが停止しちゃうようです。

 

なので、ビープ音は短めにしたほうがよさそうですね。

 

具体的には・・・

 

import winsound


#ビープ音1000Hz 吹鳴時間500ms
freq = 2000 ⇒2kHz
delay = 100 ⇒100ms

としたうえで、以下を呼び出すだけ。

 

winsound.Beep(freq, delay)

 

 

ちょろいっ!

 

 

 

それにしても、TVを映しながら認識を動かすと・・

 

やかましいですね。

 

 

それではSAIでした。

 

それでは本日使用したコードを載せておきます。

晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ

 

import numpy as np
import cv2
import winsound

#顔認識カスケード
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
#Videoキャプチャ
cap = cv2.VideoCapture(0)

#ビープ音1000Hz 吹鳴時間100ms
freq = 2000
delay = 100


#繰り返し
while(True):
    #最新画像を取得
    ret, img = cap.read()
    #グレースケール化
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    #顔を認識
    faces = face_cascade.detectMultiScale(gray)
    #認識箇所を青枠で囲む
    for (x,y,w,h) in faces:
        cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
        
        #顔が検出されたらビープ音
        winsound.Beep(freq, delay)
        
    #最新画像を表示
    cv2.imshow('img', img)
    #imshowの絵を描画するコマンドがwaitkeyに入っているらしく、waitkeyによる1msキー待ち
    #実際には1ms後に抜けるのでこのままで随時画面更新になる。

    cv2.waitKey(1)
cap.release()
cv2.destroyAllWindows()
 

 

晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ

 

それでは、SAIでした。

 

 

 

 

 

 

 

 

みなさんこんにちわ、こんばんわ

SAIです。

 

 

1.4では、OpenCVで画像解析し、青い枠で表示することができましたね!

 

でも、静止画を解析するんじゃ、いったん写真を撮って、そのあと解析になっちゃいます。

 

どうせなら、監視カメラを作ってみたい。

 

 

というわけで、今回はウェブカメラを繋いで、

リアルタイムの画像を解析してみようと思います。

 

 

画像の解析は、1.4で学んだ通りです。

 

今回は、ウエブカメラから画像を読み取り、

即座に解析させて、画面に表示を繰り返してみようと思います。

 

◆1 ウェブカメラの画像取り込み

 

ウェブカメラの画像を取り込む。

この取り込み処理もcv2に組み込まれていました。

 

cv2には、VideoCapture()という関数があり、

この戻り値(仮にcapとする)のアイテムで

カメラとのセッションを繋いでいるようなイメージになります。

 

画像を取得するには、

戻り値capからread()を呼び出すことで、最新画像が取得できます。

 

 

 

具体的には、

cap = cv2.VideoCapture(0)  #キャプチャアイテム取得
ret, img = cap.read()           #画像取得

こんな感じでimgに画像が取り込まれますね。

 

VideoCapture()

の引数は、デバイスNoになります。

 

SAIはノートPCで作業をしたのですが、

ノートPCのインカメラが0番に当たっていました。

WEBカメラが何番かわからないのでforでぐるぐる回してみたのですが、

結局わからず。

 

悩みに悩んでとった方法は・・・・

 

内蔵カメラを無効化して、WEBカメラを0番に割り当ててしまう。

 

 

写真は”有効にする”になっていますが、無効にしているのでこの画像になってます。

 

これでうまくいきました。

 

 

 

◆2 解析画像をリアルタイムで表示する。

 

単純にこれだけ見たら、

何だcv2.imshow()するだけじゃん。

 

と思うと思いますが、そうはいきませんでした。

 

waitKey()を呼び出さないと、白い画面が表示されるだけです。

もしかしてタイムスライスで低レベルGUIにタスクが回らないからかな?と思い、

time 関数によりsleep()を100msかけてみたのですが、やっぱり駄目です。

 

 

よくよく調べてみると、imshow()はウィンドウに対して

描画したい”画像データを転送”するものの、

 

このデータを描画するためには、

waitKey()の中にあるメッセージプロシージャっていうのかな?

を、呼び出さないと動いてくれないようです。

 

描画のたびにキーなんて押したくない・・・

 

悩んでいたのですが、

よく考えたらwaitKey()の引数は待ち時間です。

 

つまり、1ms 町に設定してしまえばwaitを抜けてくれるはず。

 

    #最新画像を表示
    cv2.imshow('img', img)
    #imshowの絵を描画するコマンドがwaitkeyに入っているらしく、waitkeyによる1msキー待ち
    #実際には1ms後に抜けるのでこのままで随時画面更新になる。

    cv2.waitKey(1)

 

これで、1ms待ちごとに画像解析を行うことができました。

 

ウェブカメラでPCの画面をぐるぐるしながら青枠が顔に追従しますね!

 

 

これで、リアルタイム顔認識の出来上がりです!

 

 

イイ感じで画像認識ができていますね!

 

本日はここまでです。

 

 

それでは本日使用したコードを載せておきます。

晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ

 

import numpy as np
import cv2

#顔認識カスケード
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
#Videoキャプチャ
cap = cv2.VideoCapture(0)

#繰り返し
while(True):
    #最新画像を取得
    ret, img = cap.read()
    #グレースケール化
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    #顔を認識
    faces = face_cascade.detectMultiScale(gray)
    #認識箇所を青枠で囲む
    for (x,y,w,h) in faces:
        cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)

    #最新画像を表示
    cv2.imshow('img', img)
    #imshowの絵を描画するコマンドがwaitkeyに入っているらしく、waitkeyによる1msキー待ち
    #実際には1ms後に抜けるのでこのままで随時画面更新になる。

    cv2.waitKey(1)
cap.release()
cv2.destroyAllWindows()

 

晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ

 

 

それではまたね