본문 바로가기
공부/코딩

스파르타코딩클럽 이미지로 시작하는 딥러닝 3주차 개발일지

by ▤▣▩▒□ 2021. 7. 11.
728x90
반응형

이번 주차에는 사진 속에서 얼굴을 인식하고

사람이 마스크를 썼는지 안 썼는지까지 판단하는 코드를 작성해보았다.

 

위대하신 분들이 만들어놓은 딥러닝 코드를 활용해서 결과를 보는 것이 신기할 따름이다.

 

from tensorflow.keras.applications.mobilenet_v2 import preprocess_input
from tensorflow.keras.models import load_model
import numpy as np
import cv2

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

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

while True:
    ret, img = cap.read()

    if ret == False:
        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]):
        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]

        face_input = cv2.resize(face, dsize=(224, 224))
        face_input = cv2.cvtColor(face_input, cv2.COLOR_BGR2RGB)
        face_input = preprocess_input(face_input)
        face_input = np.expand_dims(face_input, axis=0)

        mask, nomask = model.predict(face_input).squeeze()

        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)

    cv2.imshow('result', img)

    if cv2.waitKey(1) == ord('q'):
        break

 

코드를 보면 굉장히 길고 복잡해보이지만

블록단위로 보면 그렇게 복잡하지 않다.

 

모델을 불러오는 방법은 2가지가 사용되었다

cv2.dnn.readNet 함수로 얼굴인식 모델을 불러오고

load_model을 이용하여 마스크 착용 판단 모델을 불러온다.

위에 함수는 opencv함수고 아래는 텐서플로우 함수다.

 

동영상을 불러와서 이미지 한장씩 검사한다.

사진 속에서 찾은 얼굴이 한 명이 아니기 때문에 영상을 불러오는 와중에 반복문으로

찾은 얼굴 개수만큼 마스크 판단 함수를 돌린다.

 

얼굴을 찾아서 사각형을 그리는데

마스크를 쓰면 초록색, 마스크를 안 쓰면 빨간색으로 그린다.

 

결과는 아래와 같다.

 

사이즈가 커서 그런지 속도가 느린데 판단은 꽤 정확하다

누가 만든 모델인지 이 코로나 시국에 참신한 모델을 만들어냈다.

 

제발 코로나 끝났으면....ㅠㅠ

728x90
반응형