본문 바로가기
OpenCV/OpenCV-Chapter

CH08 OpenCV-Python 캐스케이드(Cascade)

by kiimy 2021. 12. 24.
728x90
728x90

Viola - Jones 얼굴 검출기

Positive 영상(얼굴 영상)과 negative 영상(얼굴 아닌 영상)을 훈련하여 빠르고

정확하게 얼굴 영역을 검출

• 기존 방법과의 차별점

유사 하르(Haar-like) 특징을 사용

AdaBoost에 기반한 강한 분류 성능

== 간단한 형태의 분류기를 여러개 만들어서 강력한 분류기를 만드는 것

캐스케이드(cascade) 방식을 통한 빠른 동작 속도

• 기존 얼굴 검출 방법보다 약 15배 빠르게 동작

 

유사 하르 특징(Haar-like features)

• 사각형 형태의 필터 집합을 사용

흰색 사각형 영역 픽셀 값의 합에서 검정색 사각형 영역 픽셀 값을 뺀 결과 값을 추출

• 24x24 부분 영상에서 얼굴 판별에

유용한 유사 하르 특징을 선별

 

 

 

 

 

캐스케이드 분류기(Cascade classifier)

• 일반적인 영상에는 얼굴이 한 두개 있을 뿐, 나머지 영역은 대부분 non-face 영역

• Non-face 영역을 빠르게 skip하도록 다단계 검사 수행

Haar Cascade Visualization - YouTube

얼굴 눈 검출

src = cv2.imread('ch08\\images\\lenna.bmp')

if src is None:
    print('Image load failed!')
    sys.exit()

# Cascade 클래스 객체 생성
classifier = cv2.CascadeClassifier('ch08\\haarcascade_frontalface_alt2.xml')
eye_classifier = cv2.CascadeClassifier('ch08\\haarcascade_eye.xml')

if classifier.empty():
    print('XML load failed')
    sys.exit()

tm = cv2.TickMeter()
tm.start()

faces = classifier.detectMultiScale(src)
'''
cv2.CascadeClassifier.detectMultiScale(image, scaleFactor=None,
                    minNeighbors=None, flags=None, minSize=None, maxSize=None) -> result

scaleFactor가 클 수록 빨라짐(default = 1.1(1.2))
but 특정 크기의 객체를 놓칠 수 있다(filter size?)

minSize, maxSize (최소, 최대 객체크기) 
= 너무 작은 객체가 아니면 minSize 설정하는 것이 좋다
==> 파라미터를 적절히 조절하면 속도가 빨라짐

result: 검출된 객체의 사각형 정보(x, y, w, h)를 담은 shape=(N, 4)
        dtype=numpy.int32
'''

tm.stop()
print(tm.getTimeMilli())
print(faces)

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

    # 얼굴에서 윗 부분만 ROI
    faceROI = src[y1:y1 + h1 //2, x1:x1 + w1]
    eyes = eye_classifier.detectMultiScale(faceROI)

    for (x2,y2,w2,h2) in eyes:
        center = (x2 + w2 // 2, y2 + h2 // 2)
        cv2.circle(faceROI, center, w2 // 2, (255,255,0), 2, cv2.LINE_AA)
        
cv2.imshow('src', src)
cv2.waitKey()

728x90

댓글