[프로젝트] 교내 코로나 방역게이트 제작과정

이주희·2022년 12월 23일
0

PROJECT

목록 보기
1/1
post-thumbnail

교내 코로나 방역게이트 제작 프로젝트

일시 : 2020.12.04
팀원 : 이주희, 김경태
도움: 임동선 조교님
사용 툴: (디자인)라이노, 포토샵, (개발)아두이노, 파이참
링크: 교내 코로나 방역게이트_구글 드라이브 링크입니다.

1. 요약

얼굴을 자동으로 인식하여 학생정보와 함께 체온측정 및 마스크착용 여부를 확인 후 게이트를 작동시킵니다.

2. 문제 상황

2-1 COVID-19

(1) 20대의 코로나 인식
코로나19에 대해 잘못된 인식을 갖고 있는 20 대의 경우 “신종 코로나가 감염되는 것은 운이며, 나에게는 일어나지 않는 일이다”라는 코로나19 대하여 위험한 인식을 갖고 있다. 또한 이러한 20대들이 대학 캠퍼스에서 마스크 착용을 미흡하게 하여 대학의 코로나 방역을 힘들게 하고 있다.

(2) 코로나 방역 인력 부족과 위험 노출
코로나19의 상황이 내년 말까지 장기화될 것이라고 예상되는 가운데, 방역을 위해 투입된 인력들이 극심한 피로감을 느끼고 있다. 이를 돕고자 얼굴인식 기술과 인공지능 기술을 결합하여 만든출입 게이트를 사용하게 된다면 사람을 대신해서 마스크 착용을 확인하고 사용자의 정보를 파악하여 부족한 인력 문제에 도움이 될 것이다.

(3) 과도한 출입 시간과 감염의 위험성
일부 시설의 경우, 출입자의 마스크 착용 여부와 올바른 마스크 착용을 사람이 검사하는 방식으로 진행하면서, 출입자가 시설을 이용할 때, 상당한 시간이 소요되고 있다. 또한 기다리는 사람이 늘면서 그 과정에서 인원이 모이게 되면서 추가적인 감염이 일어날 수 있는 계기가 되고 있다.

3. 해결 방법

3-1 ’코로나 방역게이트’의 기능

단계 1. 입장시 정해진 위치로 이동하여 카메라로 출입자를 확인합니다.

  • 본인이 아닐 경우 출입이 제한됩니다.

단계 2. 마스크 착용이 올 바른지 확인합니다.

  • 마스크를 미착용시, 마스크 착용 안내 메시지가 나타납니다.
  • 마스크를 미착용시, 출입이 제한되며 관리실 호출을 합니다.

단계 3. 체온을 측정합니다.

  • 기존의 설정한 온도를 넘어 갈 경우, ‘잠시후 다시 시도해주세요’ 라는
    안내메시지가 나옵니다.
  • 고온 일시 출입을 제한 합니다.

단계 4 입장권을 발부 합니다.

단계 5. 게이트가 열립니다.

3-2 ‘코로나 방역게이트’의 작동기술

(1) 소프트웨어

YOLO를 활용한 얼굴 인식 및 마스크 탐지 기능

  • YOLO 알고리즘은 원본 이미지를 동일한 크기의 그리드로 나눈다.
  • 각 그리드에 대해 그리드 중앙을 중심으로 미리 정의된 형태로 지정된 경계박스의 개수를 예측하고 이를 기반으로 신뢰도를 계산한다.
    (이미지에 객체가 포함되어 있는지, 또는 배경만 단독으로 있는지 등)
  • 높은 객체 신뢰도를 가진 위치를 선택해 객체 카테고리를 파악한다.
  • 미리 정의된 형태를 가진 경계박스를 ‘앵커 박스(Anchor Boxes)’라고 한다.
  • 앵커박스는 K-평균 알고리즘에 의한 데이터로부터 생성되며, 데이터 세트의 객체 크기와 형태에 대한 사전 정보를 확보한다.
  • 각각의 앵커는 각기 다른 크기와 형태의 객체를 탐지하도록 설계되어 있다.

(2) 하드웨어

모터: 게이트 작동 기능 간접구현

전력을 받아서 회전하고 축에 회전력을 발생시킵니다. 모터는 공급되는 전기 방식에 따라 크게 직류용 , 교류용 으로 나뉘며 모두 동일한 원리로 동작합니다. 모터 내부에 자석을 놓아 자기장을 만들고 중앙 축에 연결된 도선에 전류를 흐르게 하면 전자력이 발생되어 회전력이 생기게 됩니다.

4. 개발

(1) 사용부품

  1. Arduino Uno
  1. 온/습도 센서
  1. 서보모터
  1. RGB LED
  1. 기타 케이블

USB 2.0 아두이노 케이블 AM-BM 1.5m [SZH-CAB01]
테스트[CH254]소켓 점퍼 케이블

(2) 회로도

ThinkerCAD를 이용하여 회로도를 직접 구성해보았고 작동되는 것을 확인 할 수 있었습니다.

온습도 센서 연결부분은 틴커캐드에 DHT11이라는 소자가 없어 대체하였습니다.

(3) 코드

import cv2
import numpy as np
import serial
import time

# 웹캠 신호 받기
VideoSignal = cv2.VideoCapture(0)

