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 |