Q. cvlib 이용 시 매개변수로 넣는 이미지의 기본 컬러공간(color space)은 무엇이어야 할까요?
A. openCV는 b, g, r color space를 사용하므로 (b,g,r)이다.
라이브러리 사용 실습
0. 라이브러리 설치
# CVlib
!pip install cvlib
# tensorflow
!pip install tensorflow
import cv2
import matplotlib.pyplot as plt
import cvlib as cv
from cvlib.object_detection import draw_bbox
import numpy as np
1. 객체 인식 (Object Detection)
#15inch x 15inch figure 생성
fig = plt.figure(figsize=(15,15))
for i in range(1, 4):
# image_path에서 이미지 읽어오기
image_path = './image/image'+ str(i) +'.jpeg'
im = cv2.imread(image_path)
# object detection 수행
# bbox : detect한 부분, label : 물체를 detect한 라벨, conf : label로 분류된 확률
bbox, label, conf = cv.detect_common_objects(im)
# 결과 이미지에 detect한 부분을 네모로 표시하고 라벨 붙이기
output_image = draw_bbox(im, bbox, label, conf)
# BGR -> RGB
output_image = cv2.cvtColor(output_image, cv2.COLOR_BGR2RGB)
# figure를 3x1 그리드 나누고 i번째 좌표계에 이미지 표시하기
plt.subplot(3, 1, i)
plt.imshow(output_image)
# 좌표축 삭제
plt.axis('off')
# padding 등 subplot layout 자동 조정
plt.tight_layout()
plt.show()
객체 인식 결과
2. 얼굴 인식 (Face Detection)
# 9inch x 9inc figure 생성
fig = plt.figure(figsize=(9,9))
# 이미지 가져와서 openCV로 읽기
image_path = './image/harrypotter.jpg'
im = cv2.imread(image_path)
# face detection 결과 저장 (faces: detect한 얼굴 부분 좌표, confidences: 확률)
faces, confidences = cv.detect_face(im)
# face로 detect된 faces에서 얼굴 하나씩 좌표 저장
for face in faces:
# detect한 얼굴 표시하기 위해 사진 위에 얼굴 부분 사각형 그리기 (green으로 두께는 2)
(startX,startY) = face[0],face[1]
(endX,endY) = face[2],face[3]
cv2.rectangle(im, (startX,startY), (endX,endY), (0,255,0), 2)
# color space bgr -> rgb 변경
im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
plt.imshow(im)
plt.axis('off')
plt.show()
얼굴 인식 결과
3. 성별 인식 (Gender Detection)
fig = plt.figure(figsize=(9,9))
image_path = './image/harrypotter.jpg'
im = cv2.imread(image_path)
faces, confidences = cv.detect_face(im)
# 얼굴들 좌표 저장
for face in faces:
(startX,startY) = face[0],face[1]
(endX,endY) = face[2],face[3]
# 좌표 이용해서 각 얼굴들만 잘라서 face_crop에 저장
face_crop = np.copy(im[startY:endY, startX:endX])
# label: 성별, confidence: 확률
(label, confidence) = cv.detect_gender(face_crop)
# 가장 큰 confidence값 idx에 저장
idx = np.argmax(confidence)
# 해당 idx에 해당하는 라벨을 대표 라벨로 설정
label = label[idx]
# label : 확률 형식으로 라벨 저장하기 ex) 여성: 98.76%
label = "{}: {:.2f}%".format(label, confidence[idx] * 100)
# 만약 startY-10의 값이 0보다 크다면 수행하고 작다면 10 더하기
Y = startY - 10 if startY - 10 > 10 else startY + 10
# green rectangle로 나타내고 라벨도 같이 보여주기
cv2.rectangle(im, (startX,startY), (endX,endY), (0,255,0), 2)
cv2.putText(im, label, (startX,Y), cv2.FONT_HERSHEY_SIMPLEX, 0.7,
(0,255,0), 2)
im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
plt.imshow(im)
plt.axis('off')
plt.show()
성별 인식 결과
4. 웹캠 입출력
webcam = cv2.VideoCapture(0)
# webcam이 안 열리면 오류 출력하고 종료
if not webcam.isOpened():
print("Could not open webcam")
exit()
# webcam 열려있는 동안
while webcam.isOpened():
# 찍어서 status(잘 작동하는지 true/false boolean값), frame(찍은 화면) 저장
status, frame = webcam.read()
# false 값 반환되면 오류 출력 후 종료
if not status:
print("Could not read frame")
exit()
# 좌우 반전하여 저장
frame = cv2.flip(frame, 1)
# Real-time video라는 창 안에 frame(찍은 화면) 출력
cv2.imshow("Real-time video", frame)
# q 누르면 종료
# cv2.waitKey(1) : key 누르면 아스키코드 반환, 안 누르면 -1 반환
if cv2.waitKey(1) & 0xFF == ord('q'):
break
webcam.release()
cv2.destroyAllWindows()
5. 나만의 프로그램 만들기
웹캠 입출력 + 얼굴인식+성별인식 프로그램
webcam = cv2.VideoCapture(0)
# webcam이 안 열리면 오류 출력하고 종료
if not webcam.isOpened():
print("Could not open webcam")
exit()
# webcam 열려있는 동안
while webcam.isOpened():
# 찍어서 status(잘 작동하는지 true/false boolean값), frame(찍은 화면) 저장
status, frame = webcam.read()
# false 값 반환되면 오류 출력 후 종료
if not status:
print("Could not read frame")
exit()
# 좌우 반전하여 저장
frame = cv2.flip(frame, 1)
# Real-time video라는 창 안에 frame(찍은 화면) 출력
faces, confidences = cv.detect_face(frame)
# 얼굴들 좌표 저장
for face in faces:
(startX,startY) = face[0],face[1]
(endX,endY) = face[2],face[3]
# 좌표 이용해서 각 얼굴들만 잘라서 face_crop에 저장
face_crop = np.copy(frame[startY:endY, startX:endX])
# label: 성별, confidence: 확률
(label, confidence) = cv.detect_gender(face_crop)
# 가장 큰 confidence값 idx에 저장
idx = np.argmax(confidence)
# 해당 idx에 해당하는 라벨을 대표 라벨로 설정
label = label[idx]
# label : 확률 형식으로 라벨 저장하기 ex) 여성: 98.76%
label = "{}: {:.2f}%".format(label, confidence[idx] * 100)
# 만약 startY-10의 값이 0보다 크다면 수행하고 작다면 10 더하기
Y = startY - 10 if startY - 10 > 10 else startY + 10
# green rectangle로 나타내고 라벨도 같이 보여주기
cv2.rectangle(frame, (startX,startY), (endX,endY), (0,255,0), 2)
cv2.putText(frame, label, (startX,Y), cv2.FONT_HERSHEY_SIMPLEX, 0.7,
(0,255,0), 2)
cv2.imshow("Real-time video", frame)
# q 누르면 종료
# cv2.waitKey(1) : key 누르면 아스키코드 반환, 안 누르면 -1 반환
if cv2.waitKey(1) & 0xFF == ord('q'):
break
webcam.release()
cv2.destroyAllWindows()
'Group Study (2020-2021) > Machine Learning' 카테고리의 다른 글
[Machine Learning] 8주차 스터디 - 이미지 내 문자 인식(OCR) + 마스크 착용 여부 분류 프로그램 (0) | 2020.12.02 |
---|---|
[Machine Learning] 6주차 스터디 - 이미지 처리 기본 (0) | 2020.11.20 |
[Machine Learning] 5주차 스터디 - 추천 시스템 (0) | 2020.11.10 |
[Machine Learning] 4주차 스터디 - 나이브 베이즈 분류기 (0) | 2020.11.08 |
[Machine Learning] 3주차 스터디 - 텍스트 분석 기초 (0) | 2020.10.29 |