ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [아두이노]딥러닝을 이용한 마스크 인식/알람 시스템
    Projects/Deep learning 2020. 8. 31. 11:33

    개발 목적

     

    코로나 19 바이러스가 재 확산하는 지금, 감염 확산을 막기 위해 마스크 착용은 그 어느 때보다 중요하다.

     

    그래서 건물 입구 등에 설치되어 마스크 착용 여부를 인식하는 기계를 만들기로 했다.

     

     

     

    설계

     

    • ESP32와 PC는 서버와 클라이언트의 관계로 연결된다.
    • ESP32 카메라 웹서버 예제를 베이스로 만들었다.
    • 서버를 열고 PC에서 http 리퀘스트를 보내어 조작하도록 한다.
    • ESP32와 아두이노는 Pin출력으로 소통한다.
    • ESP32 자체의 핀 만으로 알람 시스템을 구현하기에는 부족해서 아두이노  나노를 추가했다.

     

     

    부품 구성

     

     

    부품목록

     

    • ESP32 cam
    • Arduino nano
    • PIR sensor
    • piezo buzzer
    • RGB LED
    • Resistor
    • 기타 (브레드보드, 배터리)

     

    간단한 부품들을 사용했다. 디바이스 마트에서 만원 안쪽으로 구매 가능하다.

     

    아두이노 보드는 우노나 메가를 사용해도 되지만 수행할 역할이 워낙 간단하고 필요한 핀도 적어서 가장 작은 모델을 사용했다.

     

    레지스터는 330옴을 사용했다. LED에 연결할 용도이다.

     

    이외에 회로 구성에 브레드보드, 점퍼케이블(암수, 수수), 보조배터리, 케이블타이가 쓰였다. 납땜은 필요 없다. 

     

    전체적인 개발과정은 다음과 같다.

     

    1. 학습모델 만들기
    2. 텐서플로우로 마스크 인식 확인하기
    3. ESP-32 cam 연결
    4. 아두이노 나노와 연결
    5. 하드웨어 구성

     

     

    구글 티쳐블머신

    구글 티쳐블 머신으로 마스크 착용과 미착용 사진을 학습시켰다.

     

    직접 텐서플로우를 이용해서 학습시킬 수도 있지만 시간이 너무 오래 걸려서 티쳐블 머신을 사용했다.

     

    노트북으로 돌리다 보니 구글 코랩을 이용해도 한 에포크에 30분씩 걸렸던 거 같다. 그리고 티쳐블머신이 정확도도 높은 편이었다.

     

    이후에 blank라는 클래스를 하나 더 추가했다.

    인식률도 실시간으로 확인할 수 있고 그에 따라 에포크, 배치 크기, 학습률도 조절할 수 있다.

     

    마스크를 제대로 쓴 사진은 on_mask 클래스에 추가한다.

     

    마스크를 쓰지 않은 사진은 물론이고 반쯤 내려쓰는 경우(턱스크)도 추가시켜줬다. 

     

    blank 클래스는 나중에 추가했다. object detection이 아니라서 사람이 없을 때도 빈 배경으로 나름대로의 판단을 내리기 때문에 그 경우를 처리하기 위해 추가해줬다.  텅 빈 벽 사진 등을 넣었다. 

     

     

    학습이 완료된 모델은 'Export Model'을 통해 다운받을 수 있다. 정말 고마운 서비스다!

     

    PyCharm에서 학습모델 테스트하기

    Python의 라이브러리인 openCV를 이용해 본다..

     

    파이참에서 웹캠영상을 불러오고, 미리 학습된 모델로 마스크 착용 여부를 판별한다.

     

    다운받은 모델을 디렉토리에 넣어주면 된다. 

     

    추후에 http request를 보내는 등 PC 측에서 모든 처리는 파이참에서 진행할 예정이다.

     

    학습모델 테스트. 잘 인식된다.

     

     PyCharm으로 ESP32 스트리밍 영상 받기

     

    앞에서 openCV는 노트북에 내장된 웹캠을 이용해서 영상정보를 받았다. 

     

    하지만 esp32-cam으로 영상을 받아 알림까지 하는 모듈을 만드는게 목표이기 때문에 ESP32 영상을 파이참에서 불러들이도록 한다.

     

     

     

    ESP32의 영상은 MJPEG 형식으로 인코딩 되어 전송된다.

     

     

    PyCharm에서는 전송된 바이트를 다시 복호화해서 이미지(영상)로 나타낸다.

     

    이제 파이참에서 esp32 스트리밍 영상을 받아 볼 수 있다.

     

    다음으로 esp32에 플래시라이트 기능을 추가해보자

     

    ESP32 기능 추가 - 플래시

     

    ESP32 예제의 파일 중 하나인 camera._index.h를 살펴보자. 소스파일에 16진수의 배열이 있다.

     

    Html소스를 esp32 용량 문제로 압축해놓은 것이다.

    복호화를 해주면 확인할 수 있다.

     

    ESP32의 4번 핀은 플래시다(Ai thinker 기준) .

     

    Flash 스위치를 누르면 4번 핀 출력을 HIGH로 두는 함수를 추가하고 html 소스에도 버튼을 추가한다.

     

    수정한 htmlhtml 소스를 다시 압축한다. 원래 위치에 붙여넣기 해주고 Length도 바뀐 코드 길이에 맞게 수정한다.

     

    위 우측 사진을 보면 Flash라는 이름의 스위치가 추가됐음을 확인할 수 있다.

     

     

    플래시가 정상 작동하는 모습이다.  우측 사진을 보면 Flash lamp가 그것이다. 켰을 때 만지면 뜨거우니 조심하자.

     

    alert_handler, normal_handler, blank_handler를 추가한다.

     

    각각 마스크 미착용자, 마스크 착용자, 아무도 없을 때에 대응한다.

     

    GPIO 12, GPIO13번에 대한 핀출력을 각각 달리한다.

     

    alert_handler : 12 HIGH 13 LOW

    normal_handler : 12 LOW 13 HIGH

    blank_handler : 12 LOW 13 LOW

     

     

    80번 포트에는 영상 화질, 색상, 효과 등을 설정할 수 있는 조작 화면이 뜬다.

    화면이 송출되는 동안에도 조작할 수 있다. 또한 추가한 알람기능알람 기능(http request)80번 포트로 전송된다.

    Start Stream버튼을 누르면 스트리밍영상이 뜨지만 여기서는 사용하지 않는다.

     

    81번 포트는 영상 스트리밍만을 위한 포트다.

    파이참 텐서플로우에서 영상을 분석하기 위해서는 화면에 스트리밍 영상외엔 아무것도 없어야 한다.

     

    결선도

    마스크 미착용자 발견 시 GPIO 12번이, 착용자 발견 시 13번이 HIGH가 된다. 아무도 없을 경우에는 둘다 LOW.

     

    Arduino nanoesp3212, 13번 핀으로부터 6, 5번 핀에 디지털 입력을 받는다.

     

     

     

    아두이노 프로그래밍

     

    아두이노 나노의 코드는 간단하다. 

     

    PIR센서 값이 1이고 5번 핀으로 디지털 입력을 받으면 사이렌(피에조 부저)을 울리고 빨간색 LED 켠다.

     

    6번 핀으로 디지털 입력을 받으면 초록색 LED불이 들어온다.

     

    Blank(사람이 화면에 없는 경우) 일) 때는 모두 끈다.

     

    http request를 보내서 알람이 잘 작동하는지 확인한다.

     

    위 사진에서는 Postman을 사용했지만 아무 웹 브라우저나 이용해서 보낼 수 있다.

     

    서버의 http request 응답은 null로 설정했기 때문에 빈칸밖에 받을 수 없다. 응답을 받는 게 목적이 아니라 핀 출력을 하기 위한 것이므로 비워뒀다.

    PyCharm에서는 “requests” 라이브러리를 이용해 http 요청을 보낸다.

     

    마스크 착용 여부 판별 결과에 따라 URL을 바꿔준다.

     

    너무 많은 http 요청이 전송되는 걸 방지하기 위해 마스크 착용 판별 여부가 바뀌었을 때만 요청을 보내도록 한다.

     

    HTTP Request 테스트

     

    각각의 요청에 맞게 불빛이 잘 들어오는 모습이다.

     

     

    하드웨어 구성

    Arduino Nano에 보조배터리를 연결하고 브레드보드와 보조배터리를 묶어 거치대에 장착한 모습이다.

     와이파이가 있는 곳이면 어디서든 쓸 수 있다.

     

    최종 테스트

    설치까지 완료하고 테스트를 진행한다.

     

    마스크를 쓰지 않았을 때 빨간불이 들어오고 사이렌이 울린다.

     

    마스크를 쓰면 사이렌은 꺼지고 초록불이 들어온다.

     

    간혹 오류로 사람이 없을 때도 마스크 미착용으로 인식하더라도 PIR 센서가 반응하지 않기 때문에 경보는 울리지 않는다.

     

     

    참고자료

    “Adding features to Examples->ESP32->Camera->CameraWebServer“, https://www.esp32.com/viewtopic.php?t=11190

    “Editing Camera Web Server HTML Source Code for the ESP32-CAM”, https://youtu.be/bIJoVyjTf7g

    ESP32-CAM Python stream” https://gist.github.com/youjunjer/79e5dad5f47ee5757fcb9d401a95e76b

    CyberChef”, http://icyberchef.com/

    deepLearning start guide”, https://github.com/JeiKeiLim/dl_start_guide/tree/master/02_TensorFlow/06_application/01_mask_nomask

     

    +소스코드: 깃헙

    'Projects > Deep learning' 카테고리의 다른 글

    Face mask detection system using Deep learning  (1) 2020.08.31
Designed by Tistory.