Opencv

아나콘다 OpenCV 웹캠에 의한 얼굴인식

coding art 2020. 5. 2. 16:35
728x90

윈도우즈10 의 아나콘다에서 OpenCV가 특정한 가상환경에 설치가 되어 있다면 웹캠에 의하여 안면 인식 작업을 해보자. 안면 인식을 위한 파이선 코드는 윈도우즈건 라즈베리 파이건 OpenCV 가 설치되어 있다면 함께 사용할 수 있다. 단 라즈베리 파이에서 웹캠 사용을 위해서는 ConfigurationInterface에서 CameraDisable 로 설정해 두어야 한다. 그래야 PiCamera 든 웹캠이든 cv2.VideoCaputre(0) 명령에 의해 Default 카메라로 인식이 된다. 라즈베리파이 보드를 포함하여 PiCamera 보다 웹캠이 선호되는 이유는 설치 및 배선이 대단히 편리하기 때문일 것이다.

 

이번에 소개하는 파이선 안면 인식 코드는 사실상 라즈베리 파이용으로서 그것도 Jessie 버전용 오픈 소스였는데 2017년 가을에 라즈베리 파이3에서 PiCamera로 실행해 보았더니 다소 버벅 거리는 느낌이 강했지만 일단 실행이 된다는 것을 확인하였다.

 

How to install OpenCV on Raspberry Pi and do Face Tracking

http://www.mindsensors.com/blog/how-to/how-to-install-opencv-on-raspberry-pi-and-do-face-tracking

 

그 후로 OpenCV를 설치하였던 SD 카드를 태워먹는 사건도 있었고 OS 또한 Jessie에서 Stretch로 바뀌는 바람에 OpenCV 를 설치할 때까지 실행이 보류하였다가 2018년 가을 이후에 다시 예전의 코드를 실행해 보았으며 아울러 Haarcascade 라이브러리를 사용하여 작성한 컴퓨터 비전 코드들을 실행 보았고 그 결과들을 파이선 코딩 초보자를 위한 텐서플로우OpenCV 머신 러닝” 7장에 편집하여 201812월 말에 출간하였다. 그 후로도 상당한 시간이 흘렀지만 아직 라즈베리 파이 Stretch 버전을 클론하여 사용 중인데 최근 201912월에 인텔사의 Compute Stick2 NCU를 구입하여 Openvino를 설치 후 실시간 AI 시스템을 구성해 보았다.

 

한편 파이선 와이파딩 작업을 위해 2017년 가을에 사용해 보았던 Flask Workframe을 사용하여 웹에 라이브 동영상 올린 후 웹서버로 네트워킹 된 컴퓨터에서 웹서버로 사용할 수 있다는 점이 흥미로워 이 오픈 소스 face_detect.py를 다시 끄집어내어 사용하게 되었다. 윈도우즈 PC에 웹캠이 설치된 상태에서 마이크로 소프트 카메라가 작동 된다면 별도의 드라이버 설치필요 없이 OpenCVcv2.VideoCature(0) 명령에 의해 인식이 가능하다. 안면 인식을 파이선 코드 구조를 살펴보자. 우선 안면 인식 파이선 코드인 face_detect.py haarcascade_frontalface_default.xml 라이브러리가 동일한 폴더 내에 위치해야 한다. 0.2초 웹캠을 워밍업 시키고 안면 인식 한 사이클 루프에 소여되는 시간을 계산할 수 있도록 현재의 시각을 밀리 초 단위로 미리 환산해 둔다.

웹캠 이미지를 초당 30 frame 으로 읽어 들인 imagecv2.COLOR_BGR2GRAY 형태로 처리하자. BGR RGB 란 용어가 지금처럼 넓게 사용되기 이전부터 인텔이 사용했던 용어로서 RGB 와 동일한 의미이다.

.detectMultiScal() 명령에 의해 6(minNeighbors) 이내의 안면들의 검출되면 소요된 시간과 찾아낸 안면 수를 출력한다. 각 안면의 사각형 기준좌표 (x,y)Default (w)과 높이(h)를 사용하여 원을 그릴 중심과 반지름 크기를 산출하여 작도한다. rectangle 명령을 사용하면 폭(w)과 높이(h)를 그대로 사용해도 된다. 이 폭과 높이는 .detectMultiScal() 명령에서 구체적으로 Size를 설정할 수 있다. 특히 파라메터 scaleFactor 값을 크게 가져가면 이미지에 포함된 작은 object 검출이 실패할 수도 있으므로 1.0~1.1 사이 값이 적절하다.

웹캠 루프 실행에 따른 시간 출력을 보면 80~100 밀리 초 수준임을 알 수 있다. 윈도우즈 PC에서는 상당히 빨리 실행이 되지만 반면에 라즈베리 파이에서는 600~730 밀리 초로 거의 7배가량 실행 속도가 상당히 느릴 수도 있다.

#face_detect.py

import cv2
import numpy as np
import sys
import time

faceCascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

camera = cv2.VideoCapture(0)
time.sleep(0.2)
lastTime = time.time()*1000.0

while True:
 # and occupied/unoccupied text
    ret, image = camera.read()
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    faces = faceCascade.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=6 )
    print (time.time()*1000.0-lastTime," Found {0} faces!".format(len(faces)) )
    lastTime = time.time()*1000.0
    # Draw a circle around the faces
    for (x, y, w, h) in faces:
        cv2.circle(image,(int(x+w/2),int(y+h/2)),int((w+h)/3),(255,255,255),3)

    cv2.imshow("Frame", image)
   
    key = cv2.waitKey(1) & 0xFF
   
 # if the `q` key was pressed, break from the loop
    if key == ord("q"):
        break