본문으로 바로가기

요즘 학습된 모델을 바로 적용하는 것이 유행인것 같네요. 어렵고 장비빨(^^)이 필요한 학습은 우수한 분들께 맡기고, 저처럼 실력이 미천한 아이들은 그걸 따라 사용하는 것 만으로도 즐거운 일이죠~^^. 아무튼 그런 시류에 맞춰 저도 요즘 구글이 배포한 학습이 완료된 모델을 단순히 제 PC에 설치만(^^)해서 테스트해보았는데. 엄청 좋은 결과가 나오더라구요. 그 과정을 이제 몇 번 나눠서 쭈욱 블로그에 올릴건데요. 그 처음으로, 딥러닝같은 아이가 아니라, 그냥 OpenCV만 사용한 과정을 먼저 쭈욱 이야기하려고 합니다. 

결론은 오늘은 제가 OpenCV라는 신기한 아이를 처음 접하고, 단 몇일만에 Python을 이용해서 예제를 따라한 내용을 제가 블로그질(^^)을 하는 원래의 습관처럼 적겠다는 거죠. ^^ 

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

일단 시작은 이렇게 합니다.^^. 아 저는 Python은 3.6이고, anaconda 5.1 버전인데... 최신 OpenCV가 설치가 되지 않았습니다. 그래서, 저는 conda install -c conda-forge opencv=3.2로 설치를 했습니다. 그리고, haarcascades 파일들의 경로를 입력해야하는데, 그걸 제가 mac에서 찾지를 못해서.ㅠㅠ. 그 파일들만 따로 OpenCV Github사이트에서 받았습니다.

저 사이트죠^^

그걸 저렇게 잘 다운로드 해 줬죠. 저 파일들만 봐도, 안경쓴 눈, 그냥 눈, 얼굴, 몸, 상반신, 하반신, 웃는 입 등을 알 수 있도록 되어 있죠.

face_cascade = cv2.CascadeClassifier(
    './data/haarcascades/haarcascade_frontalface_default.xml')

사용할 아이는 위와 같이 합니다. 테스트용 사진.ㅠㅠ. 뭐 저는 저희 아가 미바뤼죠^^

image = cv2.imread('./img_MiBaRui3.jpg')
grayImage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

plt.figure(figsize=(12,8))
plt.imshow(grayImage, cmap='gray')
plt.xticks([]), plt.yticks([])  # to hide tick values on X and Y axis
plt.show()

이렇게 읽어봅니다.

ㅎㅎ 우리딸... 많이 컸어요^^ 53개월 아기의 위엄을 보여주고 있네요^^ 그리고 위에서 지정한 얼굴 인식을 시도해보죠.

faces = face_cascade.detectMultiScale(grayImage, 1.03, 5)

print(faces.shape)
print("Number of faces detected: " + str(faces.shape[0]))

짠~

넵.. 두 개의 얼굴을 잡네요. 와우~

faces

그럼...

저렇게 잡은 얼굴의 박스 좌표를 알려줍니다.

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

cv2.rectangle(image, ((0,image.shape[0] -25)), 
              (270, image.shape[0]), (255,255,255), -1);
cv2.putText(image, "PinkWink test", (0,image.shape[0] -10), 
            cv2.FONT_HERSHEY_TRIPLEX, 0.5,  (0,0,0), 1);

plt.figure(figsize=(12,12))
plt.imshow(image, cmap='gray')
plt.xticks([]), plt.yticks([])  # to hide tick values on X and Y axis
plt.show()

그걸 이용해서 박스를 이미지에 덮는거죠^^

아하~ 어떤가요... 대단하죠. 영상인식이 뭔지 모르는 일자 무식도 여기까지 해볼 수 있습니다.^^

body_cascade = cv2.CascadeClassifier('./data/haarcascades/haarcascade_fullbody.xml')
body = body_cascade.detectMultiScale(grayImage, 1.01, 10)

for (x,y,w,h) in body:
    cv2.rectangle(image,(x,y),(x+w,y+h),(0,0,255),3)

plt.figure(figsize=(12,12))
plt.imshow(image, cmap='gray')
plt.xticks([]), plt.yticks([])  # to hide tick values on X and Y axis
plt.show()

이번에는 몸 전체를 찾으라고 해보죠~^^ 그러면 방금 얼굴을 찾은 사진에 몸도 추가로 표시하게 됩니다.

짠~~~^^ 이번에는 반복문을 이중으로 사용해서 몸은 다찾고, 찾은 몸안에 있는 얼굴만 찾으라고 하는 거죠...

image = cv2.imread('./img_MiBaRui3.jpg')
grayImage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

body_cascade = cv2.CascadeClassifier('./data/haarcascades/haarcascade_fullbody.xml')
body = body_cascade.detectMultiScale(grayImage, 1.01, 10)

