본 포스팅에서는 OpenCV Python을 활용하여 얼굴 검출을 수행하는 방법을 소개합니다. 얼굴 검출은 컴퓨터 비전 분야에서 매우 중요한 작업 중 하나로, 이미지나 비디오에서 얼굴을 자동으로 인식하는 기술을 말합니다. 여기서는 하르 캐스케이드(Haar Cascade)라고 하는 객체 검출기를 사용하였고, 실행 환경은 Google Colab에서 실행하였습니다. 

1. OpenCV 설치하기

OpenCV가 설치되어 있지 않은 분들만 다음 코드를 콜랩에서 실행하여 설치해 주시면 됩니다.

!pip install opencv-python

2. Haar Cascade 파일 다운로드

얼굴 검출을 위해 미리 학습된 Haar Cascade 파일이 필요합니다. OpenCV 공식 GitHub 저장소에서 다양한 학습된 모델을 제공하고 있으며, 다음 링크로 들어가셔서 얼굴 검출에 사용할 "haarcascade_frontalface_default.xml" 파일을 다운로드해주시면 됩니다. 

https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml

 

GitHub - opencv/opencv: Open Source Computer Vision Library

Open Source Computer Vision Library. Contribute to opencv/opencv development by creating an account on GitHub.

github.com

3. OpenCV 라이브러리 임포트하기

준비 단계는 모두 마쳤고, 이제 본격적으로 얼굴 검출을 진행해보겠습니다. 우선, 다음 코드를 실행하여 OpenCV 라이브러리를 import 해줍니다.

import cv2

4. 구글 드라이브 마운트

구글 드라이브에 있는 파일을 사용하기 위해서 구글 드라이브를 마운트 해줍니다. 다음 코드를 실행만 해주시면 됩니다.

from google.colab import drive
drive.mount('/content/drive')

5. Haar Hascade 경로 설정해 주기

경로는 haarcascade_frontalface_default.xml 파일의 경로로 변경해 주시면 됩니다. 저는 드라이브에서 face 폴더 안에 이 파일을 넣어두었습니다.

# Haar Cascade 파일 경로
cascade_path = '/content/drive/MyDrive/face/haarcascade_frontalface_default.xml'

6. 이미지 읽기

다음으로 얼굴을 검출할 이미지를 불러옵니다. 저는 드라이브에 미리 저장해 두었던 방탄소년단 이미지를 불러왔습니다. 이미지의 형식은 jpeg, jpg 모두 상관없습니다. 

# 이미지 읽기
image_path = '/content/drive/MyDrive/face/bts.jpeg'
image = cv2.imread(image_path)

7. GrayScale로 변경

Haar Cascade는 GrayScale 이미지, 즉 흑백 이미지에서 얼굴을 검출하기 때문에 우리의 이미지 또한 흑백 이미지로 바꿔주어야 합니다. 다음 코드를 실행하시면 이미지를 GrayScale 이미지로 바꾸실 수 있습니다.

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

 

8. 얼굴 검출용 CascadeClassifier 객체 생성

CascadeClassifier 클래스의 인스턴스를 생성하여 얼굴 검출에 사용할 Haar Cascade 파일을 로드합니다.

face_cascade = cv2.CascadeClassifier(cascade_path)

9. 얼굴 검출

detectMultiScale 함수를 사용하여 얼굴을 검출합니다. 첫 번째 인자로는 그레이스케일 이미지를 전달하고, scaleFactor, minNeighbors, minSize와 같은 매개변수를 조정하여 얼굴 검출의 성능을 조절할 수 있습니다.

faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

10. 검출된 얼굴 주변에 사각형 그리기

검출된 얼굴 주위에 사각형을 그려줍니다. 검출된 얼굴의 좌표와 너비, 높이를 사용하여 사각형의 좌표를 계산하고, 그립니다. 이 코드에서는 사각형의 색상을 (0, 255, 0)으로, 두께를 3으로 설정하였습니다.

for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 3)

11. 결과 이미지 출력

다음 코드로 얼굴에 사각형이 그려진 이미지를 출력해 볼 수 있습니다. 

