비전

[MediaPipe] face_detection으로 얼굴 모자이크

왕초보코딩러 2024. 9. 4. 18:51
728x90

미디어파이프란 구글에서 제공하는 AI 오픈소스이다

 

 

미디어파이프 설치

pip install mediapipe

 

 

mp.solutions: 미디어파이프 솔루션들이 포함되어 쉽게 사용할 수 있다

 

 

- 얼굴 탐지

mp.solutions.face_detection

- 얼굴 매쉬 

mp.solutions.face_mesh

- 손 추적

mp.solutions.hands

- 포즈 추정

mp.solutions.pose

- 신체 전체 추적

mp.solutions.holistic

- 랜드마크 시각화 툴

mp.solutions.drawing_utils

- 미리 정의된 스타일 툴

mp.solutions.drawing_styles

- 인물과 배경 분리

mp.solutions.selfie_segmentation

 

https://github.com/google-ai-edge/mediapipe/blob/master/docs/solutions/face_detection.md

 

mediapipe/docs/solutions/face_detection.md at master · google-ai-edge/mediapipe

Cross-platform, customizable ML solutions for live and streaming media. - google-ai-edge/mediapipe

github.com

 


 

모자이크 하는 법

사진을 축소하고 확대하면 픽셀이 깨진다

사진에서 모자이크를 원하는 부분 검출(bbox) -> bbox를 자른다 -> 축소 -> 확대 -> 다시 원본 자리에 넣는다

face_detection은 바운딩 박스를 지원해주기 때문에 이를 활용해보겠습니다.

 

이미지로 먼저 해보겠습니다.

import mediapipe as mp
import cv2

mp_facedetection = mp.solutions.face_detection
mp_drawing = mp.solutions.drawing_utils

face_detection = mp_facedetection.FaceDetection()

 

 

 

이미지 불러오고, face_detection에 넣기

img = cv2.imread('data/karina.jpg')
    
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    
# 결과
result = face_detection.process(img_rgb) # rgb로 넣어줘야 한다

 

정규화된 좌표를 실제 좌표로 바꾸기 위해 실제 이미지의 크기를 변수에 저장한다

# 실제 이미지 height, width
img_height, img_width, _ = img.shape

 

얼굴이 인식됐다면 face_detection의 바운딩 박스 좌표를 가져온다

(xmin, ymin, width, height)

# 얼굴 인식이 됐다면
if result.detections:
    for detection in result.detections:                
        # bbox값 가져오기
        # xmin: 0.362439603 ymin: 0.277495772 width: 0.291663319 height: 0.233330518
        bbox = detection.location_data.relative_bounding_box

 

자세한 내용은 이곳에

2024.08.23 - [분류 전체보기] - [MediaPipe] 얼굴 인식

 

[MediaPipe] 얼굴 인식

미디어파이프란 구글에서 제공하는 AI 오픈소스이다 미디어파이프 설치pip install mediapipe 필요 라이브러리 임포트import mediapipe as mpimport cv2  mp.solutions: 미디어파이프 솔루션들이 포함되어 쉽게

dogfoot1.tistory.com

 

정규화된 좌표를 실제 좌표로 바꾼다

# 실제 좌표와 크기 구하기
xmin = int(bbox.xmin * img_width)
ymin = int(bbox.ymin * img_height)
width = int(bbox.width * img_width)
height = int(bbox.height * img_height)

 

실제 이미지에서 얼굴 바운딩 박스를 자른다

# bbox(얼굴) 만큼 가져오기
face = img[ymin:ymin+height, xmin:xmin+width]

 

얼굴 바운딩 박스 이미지를 축소한다

cv2.resize() 사용

# 이미지 축소
face = cv2.resize(face, (10,10))

 

다시 확대한다

# 이미지 확대
face = cv2.resize(face, (width, height))

 

축소되었다가 확대된 이미지를 원본에 붙인다

# 붙이기
img[ymin:ymin+height, xmin:xmin+width] = face

 

이미지 출력

cv2.imshow('mosaic', face)
cv2.imshow('face_detection', img)
    
cv2.waitKey() 
cv2.destroyAllWindows()

 

 

동영상도 똑같이 하시면 됩니다

자세한 코드는 깃허브 참고

https://github.com/stonegyoung/OpenCV/blob/main/mp_face_detection_mosaic.py

 

OpenCV/mp_face_detection_mosaic.py at main · stonegyoung/OpenCV

컴퓨터 비전 공부. Contribute to stonegyoung/OpenCV development by creating an account on GitHub.

github.com

 

 

 

'비전' 카테고리의 다른 글

[MediaPipe] 얼굴 매쉬2  (0) 2024.09.03
[MediaPipe] 얼굴 매쉬1  (1) 2024.09.02
[MediaPipe] 포즈 인식  (0) 2024.08.25
[MediaPipe] 얼굴 인식  (0) 2024.08.23
[OpenCV] 특정 색 검출  (0) 2024.08.20