[딥러닝]#3

2022. 11. 21. 09:08스파르타코딩클럽[AI트랙 3기]/딥러닝

1.알아두면 좋은 꿀팁

1)기존의 프로그래밍은 규칙과 데이터를 넣어서 해답을 출력 / 머신러닝은 해답과 데이터를 넣어서 규칙을 출력

 

2.3주차 프로젝트 준비하기

1)week3 폴더 만들기

2)main.py 만들기

3)가상환경 선택

4)models, videos 폴더 만들기(다운받아서 파일 넣어주기)

 

3.본격적인 코드 작성

*main.py

1)패키지 불러오기

from tensorflow.keras.applications.mobilenet_v2 import preprocess_input #딥러닝모델만드는 패키지

from tensorflow.keras.models import load_model

import numpy as np

import cv2

2)모델 로드하기

facenet = cv2.dnn.readNet('models/deploy.prototxt', 'models/res10_300x300_ssd_iter_140000.caffemodel') #얼굴영역 탑지 opencv dnn 사용

model = load_model('models/mask_detector.model') #마스크판단(텐서플로우함수 이용)

3)동영상 플레이어 만들기

cap = cv2.VideoCapture('videos/04.mp4')

 

while True:

ret, img = cap.read()

 

if ret == False:

break

 

cv2.imshow('result', img)

if cv2.waitKey(1) == ord('q'): #키보드 q버튼 누르면 꺼짐

break

 

4.얼굴 영역 탐지

*main.py

if cv2.waitKey(1) == ord('q'): #키보드 q버튼 누르면 꺼짐

break

 

h, w, c = img.shape

# 이미지 전처리하기

blob = cv2.dnn.blobFromImage(img, size=(300, 300), mean=(104., 177., 123.))

##알아서 리사이즈

 

# 얼굴 영역 탐지 모델로 추론하기

facenet.setInput(blob)

dets = facenet.forward()

 

# 각 얼굴에 대해서 반복문 돌기

for i in range(dets.shape[2]): #한얼굴씩 돌아가면서 처리하기 위해 for문 이용

confidence = dets[0, 0, i, 2] #confidence는 자신감. 1에가까울수록 정확도 높음.

 

if confidence < 0.5: #0.5보다 작으면 얼굴이 아니다. 넘어가라(코드 실행하지 말고 스킵) 숫자가 높을수록 높은 정확도를 요구

continue

 

# 사각형 꼭지점 찾기

x1 = int(dets[0, 0, i, 3] * w) #w곱하는 이뉴는 전체를 퍼센트로 해서 좌표으니까 전체 크기만큼 곱해줌.

y1 = int(dets[0, 0, i, 4] * h)

x2 = int(dets[0, 0, i, 5] * w)

y2 = int(dets[0, 0, i, 6] * h)

 

# 사각형 그리기(이미지 위에 사각형 그리기)

cv2.rectangle(img, pt1=(x1, y1), pt2=(x2, y2), thickness=2, color=(0, 255, 0))

 

5.마스크 착용 여부 판단

얼굴영역 탐지모델 : 입력값 이미지 / 출력값 컨피던스, 사각형

마스크 착용모델 : 입력값 얼굴을 잘라낸 영역 / 출력값 컨피던스(마스크를썼는지)

1)얼굴영역 잘라내고 전처리 하기

*main.py

y2 = int(dets[0, 0, i, 6] * h)

face = img[y1:y2, x1:x2] #crop(잘라내기) 할때는 y부터, x나중에

 

face_input = cv2.resize(face, dsize=(224, 224))

face_input = cv2.cvtColor(face_input, cv2.COLOR_BGR2RGB) #모델은 rgb로 학습되어서 bgr로 바꿔주기

face_input = preprocess_input(face_input)

face_input = np.expand_dims(face_input, axis=0) #차원변형하는 함수

2)결과 추론하기