from google.colab.patches import cv2_imshow
cv2_imshow(image)
cv2.waitKey(0)
cv2.destroyAllWindows()

전체 코드

import cv2
from google.colab.patches import cv2_imshow

# Haar Cascade 파일 경로
cascade_path = '/content/drive/MyDrive/face/haarcascade_frontalface_default.xml'

# 이미지 읽기
image_path = '/content/drive/MyDrive/face/bts.jpeg'
image = cv2.imread(image_path)

# 그레이스케일 변환
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 얼굴 검출용 CascadeClassifier 객체 생성
face_cascade = cv2.CascadeClassifier(cascade_path)

# 얼굴 검출
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

# 검출된 얼굴 주변에 사각형 그리기
for (x, y, w, h) in faces:
    cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 3)

# 결과 이미지 출력
cv2_imshow(image)
cv2.waitKey(0)
cv2.destroyAllWindows()

결과 이미지

방탄소년단(bts) 이미지에서 멤버 얼굴 검출하기

하나만 하기에는 아쉬워서 걸그룹 아이브 얼굴도 검출해 보았다.

아이브 이미지에서 멤버 얼굴 검출하기


결론

살짝 정확도가 떨어지는 것 같기는 하지만, 단순 코드 몇 줄로 이렇게 얼굴을 검출할 수 있다는 것이 놀라웠다. 다음 글에서는 얼굴 검출뿐만 아니라 눈 검출이나 다른 것들도 시도해보려고 한다. 

반응형
SMALL

OpenCV란? 

 

OpenCV는 "Open Source Computer Vision Library"의 약자로, 이미지 처리 및 컴퓨터 비전 분야 개발하는 데 사용되는 라이브러리입니다. C++, Python, Java 등 다양한 프로그래밍 언어에서 사용할 수 있고, 본 글에서는 Python을 사용하여 OpenCV를 설치하는 방법을 알아봅니다.

 

OpenCV 설치하기

 

OpenCV는 pip를 통하여 설치할 수 있습니다. 파이썬 3.x를 설치한 후 다음 명령어를 사용하여 OpenCV를 설치 합니다.

# pip 명령어로 설치
pip install opencv-python

 

정상적으로 설치 되었다면 다음 코드를 실행하였을 때 설치한 OpenCV의 버전이 출력됩니다.

import cv2
print(cv2.__version__)

 

[간단한 예제 코드]

아래는 간단한 예제 코드입니다. 이미지를 불러와서 회색으로 변환한 후 화면에 출력하는 코드입니다.

import cv2

# 이미지 파일을 읽어옵니다.
image = cv2.imread('image.jpg')