for (x,y,w,h) in body:
    cv2.rectangle(image,(x,y),(x+w,y+h),(0,0,255),3)
    
    body_image_gray = grayImage[y:y+h, x:x+w]
    body_image_color = image[y:y+h, x:x+w]
    
    faces_in_body = face_cascade.detectMultiScale(body_image_gray)

    for (xf,yf,wf,hf) in faces_in_body:
        cv2.rectangle(body_image_color,(xf,yf),(xf+wf,yf+hf),(0,255,0),2)
        
        
plt.figure(figsize=(12,12))
plt.imshow(image)
plt.xticks([]), plt.yticks([])  # to hide tick values on X and Y axis
plt.show()

너무나 쉽게^^ 이렇게 말이죠....

어떤가요.... 괜찮죠... ㅎㅎ.. 물론 딥러닝을 이용한 멋진 결과보다는 좀 떨어질 수 있지만, OpenCV라는 아이를 이용해서 간결하고 쉽게 접근해 보았습니다. 다음에는 더 재미있는 걸로 접근해 볼께요^^


댓글을 달아 주세요

  1. BlogIcon 스티마 2018.04.27 08:36 신고

    와, 이런식으로 안면이식이 가능해지는군요.
    멋집니다.

  2. BlogIcon Bliss :) 2018.04.27 11:11 신고

    아ㅋㅋㅋㅋ 저 얼마전에 어느 글을 봤는데 어느 프로그래머가 업무중 자유롭게 컴 쓰려고 카메라를 입구쪽으로 설치하고 상관이 들어오면 얼굴인식을 해서 화면 배경 자동으로 바뀌게 하도록 프로그램을 만들었더라구요ㅋㅋㅋ 그거랑 거의 같은 거네요ㅎㅎㅎ 그 글 보면서 대개 똑똑하다고 생각했는데 역시 Pinkwink님도!!! 숫자인식에 이어 얼굴과 몸인식 다 되는게 신기합니다. 훅 커진 미바뤼 여전히 사랑스러우면서도 어엿함이 느껴지네요. 행복한 하루 되세요^^

  3. BlogIcon 귀요미디지 2018.04.27 11:52 신고

    ㅎㅎ 즐거운 금요일 되세요 ^^

  4. BlogIcon Deborah 2018.04.27 19:36 신고

    어머나 신기해요. 이런식으로 얼굴 인식도 하는군요. ^^ 새로운것을 배우고갑니다.

  5. BlogIcon 핑구야 날자 2018.04.28 06:54 신고

    설명해주시는 걸 보면 정말 인식이 쉬운 거 같아요 주말 잘 보내세요

  6. BlogIcon 보미 2018.04.29 01:44 신고

    얼굴인식 신기하네요.

  7. BlogIcon IT넘버원 2018.04.29 04:10 신고

    와 신기하네요.
    주제에 멋어난 말이지만 인공지능에도 탑재된다면 어떠한 일이 벌어질지 상상이 됩니다.

  8. BlogIcon 시골청년v 2018.04.29 15:50 신고

    이런식으로도 가능하네요 ㅎ
    포스팅하고는 관계없는데, 맥북 사용하시나요?

  9. BlogIcon 공수래공수거 2018.04.30 11:15 신고

    아가가 정말 폭풍 성장을 했네요^^

  10. BlogIcon peterjun 2018.05.01 02:50 신고

    재미있네요.
    중국에선 이런 분야들이 엄청 발전하고 있더군요.
    최근에 그런 기사들을 좀 접했던 것 같아요. ^^

  11. BlogIcon jangstory 2018.05.03 13:51 신고

    글 포스트하실때 코드 삽입은 어떻게 하시나요?

    • BlogIcon PinkWink 2018.05.03 16:04 신고

      저는.. 약간 노가다를 하는데요ㅠㅠ.

      http://hilite.me/

      위 사이트에서 넣고 싶은 코드를 밀어넣고, HTML 코드를 받아서, 티스토리 편집화면 HTML 모드에서 밀어넣습니다.

      약간의 요령이 필요하긴 했는데.. 어렵지 않고, 지그은 익숙해서 괜찮네요...

    • BlogIcon jangstory 2018.05.03 16:09 신고

      그렇군요.... 마크다운 도입이 되면 좋겟네요...

    • BlogIcon PinkWink 2018.05.03 17:45 신고

      네. 그것때문에.. 한때는 쿨하게.. github으로 갈아탈까 하다가..
      이제는 너무 많아진 글을 이전할 엄두가 나지 않아서...
      살짝 포기 상태랍니다.^^

  12. BlogIcon 구차니 2018.05.08 17:34 신고

    문득 궁금한건데.. xbox kinect 처럼
    python + openCV로도 사람 골격구조 데이터를 뽀아낼수 있을까요?

  13. NickGom 2018.06.01 00:13 신고

    혹시 일반 카메라러더 사용이 가능한가요??