유진의 코딩스토리
openCV face Detection 실습 본문
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 |