# 이미지를 회색조로 변환합니다.
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 변환된 이미지를 화면에 표시합니다.
cv2.imshow('Gray Image', gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
반응형
SMALL

 

❗️이 글은 비대면 과외 플랫폼 설탭을 약 1년 정도 사용해 온 튜터의 입장에서 작성된 후기입니다. ❗️

 

 

        저는 작년 2022년 7월부터 현재 2023년 6월까지 약 1년 정도 튜터로서 설탭을 이용해 왔습니다. 현재 가르치고 있는 학생들을 포함하여 총 7명의 학생들을 만났고 수학과 영어를 가르쳤습니다. 1년 동안 제가 개인적으로 느꼈던 설탭의 장단점과 설탭을 막 시작해보려고 하시는 선생님들을 위한 작은 팁들을 공유하고자 합니다.

 

 

비대면 과외 플랫폼 [설탭]

 

장점

 

1. 비대면 과외여서 시간과 공간을 구애받지 않는다

        대면 과외도 해봤던 사람으로서 대면 과외의 가장 큰 문제점은 오가는 시간과 비용이 많이 소요된다는 것이다. 비대면 과외는 내가 편한 장소에서 편한 복장(?)으로 할 수 있다는 것이 너무나도 큰 장점이다. 오가는 교통비용도 아낄 수 있고 꾸미고 나가는 시간도 아낄 수 있다. 이건 뭐 학생의 입장에서 더 큰 장점이 될 듯싶다. 

 

2. 준비된 수업 자료가 있다.

        영어 같은 경우에는 대면 과외 같으면 내가 자료도 만들고 해야 하는데, 설탭에는 내신 자료실이 있다..! 이것만으로 내 과외 준비시간이 반의 반으로 줄었다. 좋기는 한데 아직 자료가 많이 부족하다. 교과서 자료뿐만 아니라 다른 자료들도 더 추가가 되면 좋을 듯싶다. 

 

3. 과외를 구하러 다니지 않아도 된다.

        플랫폼을 끼지 않고 혼자서 과외를 구한다는 것 자체가 쉬운 일은 아니다. 과외 구해볼라고 과외 상담지 만들고, 또 직접 가서 상담하고 상당히 귀찮은 일이다. 하지만, 설탭은 알아서 학생들을 매칭해 준다. 요즘은 또 시스템이 바뀌어서, 학생 매칭이 선생님 입장에서 더 편해졌다. 또 학생들이 과외를 많이 찾는 시즌에는 정말 매칭이 계속 들어온다. 과외 구하는 게 귀찮거나 어려운 사람들에게는 설탭을 추천한다.

 

단점

 

1. 앱 오류가 많다.

        비대면 과외 특성상 앱이나 플랫폼을 사용할 수 밖에 없는데, 근데 문제가 이 설탭 앱이 아직도 말썽이다.. 언제쯤 완벽히 안정화가 될지는 모르겠지만 1년 동안 오류가 나서 수업을 미뤄야 했던 적이 꽤 된다. (한 7번 정도..?) 더 큰 문제는 앱 오류로 인하여 수업을 못하게 돼도 아무런 보상이 없었다는 것이다. 시간은 시간대로 뺏기고.

 

2. 학생 관리가 잘 안 된다.

        다행히도 내가 만났던 학생들은 모두 너무나 착하고 밝은 친구들이었는데, 가끔씩 뭔가 답지를 베끼는 것 같은 느낌이 들 때가 있다. 정말 잘 풀길래 어떻게 해서 이 식이 나온 거지?라고 질문을 하면 대답을 못한다.. 대면 과외면 불가능한 일이지만, 비대면 과외여서 그런지 답지를 보고 싶은 욕망이 드나 보다. 근데 또 확인할 방법도 없고 뭐라고 하기에는 학생을 의심하는 것 같은 느낌이 들어서 그냥 넘어가고 있다. 

 

3. 시급이 높지 않다.

        설탭이 내가 알기로는 스카이 학생들만 가능한 걸로 아는데, 내 주변에 대면 과외하는 친구들은 기본 시급이 못해도 3만 원부터 시작이다. 그에 반해 설탭은 시급이 세금 떼고 나면 2만 원이 채 안 된다. 정확히는 19361원. 살짝 손해 보는 것 같은 느낌이 들 때도 있기는 하지만, 비대면 과외에 너무나도 편해져 버린 나는 이제 대면 과외를 다시 할 자신이 없다.

 

 

💕 설탭 이제 시작하려고 하는 선생님을 위한 팁!

 

1. 3분 음성테스트

        설탭 처음 지원할 때 3분 자기소개 음성 파일을 제출해야 한다. 에브리타임 보면 생각보다 여기서 떨어지는 사람들이 꽤 있는 것 같은데, 단 한 번에 붙은 팁을 공유한다.

  • 목소리는 유치원 선생님처럼! 평소보다 너무 오글거리는데? 정도의 목소리를 내라. 나도 내가 이런 목소리를 낼 수 있었는지 몰랐다.
  • 학생 실력 타겟팅하기! 정확하게 하위권, 중위권, 상위권 중 어떤 학생을 타겟으로 하는지 설정하고, 그에 맞는 학습법을 간단하게 설명해 주면 된다. 타겟팅을 확실히 하면 할 말도 많아진다.
  • 선생님의 장점 정확하게 어필하기! 나는 간단하게 두 개 정도만 얘기했던 것 같다.

        나도 처음 지원할 때는 유튜브에서 지원 영상 몇 개 참고해서 지원했다. 유튜브에 '설탭 음성테스트 지원 팁'이라고 쳐서 영상 몇 개 참고해서 음성테스트 준비하면 충분히 한 번에 합격할 수 있다. 

 

2. 최대한 여러 개 붙여서 매칭받기

        설탭이 60분 수업과 90분 수업으로 나누어지는데, 하루에 한 수업만 받으면 1시간만 하고 끝나버리는 불상사가 발생한다. 1시간 수업하려고 내 저녁 시간을 모두 다 비워야 하는 상황이 생기는 것이다. 그렇기 때문에 매칭받을 때에는 최대한 바로바로 다음 수업할 수 있게 시간대를 붙여서 매칭받는 게 좋다. 

 

3. 보너스 제도

        설탭에서는 장기적으로 수업을 한 선생님에 한하여 보너스 제도를 두고 있다. 이게 꽤 쏠쏠하다. 초, 중등은 3개월 지나면 5% 보너스, 고등은 3개월이 지나면 10% 보너스에다가 5개월, 7개월이 되면 5%가 또 추가된다. 그러면 원래 시급 19361원에서 20%가 붙으면 23,233이 들어온다. 

설탭 보너스 제도 그래프

결론

결론은 1) 자투리 시간 활용해서 돈 좀 벌어보고 싶다, 2) 대면 과외를 구할 자신이 없다(또는 귀찮다), 3) 집에서 편하게 과외하고 싶다 하는 사람에게는 설탭을 개인적으로 추천한다. 나도 언제까지 설탭을 이용하게 될지는 모르겠지만 그때까지는 설탭을 애용할 예정이다. 

