본문으로 바로가기

요즘 학습된 모델을 바로 적용하는 것이 유행인것 같네요. 어렵고 장비빨(^^)이 필요한 학습은 우수한 분들께 맡기고, 저처럼 실력이 미천한 아이들은 그걸 따라 사용하는 것 만으로도 즐거운 일이죠~^^. 아무튼 그런 시류에 맞춰 저도 요즘 구글이 배포한 학습이 완료된 모델을 단순히 제 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 STIMA 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 신고

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

  14. ERIN 2018.09.19 11:49 신고

    이 안에서 구체적으로 눈 코 입 뿐만 아니라 귀를 찾고 싶다면 어떻게 하면 될까요? ㅎㅎ 흥미롭네요

  15. 연주 2019.01.22 10:55 신고

    안녕하세요! 글 잘 보고 댓글남깁니다!
    저는 이제 막 opencv 연구 하고있는 대학생입니다.
    혹시 저렇게 얼굴이나 몸을 검출하고 나서 안경이나 옷을 오버레이 하고 싶은데 알고 계신 정보가 있으실까요? 저는 사진이 아니라 직접 웹캠에서 비친 모습을 인식하고 오버레이하고 싶습니다.

  16. 콩이 2019.01.26 15:22 신고

    안녕하세요
    제가 프로그래밍 언어는 처음인지라 opencv를 어떻게 실행시키는지부터 막혔어요ㅠ
    혹시 xcode 를 설치한 이후에 어떻게 opencv를 사용하는건지 여쭤봐도 될까요? 너무 막막해서 이렇게 글을 남겨요ㅜㅜ
    감사합니다

    • BlogIcon PinkWink 2019.01.27 09:12 신고

      저는 python의 모듈 관리자인 pip로 그냥 설치했습니다. 구글에서 pip install opencv라고 검색하시면 아마 나타날겁니다.

  17. BlogIcon 데이터스토리 2019.03.08 11:57 신고

    안녕하세요. 친절한 설명 감사합니다.
    제가해 보니, 위에서 처럼 2명이 아닌 아이만 인식을 했습니다.
    다른 사진(얼굴이 큰)을 해 보니, 인식을 못했어요...
    왜 그런지 궁금해하고 있습니다.
    혹시..