コンピュータが見るように





コンピューターがビデオストリームからの処理に必要なオブジェクトをどのように見つけるのか疑問に思ったことはありませんか?一見すると、これは、数学分析や離散数学などからの膨大な数の式を使用する「高度な」プログラミングタスクのように見えます。認識の世界で「こんにちは、世界」のような小さなプログラムを作成するには、膨大な知識が必要です。ビデオ上の画像。そして、実際に今ではコンピュータービジョンの世界に入るのがはるかに簡単であると言われたら、この記事を読んだ後、顔を見て検出するようにコンピューターに教える独自のプログラムを書くことができますか?また、記事の最後には、コンピュータービジョンを使用してPCのセキュリティを強化できるボーナスがあります。



コンピュータが顔のように見えるものを表示していることを理解し始めるには、次のものが必要です。



  1. コンピューター;
  2. ウェブカメラ;
  3. Python 3;
  4. お気に入りのコードエディタ(PyCharm、Jupyterなど)。


したがって、上記のリストに従って必要なものをすべて収集したら、顔認識用のプログラムを直接作成し始めることができます。



まず、コマンドラインのコマンドを使用して必要なPythonライブラリをダウンロードします。



pip install opencv-python; numpy






それらが必要な理由について簡単に説明します:



OpenCV。このライブラリは、ほとんどすべての最新のコンピュータビジョンプロジェクトのバックボーンです。何百ものコンピュータービジョンと画像処理アルゴリズムを収容しています。もともとはC / C ++で書かれていましたが、この言語での需要が高かったため、後でPythonでも書き直されました。



しびれ。OpenCVライブラリの内部計算に役立ちます。



必要なライブラリのインストールが完了したら、お気に入りのコードエディタを開いて、プログラムの作成を開始します



。OpenCVコンピュータビジョンライブラリを接続します。



import cv2 as cv


2. VideoCapture(index)メソッドを使用してWebカメラからビデオストリームをキャプチャします。ここで、indexはシステム内のWebカメラのシリアル番号です。カメラが1つしかない場合、パラメーターは0になります。



capture = cv.VideoCapture(0)


3.ビデオを取得するには、read()メソッドを使用します。このメソッドはrtrnフラグを返します-ビデオストリームと画像からフレームをキャプチャした成功を示します-ビデオストリームのフレーム(numpy配列)。Escapeキーが押されるまで、ビデオストリームからデータを継続的に読み取ります。



while True:
    rtrn, image = capture.read()
    cv.imshow("Capture from Web-camera", image) #      
    if cv.waitKey(1) == 27:  #      Esc
        break
capture.release()
cv.destroyAllWindows()


ファイルを保存し、pythonour_file_name.pyを使用してコマンドラインから実行します。これで、プログラムはWebカメラからビデオストリームを受信できるようになりました。これは、コンピューターが顔を認識できるという事実の半分に達していることを意味します。



4.コンピュータがビデオをファイルに書き込めるようにしましょう。ビデオを



保存するためのコーデックを指定し、保存されたファイルの名前、fps、およびサイズを指定します。私たちのタスクでは、XVIDコーデックを使用します。



import cv2 as cv
capture = cv.VideoCapture(0)
codec = cv.VideoWriter_fourcc(*'XVID')


5.フレームを順番にビデオウィンドウに出力し、その結果を出力変数に保存します。次に、ビデオストリームの終了後、出力からのデータがファイル「saved_from_camera.avi」に転送されます。



output = cv.VideoWriter('saved_from_camera.avi ', codec, 25.0, (640, 480))
while capture.isOpened():
    rtrn, image = capture.read()
    if cv.waitKey(1) == 27 or rtrn == False:
        break
    cv.imshow('video for save', image)
    output.write(image)
output.release()
capture.release()
cv.destroyAllWindows()


Webカメラからビデオを取得してファイルに保存する方法を学習したら、最も興味深いこと、つまりビデオストリームでの顔認識に進むことができます。フレーム内の顔を見つけるために、いわゆるハール機能を使用します。彼らの本質は、画像内の長方形の領域を取得すると、隣接する長方形のピクセル間の強度の違いによって、顔に固有の特徴を区別できるということです。