# YOLO 가중치 파일과CFG 파일 로드
#YOLO_net = cv2.dnn.readNet("C:/workspace/darknet-master/build/darknet/x64/backup/13/yolov3-tiny_obj_final.weights","C:/workspace/darknet-master/build/darknet/x64/data/yolov3-tiny_obj.cfg")
YOLO_net = cv2.dnn.readNet("backup/14/yolov3_last.weights","data/yolov3.cfg")
#YOLO_net = cv2.dnn.readNet("1233/yolov3.weights","1233/yolov3.cfg")
#YOLO_net = cv2.dnn.readNet("./build/darknet/x64/backup/11/yolov3-tiny_obj_final.weights","./build/darknet/x64/data/yolov3-tiny_obj.cfg")

# YOLO NETWORK 재구성
# C:\workspace\darknet-master\build\darknet\x64
classes = []
ser = serial.Serial('COM7', 9600)
onR = "onR\n“
onR=onR.encode('utf-8')
onG = "onG\n“
onG=onG.encode('utf-8')
offR = "offR\n“
offR=offR.encode('utf-8')
offG = "offG\n“
offG=offG.encode('utf-8')
with open("data/obj.names", "r") as f:
classes = [line.strip() for line in f.readlines()]
layer_names = YOLO_net.getLayerNames()
output_layers = [layer_names[i[0] - 1] for i in 
YOLO_net.getUnconnectedOutLayers()]
label=None
lable_list = []
while True:

# 웹캠 프레임
ret, frame = VideoSignal.read()
h, w, c = frame.shape

# YOLO 입력
blob = cv2.dnn.blobFromImage(frame, 0.00392, (416, 416), (0, 0, 0),True, crop=False)
YOLO_net.setInput(blob)
outs = YOLO_net.forward(output_layers)

class_ids = []
confidences = []
boxes = []

for out in outs:

for detection in out:
scores = detection[5:]
class_id = np.argmax(scores)
confidence = scores[class_id]

if confidence > 0.5:
# Object detected
center_x = int(detection[0] * w)
center_y = int(detection[1] * h)
dw = int(detection[2] * w)
dh = int(detection[3] * h)

# Rectangle coordinate
x = int(center_x - dw / 2)
y = int(center_y - dh / 2)
boxes.append([x, y, dw, dh])
confidences.append(float(confidence))
class_ids.append(class_id)

indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.45, 0.4)
lable_list = []

for i in range(len(boxes)):
if i in indexes:
x, y, w, h = boxes[i]
label = str(classes[class_ids[i]])
score = confidences[i]
lable_list.append(label)

# 경계상자와 클래스 정보 이미지에 입력
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 5)
cv2.putText(frame, label, (x, y - 20), cv2.FONT_ITALIC, 0.5,(255, 255, 255), 1)
#print(label,boxes)
cv2.imshow("YOLOv3", frame)

if cv2.waitKey(100) > 0:
break
if ser.readable():
res = str(ser.readline())
res_d=res.split(",")
t=res_d[4]
h=res_d[1]

#print(res)
#print("t: ", t,"h: ",h)
#print(lable_list)

if len(lable_list) == 2:
hi="hi"+" "+str(lable_list[0])
print(hi)
if float(t) < 25.0:
ser.write(onG)
else:
ser.write(offR)
print("It's not normal temperature")
elif len(lable_list) == 1:
lll=lable_list[0]
if lll == "leeJoohee" or lll == "limdongsun" or lll == "kimkyungtae":#winsound.Beep(frequency, duration)
print ("Please wear a mask")
ser.write(offR)
else:
ser.write(offR)

여러 장의 사진 데이터로 사용자의 얼굴과 마스크를 미리 학습시키고 웹캠의 신호를 받아 욜로 알고리즘을 이용하여 파일을 로드합니다.

이를 기반으로 사용자가 누구인지 인식하고, 마스크의 착용 여부를 판단하며 온도센서를 사용하여 사용자의 체온을 측정합니다.

얼굴인식, 마스크 착용, 정상 체온이라는 3가지 조건을 모두 만족한다면
LED에 초록불이 들어오면서 모터가 작동하여 게이트가 열렸음을 간접적으로 알려줍니다.

5. 3D 모델링 및 렌더링

포스트코로나 시대에서 교내를 출입하는 모든 사람들이 이용하는 제품이다 보니 보다 쉽고 편리하게 이용가능한 디자인을 위해 유니버셜 디자인의 7원칙에 부합하는 제품을 개발하고자 하였습니다.

제품을 디자인할때는 ‘간단하고 직관적 사용’, ‘적은 신체적 노력’, ‘쉽게 인지할 수 있는 정보’ 에 해당하는 3가지 원칙에 부합하려고 하였습니다.

라이노 프로그램을 활용하여 3D 모델링을 진행하였고, 실제적인 스케일 그리고 부품의 대략적인 위치를 확인할 수 있었습니다.

교내 출입용 손목밴드를 출력할 수 있는 제품도 부착하였습니다.

작동방식에 따라 게이트가 열리고 닫히는 렌더 이미지를 출력하였습니다.

6. 기대 효과

사람이 마스크 착용 여부와 체온 측정을 직접 검사하는 기존 방식 대신 방역 게이트를 사용함으로써 출입자가 시설에 입장하는데 걸리는 시간을 상당히 단축시킬 수 있습니다.

또한 방역 인력의 위험 노출 문제와 입장 대기시간이 길어짐에 따른 밀집에 의한 추가 감염을 원천에 차단할 수 있습니다.

이 외에도 방역 인력난 해소, 건물의 보안 강화 등의 효과를 기대해 볼 수 있습니다.

7. 참고문헌

ZKTeco's principles of Access Control with Mask Detection

COVID-19: Face Mask Detector with OpenCV, Keras/TensorFlow, and Deep Learning

profile
데이터 입문자

0개의 댓글