봉식이와 캔따개

Python과 OpenCV를 이용하여 웹캠 실시간 face detection + 비식별화 본문

머신러닝, 딥러닝/이미지처리

Python과 OpenCV를 이용하여 웹캠 실시간 face detection + 비식별화

봉식이누나 2020. 4. 13. 17:03
반응형

 

기존에 face_recognition 라이브러리를 사용하여 얼굴을 찾아내고 블러처리해서 비식별화 시키는코드가 있었는데

손이 얼굴에 아주 조금만 겹쳐도 얼굴을 인식하지 못해 비식별화가 풀리는 문제점이 있었다.

 

이 문제점을 보완해보는것이 저번주 일과였다...

 

 

 

일단 caffemodel을 이용하였는데 원래는 얼굴을 학습시켜서 face recognition까지 가능한듯 하다.

하지만 이 얼굴이 누구얼굴인가는 아직 중요하지 않으므로 패스...

 

 

 

from imutils.video import VideoStream
from imutils.video import FPS
import numpy as np
import imutils
import time
import cv2
import os

 

필요한 친구들 import~

 

 

 

 

 

protoPath = "deploy.prototxt"
modelPath = "res10_300x300_ssd_iter_140000.caffemodel"
detector = cv2.dnn.readNetFromCaffe(protoPath, modelPath)

 

모델을 가져와준다.

 

 

 

 

vs = VideoStream(src=0).start()
time.sleep(2.0)

fps = FPS().start()

while True:
    frame = vs.read()
    frame = imutils.resize(frame,width=600)
    (h, w) = frame.shape[:2]
    
    imageBlob = cv2.dnn.blobFromImage(cv2.resize(frame,(300,300)),1.0, (300,300),(104.0,177.0,123.0), swapRB=False, crop=False)
    
    detector.setInput(imageBlob)
    detections = detector.forward()
    
    for i in range(0,detections.shape[2]):
        confidence = detections[0,0,i,2]
        
        if confidence > 0.5:
            box = detections[0,0,i,3:7] * np.array([w,h,w,h])
            (startX, startY, endX, endY) = box.astype("int")
            
            face = frame[startY:endY, startX:endX]
            (fH, fW) = face.shape[:2]
            
            if fW < 20 or fH < 20:
                continue
                
            faceBlob = cv2.dnn.blobFromImage(face, 1.0 / 255,(96, 96), (0, 0, 0), swapRB=True, crop=False)
            
            y = startY - 10 if startY - 10 > 10 else startY + 10
            cv2.rectangle(frame, (startX, startY), (endX, endY),
                (0, 0, 255), 2)

    fps.update()
    cv2.imshow("Frame", frame)
    key = cv2.waitKey(1) & 0xFF
    if key == ord("q"):
        break
fps.stop()
cv2.destroyAllWindows()
vs.stop()

 

 

우선 face detection 코드 먼저...

얼굴에 네모쳐주는 코드다.

 

 

 

 

마리오찡...

 

 

 

 

이제 이걸 네모대신 블러처리 하도록 바꾸어 주면 된다.

cv2.rectangle 부분을 지우고 밑의 코드로 바꾸어준다.

 

face_image = cv2.GaussianBlur(face,(99,99), 30)
            frame[startY:endY, startX:endX] = face_image

 

 

 

 

 

 

 

 

굿굿굿

참고로 손으로 좀 가리고 마스크 쓴 상태에서도 얼굴을 인식하고 가려준다.

근데 그동안 다른 소스들에서는 cv2.VideoCapture(0)로 웹캠영상을 불러들였는데 VideoStream은 뭘까...

 

아무리 찾아봐도 둘의 차이점..장단점이 안나온다 ㅠㅠ

 

 

 

 

 

 

 

 

 

 

www.pyimagesearch.com/2020/04/06/blur-and-anonymize-faces-with-opencv-and-python/

 

Blur and anonymize faces with OpenCV and Python - PyImageSearch

  In this tutorial, you will learn how to blur and anonymize faces using OpenCV and Python. Today’s blog post is inspired by an email I received last week from PyImageSearch reader, Li Wei: Hi Adrian, I’m working on a…

www.pyimagesearch.com

 

반응형
Comments