728x90
반응형

요즘 실시간 특정 객체 모자이크 프로그램을 구현해보고 있는데, 관련 내용들과 코드를 하나씩 천천히 올리게 될 것 같다.

맨 첫 번째 과정은 얼굴 탐지이다. 얼굴 탐지를 하기 위해선 opencv에 있는 haarcascades 파일이 필요한데

아래 github에서 다운로드 가능하다.

https://github.com/opencv/opencv/tree/master/data/haarcascades

 

opencv/opencv

Open Source Computer Vision Library. Contribute to opencv/opencv development by creating an account on GitHub.

github.com

필요한 라이브러리: Numpy, OpenCV, matplotlib

우선 라이브러리를 import 한다. matplotlib은 이미지 확인용이라 필수는 아닙니다!

import numpy as np
import cv2
from matplotlib import pyplot as plt
%matplotlib inline

 

그다음은 얼굴 탐지를 할 이미지를 불러온다. 저는 기생충의 기정, 기우의 이미지를 사용했습니다. 

image = cv2.imread('image/bong.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

plt.imshow(gray, cmap='gray')
plt.xticks([]), plt.yticks([])
plt.show()

위의 코드를 실행하면 아래와 같이 이미지를 무사히 불러온 것을 확인할 수 있다.

기정과 기우

그다음은 haarcascades 파일을 사용해서 얼굴 탐지를 해보자.

haarcascades 파일에는 다양한 xml 파일이 들어 있는데 이것들을 사용해서 사람의 얼굴, 눈, 전신 등등을 탐지할 수 있다.

haarcascades

우리의 목표는 얼굴 탐지이므로 haarcascade_frontalface_default.xml 파일을 사용하도록 하자.

xml = 'haarcascades/haarcascade_frontalface_default.xml'
face_cascade = cv2.CascadeClassifier(xml)
faces = face_cascade.detectMultiScale(gray, 1.2, 5)

print("Number of faces detected: " + str(len(faces)))

위의 코드를 실행하면 아래와 같이 사람 얼굴 2개를 탐지했음을 확인할 수 있다.

얼굴 2개 탐지

현재 faces 변수 안에는 아래와 같이 x, y축 좌표값과 얼굴의 높이와 너비인 w, h 값이 리스트 형태로 들어있다. 

마지막으로 이상한 곳을 얼굴로 탐지하지 않고 정확하게 탐지했는지 확인을 해보자. 

cv2.rectangle과 faces에 들어있는 x, y, w, h 값을 통해 이미지에 박스를 치는 방식으로 확인을 한다.

if len(faces):
    for (x,y,w,h) in faces:
        cv2.rectangle(image,(x,y),(x+w,y+h),(255,0,0),2)

plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB), cmap='gray')
plt.xticks([]), plt.yticks([]) 
plt.show()

위의 코드를 실행하면 아래와 같이 기정과 기우의 얼굴을 정확하게 탐지했음을 확인할 수 있다.

기정과 기우의 얼굴 탐지 성공

아래는 전체 코드를 정리한 코드이다. 이 코드를 보면 얼굴 탐지가 정말 짧은 코드로 가능하다는 것을 알 수 있다.

import numpy as np
import cv2
from matplotlib import pyplot as plt
%matplotlib inline

image = cv2.imread('image/bong.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

xml = 'haarcascades/haarcascade_frontalface_default.xml'
face_cascade = cv2.CascadeClassifier(xml)
faces = face_cascade.detectMultiScale(gray, 1.2, 5)

print("Number of faces detected: " + str(len(faces)))

if len(faces):
    for (x,y,w,h) in faces:
        cv2.rectangle(image,(x,y),(x+w,y+h),(255,0,0),2)

plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB), cmap='gray')
plt.xticks([]), plt.yticks([]) 
plt.show()

 

github: https://github.com/kimjinho1/Real-time-specific-object-mosaic-using-deep-learning/blob/master/1.%20Face_detection.ipynb

 

kimjinho1/Real-time-specific-object-mosaic-using-deep-learning

딥러닝을 이용한 실시간 특정 객체 모자이크 처리 . Contribute to kimjinho1/Real-time-specific-object-mosaic-using-deep-learning development by creating an account on GitHub.

github.com

728x90
반응형

+ Recent posts