- SIFTを使用した物体検出
- ORBを使用したオブジェクト検出
- 配向勾配(HOG)のヒストグラム
- 配向グラジエント(HOG)のヒストグラム、ステップバイステップ:
- HAARカスケード分類子
- 顔と目の検出
- ライブの顔と目の検出
- カスケード分類子の調整
- ビデオでの車と歩行者の検出
WindowsにpythonOpenCVをインストールすることから始め、これまでにPythonを使用して基本的な画像処理、画像セグメンテーション、オブジェクト検出を行いました。これらについては、以下のチュートリアルで説明します。
- Python OpenCV入門:インストールと基本的な画像処理
- Python OpenCVでの画像操作(パート1)
- OpenCVでの画像操作(パート2)
- OpenCVを使用した画像セグメンテーション-画像の特定の領域の抽出
また、さまざまなアルゴリズムを使用してすべてのオブジェクトについていくつかの重要なポイントが特定された、オブジェクト検出のさまざまな方法とアルゴリズムについても学びました。このチュートリアルでは、これらのアルゴリズムを使用して実際のオブジェクトを検出します。ここでは、検出にSIFTとORBを使用します。
SIFTを使用した物体検出
ここでは、オブジェクトの検出はライブWebカメラストリームを使用して行われるため、オブジェクトを認識すると、オブジェクトが見つかったことがわかります。コードでは、主要部分はSIFT検出器と呼ばれる関数によって実行され、ほとんどの処理はこの関数によって実行されます。
コードの残りの半分では、Webカメラストリームを開くことから始め、次に画像テンプレート、つまり参照画像を読み込みます。つまり、プログラムは実際にWebカメラストリームを調べています。
次に、無限の while ループを使用してWebカメラストリームから画像を継続的にキャプチャし、次にWebカメラフレームの対応する高さと幅をキャプチャし、その後、関心領域(ROI)ボックスのパラメータを定義します。 Webカメラフレームの対応する高さと幅を取得することで、オブジェクトを収めることができます。次に、上記で定義したROIパラメーターから長方形を描画します。次に、最後に長方形を切り抜いて、コードのSWIFT検出器部分にフィードします。
これで、SIFT検出器には基本的に2つの入力があります。1つはトリミングされた画像で、もう1つは以前に定義した画像テンプレートであり、いくつかの一致が得られるため、一致は基本的にトリミングされた画像で類似しているオブジェクトまたはキーポイントの数です。とターゲット画像。次に、一致のしきい値を定義します。一致値がしきい値よりも大きい場合は、画面上に見つかった画像を緑色のROI長方形で配置します。
ここで、コードの主要部分であるSIFT検出器と呼ばれる関数に戻りましょう。入力は、2つの画像として取得されます。一方はオブジェクトを探している画像で、もう一方は照合しようとしているオブジェクトです。 to(画像テンプレート)。次に、最初の画像をグレースケールし、画像テンプレートを2番目の画像として定義します。次に、SIFT検出器オブジェクトを作成し、OpenCV SIFT検出および計算関数を実行して、キーポイントを検出し、記述子を計算します。記述子は、基本的にキーポイントに関する情報を格納するベクトルであり、マッチングを行う際に非常に重要です。画像の記述子間。
次に、FLANNベースのマッチャーを定義します。その背後にあるマッチングの数学的理論については説明しませんが、Googleで簡単に調べることができます。まず、インデックス kdtree をゼロに定義してから、インデックスと検索パラメーターを辞書形式で設定します。使用するアルゴリズムであるKDTREEを定義するだけで、使用するツリーの数が多いほど、ツリーが多くなります。より複雑になり、遅くなります。また、検索パラメーターでチェックの数を定義します。これは基本的に、完了する予定の一致の数です。
次に、インデックスパラメータと検索パラメータである以前に定義したパラメータをロードしてFLANNベースのマッチャーオブジェクトを作成し、これに基づいてFLANNベースのマッチャーを作成します。これはKNNがK最近傍であるKNNマッチャーです。基本的には次の方法です。最も近いマッチャーと記述子を探し、初期化定数kを使用してマッチングを行います。これで、このFLANNベースのマッチャーは、取得した一致の数を返します。
FLANNベースのマッチングは単なる近似であるため、FLANNベースのマッチャーの精度を高めるために、Loweの比率テストを実行し、knn flannベースのマッチャーから一致を探し、ここで距離であるいくつかのマトリックスパラメーターを定義します。 、距離がnumpy関数であり、基準を満たしたら、一致を適切な一致に追加し、見つかった適切な一致を返します。したがって、ライブビデオストリームは、画面の隅で見つかった一致の数を示します。
次に、上記の説明のコードを見てみましょう。
import cv2 import numpy as np def sift_detector(new_image、image_template): #入力画像をテンプレートと比較する関数 #次に、それらの間のSIFT一致の数を返します image1 = cv2.cvtColor(new_image、cv2.COLOR_BGR2GRAY) image2 = image_template #作成SIFT検出器オブジェクト #sift = cv2.SIFT()sift = cv2.xfeatures2d.SIFT_create() #SIFT keypoints_1、descriptors_1 = sift.detectAndCompute(image1、None) keypoints_2、descriptors_2 = sift.detectAndCompute(image2、なし) #Flannマッチャーのパラメーターを定義します FLANN_INDEX_KDTREE = 0 index_params = dict(algorithm = FLANN_INDEX_KDTREE、trees = 3) search_params = dict(checks = 100) #FlannMatcherオブジェクトを作成します flann = cv2.FlannBasedMatcher(index_params、search_params)#K 最近傍法を使用して一致を取得します #結果「一致」は、両方の画像の 一致で 見つかった類似の一致の数です= flann.knnMatch(descriptors_1、descriptors_2、k = 2)#Loweの比率テストを使用して良好な一致を 保存しますgood_matches = for m、n in match :if m.distance <0.7 * n.distance:good_matches.append(m) return len( good_matches) cap = cv2.VideoCapture(0) #画像テンプレートを読み込みます。これは参照画像です image_template = cv2.imread( 'phone.jpg'、0) while True: #ウェブカメラ画像を取得します ret、frame = cap.read() #ウェブ サイトの高さと幅を取得フレームの高さ、width = frame.shape #ROIボックスの寸法を定義 top_left_x = int(width / 3) top_left_y = int((height / 2)+(height / 4)) bottom_right_x = int((width / 3)* 2) bottom_right_y = int((height / 2)-(height / 4)) #対象領域の長方形のウィンドウを描画します cv2.rectangle(frame、(top_left_x、top_left_y )、(bottom_right_x、bottom_right_y)、 255、3)#上記で定義した観測のトリミングウィンドウ cropped = frame #フレームの向きを水平方向に反転 frame = cv2.flip(frame、1) #SIFT一致の数を取得 matches = sift_detector(cropped、 image_template) #現在の番号を示すステータス文字列を表示します。一致の数 cv2.putText(frame、str(matches)、(450,450)、cv2.FONT_HERSHEY_COMPLEX、2、(0,255,0)、1) #オブジェクト検出を示すしきい値#SIFT 検出器がほとんど誤った位置を返すため、10を使用します しきい値= 10 #一致がしきい値を超える 場合、一致>しきい値の場合 、オブジェクトが検出されました:cv2.rectangle(frame、(top_left_x、top_left_y)、(bottom_right_x、bottom_right_y)、(0,255,0)、3) cv2.putText(frame 、 'Object Found'、(50,50)、cv2.FONT_HERSHEY_COMPLEX、2、(0,255,0)、2) cv2.imshow( 'Object Detector using SIFT'、frame) if cv2.waitKey(1)== 13: #13はEnterキー ブレーク cap.release() cv2.destroyAllWindows()です
ORBを使用したオブジェクト検出
SIFTを使用したオブジェクト検出は、キーポイントに基づいて非常に正確な数の一致を生成するため、非常にクールで正確ですが、特許を取得しているため、商用アプリケーションでの使用が困難です。その逆は、ORBアルゴリズムです。物体検出用。
プログラムを2つの部分に分割したSIFTによるオブジェクト検出の方法と同様に、ここでも同じことが続きます。
最初に、2つの入力を受け取る関数ORB_detectorを定義します。1つはWebカメラからのライブストリーム画像で、もう1つは画像の照合に基づく画像テンプレートです。次に、Webカメラ画像をグレースケールしてからORB検出器を初期化します。ここでは、1000のキーポイントと1.2のスケーリングパラメーターに設定しています。これらのパラメーターを簡単に試してから、両方の画像のキーポイント(kp)と記述子(des)を検出し、 detectANDCompute 関数で定義している2番目のパラメーターはNONEであり、画像マスクの使用を要求しているかどうかを確認できます。ここではそれを否定しています。
次に、以前はFLANNベースのマッチャーを使用していた検出器に移動しますが、ここではBFMatcherを使用し、BFMatcher内で2つのパラメーターを定義します。1つはNORM_HAMMINGで、もう1つは値がTRUEのcrossCheckです。
次に、上記で定義した記述子を使用して、これら2つの画像間の一致を計算します。これらの一致は近似値ではないため、一致数を返します。したがって、Loweの比率テストを実行する必要はありません。代わりに、距離に基づいて一致を並べ替えます。 、距離が短いほど一致が良くなり(ここで距離はポイント間の距離を意味します)、最後に長さ関数を使用して一致の数を返します。
また、メイン関数では、オーブ検出器が多くのノイズを生成するため、しきい値をはるかに高い値に設定します。
次に、ORBベースの検出のコードを見てみましょう。
import cv2 import numpy as np def ORB_detector(new_image、image_template): #入力画像をテンプレートと比較する関数 #次に、それらの間で一致するORBの数を返します image1 = cv2.cvtColor(new_image、cv2.COLOR_BGR2GRAY) #でORB検出器を作成しますスケーリングピラミッド係数が1.2の1000キーポイント orb = cv2.ORB_create(1000、1.2) #元の画像のキーポイントを検出 (kp1、des1)= orb.detectAndCompute(image1、None) #回転した画像のキーポイントを検出 (kp2、des2) = orb.detectAndCompute(image_template、None) #マッチャーを作成 する#Flannベースのマッチングを使用しなくなったことに注意 bf = cv2.BFMatcher(cv2.NORM_HAMMING、crossCheck = True) #一致する一致を 行う= bf.match(des1、des2) #距離に基づいて一致を並べ替えます。最小距離 #の方が 一致= sorted(matches、key = lambda val:val.distance) return len(matches) cap = cv2.VideoCapture(0) #画像テンプレートを読み込みます。これが参照画像です image_template = cv2.imread( 'phone.jpg'、0) #image_template = cv2.imread( 'images / kitkat.jpg'、0) while True: #ウェブカメラ画像を取得 ret、frame = cap.read() #ウェブカメラフレームの 高 さと幅を取得、width = frame.shape #ROIボックスの寸法を定義します(これらの一部はループの外側にある必要があることに注意してください) top_left_x = int(width / 3) top_left_y = int((height / 2)+(height / 4)) bottom_right_x = int((width / 3)* 2) bottom_right_y = int((height / 2)-(height / 4)) #長方形のウィンドウを描画します対象領域 cv2.rectangle(frame、(top_left_x、top_left_y)、(bottom_right_x、bottom_right_y)、255、3) #上で定義した観測ウィンドウの トリミング= frame #フレームの向きを水平方向に反転 frame = cv2.flip(frame、1 ) # 一致する ORB一致の数を取得= ORB_detector(cropped、image_template)#現在の番号を示すステータス文字列を表示します。一致の数 output_string = "Matches =" + str(matches) cv2.putText(frame、output_string、(50,450)、cv2.FONT_HERSHEY_COMPLEX、2、(250,0,150)、2) #オブジェクトの検出を示すためのしきい値 #新しい画像または照明条件については、少し実験する必要がある場合があります #注:上位1000の一致を取得するためのORB検出器、350は基本的に最小35%の一致 しきい値= 250 #一致がしきい値 >しきい値に一致する 場合、オブジェクトが検出されました:cv2.rectangle(frame、(top_left_x、top_left_y)、(bottom_right_x、bottom_right_y)、(0,255,0)、3) cv2.putText(frame、 'Object Found'、(50 、50)、cv2.FONT_HERSHEY_COMPLEX、2、(0,255,0)、2) cv2.imshow( 'ORBを使用したオブジェクト検出器'、フレーム) if cv2.waitKey(1)== 13:#13はEnterキー ブレーク キャップです.release() cv2.destroyAllWindows()
配向勾配(HOG)のヒストグラム
次に、Histogram of Oriented Gradients(HOG)という別の記述子について説明します。
HOGは非常にクールで便利な記述子であり、オブジェクト検出に広く成功裏に使用されています。これまでに見たように、キーポイントを計算してからそれらのキーポイントから記述子を計算する必要があるSIFTやORBなどの画像記述子では、HOGがそのプロセスを実行します。別の方法で。これは、単一の特徴ベクトルとしてオブジェクトを表す各画像のセグメントを表す特徴ベクトルの集合とは対照的です。これは、画像全体に対して単一のベクトル特徴があることを意味します。
これは、画像上でスライディングウィンドウ検出器によって計算されます。HOG記述子は、位置ごとに計算されます。そして、各位置が1つの特徴ベクトルに結合されます。
SIFTと同様に、画像のスケールはピラミッド化によって調整されます。
以前はFLANNやBFMatcherなどのマッチャーを使用していましたが、HOGはSVM(サポートベクターマシン)分類器を使用して異なる方法で使用します。計算される各HOG記述子はSVM分類器に送られ、オブジェクトが見つかったかどうかを判断します。
人間の検出にHOGを使用することに関するDalal&Triggsによる素晴らしい論文へのリンクは次のとおりです:
https ://lear.inrialpes.fr/people/triggs/pubs/Dalal-cvpr05.pdf
配向グラジエント(HOG)のヒストグラム、ステップバイステップ:
HOGの理解は非常に複雑になる可能性がありますが、ここでは、HOGの理論についてのみ説明し、それに関連する数学については詳しく説明しません。
この写真を撮ってみましょう。少しピクセル化されています。上隅には8x8ピクセルのボックスがあります。このボックスでは、各ピクセルのグラデーションベクトルまたはエッジの向きを計算します。つまり、このボックスでは、ボックス内のピクセルの画像勾配ベクトルを計算し(画像強度自体の方向または流れのようなものです)、これにより64(8 x 8)の勾配ベクトルが生成され、ヒストグラムとして表されます。 。したがって、各勾配ベクトルを表すヒストグラムを想像してみてください。したがって、すべてのポイントまたは強度が1つの方向にある場合、その方向のヒストグラムはたとえば45度であり、ヒストグラムは45度にピークがあります。
したがって、ここで行うことは、各セルを角度のあるビンに分割することです。各ビンは勾配方向(x、yなど)に対応します。Dalal and Triggsの論文では、9つのビン0〜180°(各ビン20°)を使用しました。これにより、64個のベクトルが9個の値に効果的に削減されます。したがって、私たちが行ったことはサイズを縮小しますが、必要なすべての重要な情報を保持します。
豚の計算の次のステップは正規化です。勾配を正規化して、照明の変化、つまり明るさとコントラストに対する不変性を確保します。
この画像では、強度値はそれぞれの方向に応じて正方形で示され、すべてが互いに50の差があります
∆ H = 50、∆ v = 50; │Δ│=√50 2 = 70.72 +50 = 0.707 / 100 70.72
ベクトルをすべての0.707で得られる勾配の大きさで除算します。これは、正規化です。
同様に、強度を変更したり、コントラストを変更したりすると、以下の値が得られます。
∆ H = 50、∆ v = 50; │Δ│=√50 2 = 70.72 +50 = 0.707 / 100 70.72。∆ H = 100、∆ v = 100; │Δ│=√100 2 = 1.41 +100 = 141.42、141.42 / 100
正規化はセルレベルでは行われず、代わりにブロックレベルで行われます。したがって、ここではブロックは基本的に4つのセルのグループです。これは隣接するブロックを考慮に入れるため、画像のより大きなセグメントを考慮しながら正規化します。
それでは、コードを見てみましょう。
import numpy as np import cv2 import matplotlib.pyplot as plt #画像を読み込んでからグレースケール 画像= cv2.imread( 'elephant.jpg') gray = cv2.cvtColor(image、cv2.COLOR_BGR2GRAY) #元の画像を表示 cv2.imshow( '入力画像 '、画像) cv2.waitKey(0) #パラメータ、セルサイズ、ブロックサイズの 定義#ピクセル単位の hxw cell_size =( 8、8 )#セル内のhxw block_size =(2、2) #方向ビンの数 nbins = 9 #OpenCVのHOG記述子の使用 #winSizeは、セルサイズの倍数にトリミングされた画像のサイズです hog = cv2.HOGDescriptor(_winSize =(gray.shape // cell_size * cell_size、 grey.shape // cell_size * cell_size)、 _ blockSize =(block_size * cell_size、 block_size * cell_size)、 _ blockStride =(cell_size、cell_size)、 _ cellSize =(cell_size、cell_size)、 _ nbins = nbins) #使用するnumpy配列形状を作成しますhog_featuresを作成するにはn_cells =(gray.shape // cell_size、gray.shape // cell_size) #最初に行でブロックにインデックスを付けます。 #hog_featsには、各方向の勾配振幅が含まれるようになりました。 #各グループのグループの各セル。インデックス付けは、行、次に列によって行われます。 hog_feats = hog.compute(gray).reshape(n_cells-block_size + 1、 n_cells-block_size + 1、 block_size、block_size、nbins).transpose((1、0、2、3、4)) #グラデーションの方向を格納するためにnbinディメンションを使用してグラデーション配列を作成します gradients = np.zeros((n_cells、n_cells、nbins)) #ディメンションの配列を作成します cell_count = np.full((n_cells、n_cells、1)、0、dtype = int ) # 範囲内のoff_yの ブロック正規化(block_size):範囲内のoff_xの場合(block_size): gradients-block_size + off_y + 1、 off_x:n_cells-block_size + off_x + 1] + = \ hog_feats cell_count-block_size + off_y + 1 off_x:n_cells --block_size + off_x + 1] + = 1 #平均勾配 勾配/ = cell_count #Matplotlibを使用してHOGをプロット #角度は360 / nbins *方向 color_bins = 5 plt.pcolor(gradients) plt.gca()。invert_yaxis() plt.gca()。set_aspect( 'equal'、adjustable = 'box') plt.colorbar() plt.show() cv2.destroyAllWindows()
この画像は、入力画像がHOG表現としてどのように表されるかを示しています。
HAARカスケード分類子
前に説明したように、画像から特徴を抽出し、それらの特徴を使用してオブジェクトを分類または検出できます。
HAARカスケード分類子とは何ですか?Haar特徴を一連の分類器(カスケード)に
入力して画像内のオブジェクトを識別するオブジェクト検出方法。それらは1つのタイプのオブジェクトを識別するように訓練されていますが、目と顔を一緒に検出するなど、それらのいくつかを並行して使用することができます。
HAAR分類子の説明:
HAAR分類器は、多くのポジティブ画像(つまり、オブジェクトが存在する
画像)とネガティブ画像(つまり、オブジェクトが存在しない画像)を使用してトレーニングされます。
これらの画像を取得したら、長方形ブロックのスライディングウィンドウを使用して特徴を抽出します。これらの特徴(HAAR特徴)は単一値であり、黒い長方形から白い長方形の下のピクセル強度の合計を引くことによって計算されます。
ただし、これは、24 x 24ピクセルのベースウィンドウ(180,000個のフィーチャが生成された)の場合でも、ばかげた数の計算です。
そこで研究者たちは、4つの配列参照を使用してこれを計算するIntegralImagesと呼ばれる方法を考案しました。ただし、それらにはまだ180,000の機能があり、それらの大部分は実際の価値を追加していません。
次に、ブースティングを使用して、Freund&SchapireのAdaBoostを使用して最も有益な機能を決定し、画像内で最も有益な機能を見つけました。ブースティングは、誤った分類に重い加重ペナルティを割り当てるだけで、弱い分類子を使用して強い分類子を構築するプロセスです。180,000の機能を6000に減らしますが、これはまだかなりの機能です。
これらの6000の機能では、一部の機能が他の機能よりも有益です。したがって、最も有益な機能を使用して、その領域に顔ができる可能性があるかどうかを最初に確認した場合(誤検知は大した問題にはなりません)。そうすることで、6000個のフィーチャすべてを一度に計算する必要がなくなります。この概念は、分類子のカスケードと呼ばれます。顔検出では、ViolaJonesメソッドは38段階を使用しました。
顔と目の検出
したがって、HAARカスケードに関する理論的な知識を得た後、最終的に実装します。これを明確にするために、レッスンを部分的に分割します。最初に正面を検出し、次に正面を検出します。目そして最後に、ウェブカメラを介して顔と目のライブ検出を行います。
そのため、OpenCVによって.xmlファイルとして提供されている事前トレーニング済みの分類子を使用します。xmlは拡張可能なマークアップ言語を表します。この言語は大量のデータを格納するために使用され、データベースを構築することもできます。
このリンクからこれらの分類子にアクセスできます。
顔検出
正面の顔検出を試してみましょう。ここから正面の顔検出器のカスケードにアクセスできます。zipファイルを抽出してxmlファイルを取得するだけです。
import numpy as np import cv2 #OpenCVのCascadeClassifier関数を #分類子(XMLファイル形式)が格納され ている場所にポイントします。コードと分類子を同じフォルダーに保持することを忘れないでくださいface_cascade = cv2.CascadeClassifier( 'haarcascade_frontalface_default.xml') #ロード次に、画像をグレースケールに変換しますimage = cv2.imread( 'Trump.jpg') gray = cv2.cvtColor(image、cv2.COLOR_BGR2GRAY) # 分類子は、検出された顔のROIをタプルとして返します#左上を格納します座標と右下の座標 #検出されたさまざまな面の場所であるリストのリストを返します。 顔= face_cascade.detectMultiScale(gray、1.3、5) #顔が検出されない場合、face_classifierは戻り、 facesが()の場合は 空のタプル:print( "顔が見つかりません") #faces配列を繰り返し処理し、 # (x、y、w、 h)顔内: cv2.rectangle(image、(x、y)、(x + w、y + h)、(127,0,255)、2) cv2.imshow( 'Face Detection'、image) cv2.waitKey( 0) cv2.destroyAllWindows()
次に、顔と目の検出を組み合わせて、同じzipファイルで目の検出器のカスケードにアクセスできるようにします。
import numpy as np import cv2 face_classifier = cv2.CascadeClassifier( 'haarcascade_frontalface_default.xml') eye_classifier = cv2.CascadeClassifier( 'haarcascade_eye.xml') img = cv2.imread( 'Trump.jpg') gray = cv2.cvtColor(img cv2.COLOR_BGR2GRAY) faces = face_classifier.detectMultiScale(gray、1.3、5) #顔が検出されない 場合、facesが()の場合 、face_classifierは戻り、空のタプル:print( "No Face Found") for(x、y、w、h )顔: cv2.rectangle(img、(x、y)、(x + w、y + h)、(127,0,255)、2) cv2.imshow( 'img'、img) roi_gray =灰色 roi_color = img 目= eye_classifier.detectMultiScale(roi_gray) cv2.waitKey(0) for(ex、ey、ew、eh)in eyes: cv2.rectangle(roi_color、(ex、ey)、(ex + ew、ey + eh)、(255,255,0)、2) cv2.imshow( 'img'、img) cv2.waitKey(0) cv2.destroyAllWindows( ) cv2.waitKey(0)
あなたは私たちが選んだ見ることができるように、顔検出のためのコードが、ここでは、追加した目のカスケードおよび方法は、それらを検出するためにそのように、このコードはずっと同じであるので、グレイはのためのパラメータとして、顔のバージョンをスケール detectMultiScale ため目。これにより、その領域でのみ目を検出するため、計算が削減されます。
ライブの顔と目の検出
これまで顔と目の検出を行ってきましたが、Webカメラからのライブビデオストリームで同じことを実装しましょう。これでは、顔と目の同じ検出を行いますが、今回はWebカメラからのライブストリームに対して行います。ほとんどのアプリケーションでは、顔が周りのボックスで強調表示されていますが、ここでは、顔が切り取られ、目がそれだけで識別されるという別の方法を実行しました。
したがって、ここでは、顔と目の両方の分類子をインポートし、顔と目の検出のすべての処理を実行するための関数を定義します。その後、ウェブカメラストリームを開始し、顔と目を検出するための顔検出機能を呼び出しました。顔検出機能内で定義しているパラメーターは、ライブWebカメラストリームからの連続画像です。
import cv2 import numpy as np face_classifier = cv2.CascadeClassifier( 'haarcascade_frontalface_default.xml') eye_classifier = cv2.CascadeClassifier( 'haarcascade_eye.xml') def face_detector(img、size = 0.5): #画像をグレースケール グレーに 変換= cv2.cvtColor (img、cv2.COLOR_BGR2GRAY)faces = face_classifier.detectMultiScale(gray、1.3、5) if faces is(): return img for(x、y、w、h)in faces: x = x-50 w = w + 50 y = y-50 h = h + 50 cv2.rectangle(img、(x、y)、(x + w、y + h)、(255,0,0)、2) roi_gray =灰色 roi_color = img 目=目の( ex、ey、ew、eh)のeye_classifier.detectMultiScale(roi_gray): cv2.rectangle(roi_color、(ex、ey)、(ex + ew、ey + eh)、(0,0,255)、2)roi_color = cv2.flip(roi_color、1)return roi_color cap = cv2.VideoCapture(0)Trueの場合:ret、frame = cap.read()cv2.imshow( 'Our Face Extractor'、face_detector(frame))if cv2.waitKey(1)== 13:#13はEnterキーブレークcap.release()cv2.destroyAllWindows()
カスケード分類子の調整
入力画像以外のdetectMultiScale内で定義されたパラメーターには、次の意味があります。
ourClassifier。detectMultiScale(入力画像、スケールファクター、最小ネイバー)
- スケールファクタ を指定し、我々は、画像サイズ毎時間、私たちの規模を縮小どのくらい。たとえば、顔検出では通常1.3を使用します。これは、拡大縮小するたびに画像を30%縮小することを意味します。1.05のように値を小さくすると、計算に時間がかかりますが、検出率は高くなります。
- Min Neighbors 陽性検出と見なすために、各電位窓が持つ必要のある隣接数を指定します。通常、3〜6の間に設定します。感度設定として機能します。値を低くすると、1つの顔で複数の顔が検出される場合があります。値を高くすると誤検知が少なくなりますが、一部の面を見逃す可能性があります。
ビデオでの車と歩行者の検出
ここで、HAARカスケードを使用してビデオ内の歩行者と車を検出しますが、ビデオがロードされておらず、エラーなしでコードがコンパイルされている場合は、次の手順に従う必要があります。
コードを実行した後なしのビデオ負荷した場合、あなたが私たちのコピーする必要があるかもしれない からopencv_ffmpeg.dlを : OpenCVの\ソース\ 3rdparty \ ffmpegのそれを貼り付け 、あなたのpythonがインストールされている例 C:\ Anaconda2
コピーしたら、使用しているOpenCVのバージョンに応じてファイルの名前を変更する必要があります。たとえば、OpenCV 2.4.13を使用している場合は、ファイルの名前をopencv_ffmpeg2413_64.dll またはopencv_ffmpeg2413.dll(使用している場合)に変更します。 X86マシンを使用)opencv_ffmpeg310_64.dll またはopencv_ffmpeg310.dll(X86マシンを使用している場合)
python.exeがインストールされている場所を見つけるには、これらの2行のコードを実行するだけで、pythonがインストールされている場所が出力されます。
import sys print(sys.executable)
これらの手順を正常に実行したら、歩行者検出のコードに移りましょう。
歩行者検出用のカスケードと、ここに添付されているzipファイルから取得できます。
import cv2 import numpy as np #ボディ分類 子を 作成body_classifier = cv2.CascadeClassifier( 'haarcascade_fullbody.xml')#ビデオファイルのビデオキャプチャを開始します。ここでは、歩行者が検出されるビデオファイルを使用しています cap = cv2.VideoCapture( 'walking.avi') # cap.isOpened()中に ビデオが正常にロードされるとループします:#ビデオの各フレームを読み取ります ret、frame = cap.read() #ここでは、フレームのサイズを半分のサイズに変更しています、 大きな画像にはスライドするウィンドウがたくさんあるため、分類を高速化するために行っています。全体として、解像度を下げています ビデオの半分の数は0.5が示すものであり、#interlinear frame = cv2.resize(frame、None、fx = 0.5、fy = 0.5、interpolation = cv2.INTER_LINEAR) gray = cv2 というより高速な補間方法も使用しています。 cvtColor(frame、cv2.COLOR_BGR2GRAY)#フレームをボディ分類 子に渡しますbodys = body_classifier.detectMultiScale(gray、1.2、3) #ボディ内の (x、y、w、h)で 識別されるボディの境界ボックスを抽出します:cv2。 rectangle(frame、(x、y)、(x + w、y + h)、( 0、255、255 )、2)cv2.imshow( 'Pedestrians'、frame)if cv2.waitKey(1)== 13 :#13はEnterキー ブレーク cap.release() cv2.destroyAllWindows()です
ビデオで歩行者を正常に検出した後、車の検出のコードに移りましょう。ここから歩行者の検出のカスケードを作成できます。
import cv2 import time import numpy as np #ボディ分類 子を 作成しますcar_classifier = cv2.CascadeClassifier( 'haarcascade_car.xml')#ビデオファイルのビデオキャプチャを開始します cap = cv2.VideoCapture( 'cars.avi') #ビデオが正常に終了したらループしますロード 中cap.isOpened(): time.sleep(0.05)# 読む最初のフレーム RET、フレーム= cap.read() 灰色= cv2.cvtColor(フレーム、cv2.COLOR_BGR2GRAY) 私たちの車の分類器への#パスフレーム 車= car_classifier.detectMultiScale(gray、1.4、2) # 車内で(x、y、w、h)で 識別されたボディの境界ボックスを抽出します:cv2.rectangle(frame、(x、y)、(x + w、y + h )、(0、255、255)、2) cv2.imshow( 'Cars'、frame) if cv2.waitKey(1)== 13:#13はEnterキー ブレーク cap.release() cv2.destroyAllWindows()
time.sleep(.05) が追加されたことにお気づきのことと思いますが、これはフレームレートの遅延であるため、すべての車が正しく識別されていることを確認できます。または、コメントラベルを追加するだけで簡単に削除できます。
この記事は、RajeevRatanによって作成されたUdemyのDeepLearningコースを使用したPythonのMasterComputerVision™OpenCV4から参照されています。購読して、ComputerVisionとPythonの詳細を確認してください。