유진의 코딩스토리

openCV face Detection 실습 본문

Microsoft AI School/Azure Open AI

openCV face Detection 실습

놀고먹는 유진 2024. 12. 9. 12:29

openCV로 Webcam Streaming 불러오기

import gradio as gr
import cv2

def stream_webcam(image):
    return image

with gr.Blocks() as demo:
    webcam_input = gr.Image(label="카메라", sources="webcam", streaming=True, width=480, height=270, mirror_webcam=False)
    output_image = gr.Image(label='검출 화면')
    
    webcam_input.stream(fn=stream_webcam, inputs=[webcam_input], outputs=[output_image])

demo.launch()

 

 

HaarCascade?

HaarCascade는객체검출(특히얼굴검출)에서 널리 사용되는기법으로, Viola와Jones가 제안한 알고리즘에 기반을 두고 있다.이 알고리즘은 매우 효율적이며 실시간으로 객체를 검출할 수 있습니다. OpenCV에서는이 알고리즘을 구현하여 제공하고있으며, 다양한 객체(예: 얼굴, 눈, 자동차번호판등)를 검출하는 데 사용된다.

  • Haar특징은 이미지의 특정 영역에서 밝기 차이를 이용하여 객체를 구분하는 데 사용됩니다. 기본적인 Haar특징은 흰색과 검은색 사 각형의 합과 차를 계산하여 정의됩니다. 예를 들어, 얼굴 검출에서는 눈 주위의 어두운 영역과 이마의 밝은 영역 간의 차이를 특징으로 삼을 수 있습니다.
  • 적분 이미지는 원본 이미지의 픽셀 값 합을 빠르게 계산할 수 있도록 변환된 이미지입니다. 이를 통해 Haar특징을 매우 빠르게 계산 할 수 있습니다. 적분 이미지를 사용하면 사각형 영역의 합을 상수 시간 내에 계산할 수 있습니다. 
  • Adaboost는 약한 분류기(weak classifier)를 결합하여 강한 분류기(strong classifier)를 만드는 기법입니다. HaarCascade에서는 여러 Haar특징을 약한 분류기로 사용하여 객체를 검출합니다. Adaboost는 객체와 비객체를 구분하는 데 가장 유용한 특징을 선택하여 검출 정확도를 높입니다. 
  • Cascade Classifier는 여러 단계의 분류기로 구성된 구조입니다. 각 단계는 점점 더 복잡한 특징을 사용하여 객체를 검출합니다.
  • 초기 단계에서는 간단하고 빠른 특징을 사용하여 많은 후보 영역을 제거하고, 후속 단계에서는 더 정교한 특징을 사용하여 최종 검출 을 수행합니다. 이를 통해 연산 효율성을 극대화할 수 있습니다.

얼굴 탐지 기능 추가

import gradio as gr
import cv2
import time

# Haar Cascade 분류기 파일 경로
# https://github.com/kipr/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml
casCadePath = cv2.data.haarcascades + "haarcascade_frontalface_default.xml"
faceCasCade = cv2.CascadeClassifier(casCadePath)


# 얼굴 탐지 함수
def detect_faces(origin_image):
    # 이미지를 RGB에서 BRG로 변환
    image = cv2.cvtColor(origin_image, cv2.COLOR_RGB2BGR) 
    
    
    # 얼굴 검출
    faces = faceCasCade.detectMultiScale(
        image=image,
        scaleFactor=1.1,
        minNeighbors=5,
        minSize=(30,30),
    )
    print(faces)    # 탐지된 얼굴 좌표 출력

# 웹캠 스트리밍 함수
def stream_webcam(image):
    detect_faces(image)
    return image

with gr.Blocks() as demo:
    webcam_input = gr.Image(label="카메라", sources="webcam", streaming=True, width=480, height=270, mirror_webcam=False)
    output_image = gr.Image(label='검출 화면')
    
    webcam_input.stream(fn=stream_webcam, inputs=[webcam_input], outputs=[output_image])

demo.launch()

 

 

얼굴 객체 탐지 사각형 그리기 기능 추가

import gradio as gr
import cv2
import time

# Haar Cascade 분류기 파일 경로
# https://github.com/kipr/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml
casCadePath = cv2.data.haarcascades + "haarcascade_frontalface_default.xml"
faceCasCade = cv2.CascadeClassifier(casCadePath)     # Haar Cascade로 얼굴 탐지기 초기화



# 얼굴 탐지 함수
def detect_faces(origin_image):
    # 이미지를 RGB에서 BRG로 변환
    image = cv2.cvtColor(origin_image, cv2.COLOR_RGB2BGR) 
    
    
    # 얼굴 검출
    face_list = faceCasCade.detectMultiScale(
        image=image,
        scaleFactor=1.1,    # 탐지 시 이미지 축소 비율
        minNeighbors=5,     # 최소 이웃 수 설정
        minSize=(30,30),    # 탐지할 얼굴의 최소 크기 설정
    )
    
    
    # 탐지된 얼굴들에 대해 반복
    for face in face_list:
        x, y, w, h = face   # 얼굴의 좌표와 크기 추출
        cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)    # 얼굴 영역에 초록색 사각형 그리기
        
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # 이미지를 다시 BGR에서 RGB로 변환
    
    return image     # 처리된 이미지를 반환

# 웹캠 스트리밍 함수
def stream_webcam(image):
    detected_image = detect_faces(image)
    return detected_image

with gr.Blocks() as demo:
    webcam_input = gr.Image(label="카메라", sources="webcam", streaming=True, width=480, height=270, mirror_webcam=False)
    output_image = gr.Image(label='검출 화면')
    
    webcam_input.stream(fn=stream_webcam, inputs=[webcam_input], outputs=[output_image])

demo.launch()

'Microsoft AI School > Azure Open AI' 카테고리의 다른 글

Yolo 객체 탐지 실습  (0) 2024.12.10
Azure AI Servies - AI Vision2  (0) 2024.12.04
Azure AI Servies - AI Vision  (0) 2024.12.04
Azure AI servies - AI Language  (0) 2024.12.03
Azure AI servies - Document Intelligence  (0) 2024.12.02