たとえば、顔のある画像では、目の周りの領域が頬の周りよりも暗くなります。したがって、顔のハールサインの1つは、頬と目の2つの隣接する長方形と呼ぶことができます。



画像内のオブジェクトを検出するための、他にも多くのより高速で正確な方法がありますが、一般的な原則を理解するには、今のところハールサインを知る必要があるだけです。



OpenCVの開発者は、ハールサインの決定に関する作業をすでに実行しており、ビデオストリームの処理機能の結果をすべての人に提供しています。



Webcamから顔検出器の作成を始めましょう。6



。まず、Haar機能を取得し、ビデオストリームをキャプチャするためのパラメータを定義します。特性ファイルは、Pythonライブラリがインストールされているパスにあります。デフォルトでは、それらはフォルダにあります



C:/Python3X/Lib/sitepackages/cv2/data/haarcascade_frontalface_default.xml


ここで、XはPython3のサブバージョンです。



import cv2 as cv
cascade_of_face = cv.CascadeClassifier('C:/Python3.X/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml ')
capture = cv.VideoCapture(0)
capture.set(cv.CAP_PROP_FPS, 25) #   25   


7.次に、ループで、Webカメラからフレームを順番に読み取り、顔検出器に送信します。



while True:
    rtrn, image = capture.read()
    gr = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    faces_detect = cascade_of_face.detectMultiScale(
        image=gr,
        minSize=(15, 15),
        minNeighbors=10,
        scaleFactor=1.2
    )
    for (x_face, y_face, w_face, h_face) in faces_detect:
        cv.rectangle(image, (x_face, y_face), (x_face + w_face, y_face + h_face), (0, 0, 255), 2)
    cv.imshow("Image", image)
    if cv.waitKey(1) == 27:  # Esc key
        break
capture.release()
cv.destroyAllWindows()


8.次に、すべてを1つにまとめて、Webカメラからビデオをキャプチャし、その顔を認識して結果をファイルに保存するプログラムを入手しましょう。



import cv2 as cv
faceCascade = cv.CascadeClassifier('C:/Users/Zet/Desktop/Python/test_opencv/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml')
capture = cv.VideoCapture(0)
capture.set(cv.CAP_PROP_FPS, 25)
codec = cv.VideoWriter_fourcc(*'XVID')
output = cv.VideoWriter('saved_from_camera.avi', codec, 25.0, (640, 480))
while True:
    rtrn, image = capture.read()
    gr = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    faces_detect = faceCascade.detectMultiScale(
        image=gr,
        minSize=(15, 15),
        minNeighbors=10,
        scaleFactor=1.2
    )
    for (x_face, y_face, w_face, h_face) in faces_detect:
        cv.rectangle(image, (x_face, y_face), (x_face + w_face, y_face + h_face), (255, 0, 0), 2)
    cv.imshow("Image", image)
    output.write(image)
    if cv.waitKey(1) == 27:  # Esc key
        break
output.release()
capture.release()
cv.destroyAllWindows()


すべて!あなたは、コンピュータがどのように見えるかを理解するための最初のステップであるプログラムを作成しました。さらに、たとえば、ニューラルネットワークをトレーニングすることで、コンピューターがビデオ内の特定の人物を認識するように、顔の認識を改善できます。より複雑なオブジェクト(トラフィック追跡など)を認識して分析するように構成された検出器を作成することもできます。また、コンピュータビジョンの他の、それほど興味深いタスクを解決することもできます。



ボーナス



実際にプログラムを適用しましょう-アカウントの下でログインを追跡します。



  1. タスクスケジューラに移動しましょう(標準のWindows検索で見つけることができます)。
  2. 簡単なタスクを作成し、タイトルと簡単な説明を付けましょう。






3. [次へ]をクリックして、[トリガー]アイテムに移動します。ここでは、タスクの起動が発生するイベントを選択します。「Windowsに入るとき」を選択します。



4.次に、実際には、「プログラムの実行」を示します。



5.「アクション」で、python.exeへのパスを指定し、「パラメーター」で、プログラムへのパスを指定します







その結果、ログイン時に、アカウントでログインした人が記録され、動画が保存されます。したがって、証拠の記録を維持しながら、不在時に誰がコンピュータで働いていたかを追跡できます。



All Articles