mask, nomask = model.predict(face_input).squeeze() #예측하기

3)결과 표시하기

if mask > nomask : #만약 마스크 쓴게 더 크면 초록색

color = (0, 255, 0)

else:

color = (0, 0, 255) #아닐 경우 빨간색

cv2.rectangle(img, pt1=(x1, y1), pt2=(x2, y2), thickness=2, color=color)# color를 바꿔줌.

 

6.성별, 나이를 예측하는 모델 준비하기

-얼굴보고 성별, 나이 예측

1)모델 다운로드 하기

2)예제 이미지 다운로드하기

3)시작코드

*main2.py

import numpy as np

import cv2

 

facenet = cv2.dnn.readNet('models/deploy.prototxt', 'models/res10_300x300_ssd_iter_140000.caffemodel')

 

img = cv2.imread('imgs/02.jpg')

 

h, w, c = img.shape

 

# 이미지 전처리하기

blob = cv2.dnn.blobFromImage(img, size=(300, 300), mean=(104., 177., 123.))

 

# 얼굴 영역 탐지 모델로 추론하기

facenet.setInput(blob)

dets = facenet.forward()

 

# 각 얼굴에 대해서 반복문 돌기

for i in range(dets.shape[2]):

confidence = dets[0, 0, i, 2]

 

if confidence < 0.5:

continue

 

# 사각형 꼭지점 찾기

x1 = int(dets[0, 0, i, 3] * w)

y1 = int(dets[0, 0, i, 4] * h)

x2 = int(dets[0, 0, i, 5] * w)

y2 = int(dets[0, 0, i, 6] * h)

 

face = img[y1:y2, x1:x2]

 

cv2.rectangle(img, pt1=(x1, y1), pt2=(x2, y2), color=(255, 0, 0), thickness=2)

 

 

cv2.imshow('result', img)

cv2.waitKey(0)

 

7. 모델 로드하고 추론하기

*main2.py

1)모델로드하기

facenet =cv2.dnn.readNet

 

gender_list = ['Male', 'Female'] #0이면 남자, 1이면 여자

age_list = ['(0, 2)','(4, 6)','(8, 12)','(15, 20)','(25, 32)','(38, 43)','(48, 53)','(60, 100)'] #나이는 범위로 나옴, 0이면 0~2

 

gender_net = cv2.dnn.readNetFromCaffe('models/deploy_gender.prototxt', 'models/gender_net.caffemodel') #성별 모델

age_net = cv2.dnn.readNetFromCaffe('models/deploy_age.prototxt', 'models/age_net.caffemodel')

2)전처리하기

-하는일이 세가지 : 사이즈 바꿔주기, mean값으로 빼주기, 차원변형하기

face = img[y1:y2, x1:x2]

blob = cv2.dnn.blobFromImage(face, size=(227, 227), mean=(78.4263377603, 87.7689143744, 114.895847746))

3)추론하기

gender_net.setInput(blob) #gendernet에 인풋 지정. 그것은 바로 블롭

gender_index = gender_net.forward().squeeze().argmax() #젠더넷을 포워드하는데 차원을 줄여주고(squeeze), 압축(argmax)

gender = gender_list[gender_index] #인덱스에서 리스트를 뽑아냄.

 

age_net.setInput(blob)

age_index = age_net.forward().squeeze().argmax()

age = age_list[age_index]

4)결과출력하기(putText함수 이용해서 글씨 쓰기)

cv2.putText(img, '%s, %s' % (gender, age), org=(x1, y1), fontFace=cv2.FONT_HERSHEY_SIMPLEX, fontScale=1, color=(0,255,0), thickness=2)

8.3주차 숙제 &

 

'스파르타코딩클럽[AI트랙 3기] > 딥러닝' 카테고리의 다른 글

[딥러닝]#4  (0) 2022.11.21
[딥러닝]#2  (0) 2022.11.18
[딥러닝]#1  (0) 2022.11.17