반응형
SMALL

Data Augmentation이란?

데이터 증강(data augmentation)은 딥러닝 기반의 컴퓨터 비전 분야에서 중요한 역할을 한다. 데이터 증강은 제한된 양의 훈련 데이터를 더 다양한 형태로 변형시켜 모델의 성능을 향상시키는 것을 목표로 한다. 이번 글에서는 OpenCV를 활용한 Data Augmentation을 구현하는 것을 목표로 한다.

1. 이미지 불러오기 및 표시

먼저 OpenCV를 사용하여 이미지를 불러오고 imshow()를 사용하여 이미지를 표시한다.

import cv2

# 이미지 파일 경로
image_path = "image.jpg"

# 이미지 불러오기
image = cv2.imread(image_path)

# 이미지 표시
cv2.imshow("Original Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

2. 이미지 회전

getRotationMatrix2D()warpAffine()를 사용하여 이미지를 회전시킬 수 있다. 아래의 코드는 45도만큼 시계 방향으로 이미지를 회전하는 코드이다. 

# 이미지 회전
rows, cols, _ = image.shape
M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 45, 1)
rotated_image = cv2.warpAffine(image, M, (cols, rows))

# 이미지 표시
cv2.imshow("Rotated Image", rotated_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

[결과 이미지]

45도만큼 시계방향으로 회전

3. 이미지 반전

flip()를 사용하여 이미지를 반전시킬 수 있다. 아래 코드는 이미지를 좌우로 반전시키는 코드이다. 

# 이미지 반전
flipped_image = cv2.flip(image, 1)

# 이미지 표시
cv2.imshow("Flipped Image", flipped_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

[결과 이미지]

좌우 반전

4. 이미지 밝기 조절

이미지의 밝기를 조절하여 데이터셋을 변형시킬 수도 있다. convertTo()를 사용하면 된다. 아래 코드는 이미지의 밝기를 50만큼 증가시킨 코드이다. 

# 이미지 밝기 조절
brightened_image = np.clip(image.astype(np.int16) + 50, 0, 255).astype(np.uint8)

# 이미지 표시
cv2.imshow("Brightened Image", brightened_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

[결과 이미지]

밝기 +50

5. 그 외의 기법

1) 이미지 크기 조절 : resize()

2) 가우시안 노이즈 추가 : randn(), add()

3) 색상 변환 : cvtColor()

 

 

반응형
SMALL

+ Recent posts