Skip to main content

SafeGear Check: 작업장 안전 규정 준수를 위한 Nicla Vision 기반 AI PPE 감지 시스템

이미지 출처: Ahmad Soleh/Stock.adobe.com; AI로 생성

베네샤 아로키아사미(Venesha Arockiasamy), 마우저 일렉트로닉스

2025년 12월 4일

미국 노동부 산업안전보건청(OSHA)의 연구에 따르면, 심각한 손 부상을 입은 근로자의 70%가 사고 당시 장갑을 착용하지 않은 것으로 나타났다.[1] 이는 근로자가 개인보호장구(PPE)를 착용했다면 작업장에서의 부상을 얼마나 예방할 수 있었는지를 보여주는 단적인 예이다.

이 프로젝트는 작업 구역에 들어가는 개인을 스캔하여 필수 PPE를 착용했는지 확인하는 안전 장비 감지 시스템인 'SafeGear Check'를 소개한다. 이 시스템은 Arduino Nicla Vision 인공지능(AI) 카메라 모듈과 Edge Impulse에서 훈련된 AI 모델을 사용한다. 또한 감지 결과에 따라 시각 및 음성 피드백을 제공하는 조명과 스피커가 포함되어 있다.

이 프로젝트에서는 시스템 효율성을 높이기 위해 Nicla Vision 출력을 웹 인터페이스에 연결하는 방법을 포함하여 SafeGear Check 시스템을 구축하는 방법을 알아본다.

프로젝트 자재 및 리소스

프로젝트 하드웨어

프로젝트 코드/소프트웨어

추가 리소스

프로젝트 하드웨어 개요

The Arduino Nicla Vision (그림 1)은 이미지 분석 및 처리를 위해 설계된 AI 통합 카메라 모듈이다. 이 모듈은 거리 측정을 위해 STMicroelectronics VL53LIX ToF(Time-of-Flight) 센서 기반의 근접 센서를 갖추고 있다. Nicla Vision은 객체 인식 및 자산 추적에 적합하다. 모듈의 6축 관성 측정 장치(IMU)는 3D 가속도계 데이터를 캡처할 수 있어 객체 인식을 위한 머신 러닝을 가능하게 한다.

그림 1: Arduino Nicla Vision 모듈. (출처: 마우저 일렉트로닉스)

프로젝트 소프트웨어 개요

이 프로젝트는 다음 소프트웨어 애플리케이션을 사용한다:

  • Edge Impulse는 기존 데이터 세트에서 각 PPE의 여러 이미지를 입력하여 PPE를 식별하도록 AI 모델을 훈련한다.
  • OpenMV IDE는 Edge Impulse 모델을 Nicla Vision에 업로드하고 테스트한다. 또한 감지 결과에 따라 조명 및 스피커를 제어하는 등 Nicla Vision이 수행해야 하는 모든 작업에 대한 코드가 포함되어 있다.
  • Visual Studio Code (VS Code)는 고용주가 필수 PPE를 설정하고 직원이 스캔을 받기 위해 로그인하는 웹 인터페이스(프런트엔드 및 백엔드)이다.

프로젝트 개발

이 프로젝트의 목표는 특정 유형의 PPE를 식별하도록 AI 모델을 훈련하고, 모델을 Nicla Vision 모듈에 업로드하며, 모듈이 시각 및 음성 피드백을 위해 조명, 근접 센서, 스피커를 제어하도록 프로그래밍하는 것이다. 또한 고용주가 필수 PPE를 지정하고 직원이 로그인하여 PPE를 착용하고 있음을 보여줄 수 있는 웹 인터페이스 개발도 포함된다.

이 글에서는 Edge Impulse에서 AI 모델을 훈련하는 것으로 시작하여 하드웨어 및 소프트웨어 구성 요소로 넘어갈 것이다.

Edge Impulse 모델 훈련

Edge Impulse는 모델을 훈련하고 Nicla Vision과 같은 엣지 컴퓨팅 장치에 배포하기 위한 AI 플랫폼이다. 여러 PPE 이미지 데이터 세트를 업로드하여 근로자가 착용한 PPE를 식별하도록 AI 모델을 훈련할 수 있다.

모델 훈련을 시작하려면 먼저 각 PPE(예: 헬멧, 조끼, 마스크)를 착용한 근로자의 이미지가 필요하며, 이는 Roboflow Universe에서 제공하는 것과 같은 기존 데이터 세트에서 찾을 수 있다. 모델이 PPE를 정확하게 식별할 수 있도록, 다양한 각도에서 찍은 이미지와 사람이 착용한 이미지를 포함하여 각 PPE 당 최소 100장의 이미지를 수집한다. 이를 통해 모델은 단순히 PPE 자체를 식별하는 것이 아니라(이것이 주요 목표임) PPE를 착용한 근로자를 식별할 수 있게 된다.

  1. Edge Impulse를 열고 Create New Project를 클릭한다.
  2. 왼쪽 탐색 창에서 Data Acquisition을 클릭한다.
  3. Upload를 클릭하여 수집한 모든 이미지를 업로드한다.
  4. Labeling Queue를 클릭하여 방금 업로드한 이미지를 표시한다.
    1. 각 이미지에 대해 샘플 이름(그림 2)을 클릭하고 PPE 주위에 경계 상자(bounding box)를 그린 다음 라벨을 지정한다.

그림 2: 라벨링 대기열. (출처: 마우저 일렉트로닉스)

참고: PPE에 라벨을 지정할 때 PPE를 착용한 사람을 포함하도록 경계 상자를 그려야 한다 (그림 3). 예를 들어 헬멧에 라벨을 지정하려면 헬멧을 쓴 근로자의 머리 주위에 경계 상자를 그린다. 이렇게 하면 모델이 헬멧 자체만 식별하는 것이 아니라 헬멧을 착용한 근로자를 식별할 수 있다.

그림 3: 경계 상자 그리기 및 라벨링. (출처: 마우저 일렉트로닉스)

  1. Create Impulse를 클릭하여 임펄스 설정을 구성한다 (그림 4).
    1. Image Data블록에서 너비와 높이에 모두 72를 입력한다. Resize Mode 드롭다운 메뉴에서 Fix shortest axis를 선택한다.
    2. Image 블록의 Name 필드에 Image를 입력하고 드롭다운 메뉴에서 Image를 선택한다.
    3. Object Detection (Images) 블록의 Name에 Object detection (Bounding Boxes)를 입력한다. 그러면 블록의 이름이 Object detection (Bounding Boxes)로 변경된다.
    4. Output features에서 Image를 선택하고 PPE 라벨의 이름과 개수를 입력한다.
  2. Save Impulse를 클릭한다.

그림 4: Impulse 설정. (출처: 마우저 일렉트로닉스)

  1. Object Detection (Bounding Boxes)를 클릭한다.
  2. 열리는 Neural Network settings 창에서 다음 매개변수를 입력한다 (그림 5).
    • Number of training cycles: 100
    • Use learned optimizer: deselect the checkbox
    • Learning rate: 0.001
    • Training processor: CPU
    • Data augmentation: select the checkbox
    • Validation set size: 20%
    • Profile int8 model: select the checkbox

그림 5: Neural network 설정. (출처: 마우저 일렉트로닉스)

  1. Neural network architecture (그림 6) 아래에서 FOMO (Faster Objects, More Objects) MobileNetV2 0.35를 선택한다.
  2. Save & train을 클릭한다.

그림 6: Neural network architecture 설정. (출처: 마우저 일렉트로닉스)

도구는 업로드한 이미지를 기반으로 모델의 훈련 성능을 표시한다 (그림 7).

그림 7: 모델 테스트 성능. (출처: 마우저 일렉트로닉스)

참고: 특정 PPE에 대한 백분율이 낮으면 더 많은 이미지를 업로드하고 모델을 다시 훈련한다. Live Classification을 클릭하여 다른 이미지로 모델을 테스트하고 PPE를 정확하게 식별할 수 있는지 확인한다.

  1. 모델을 완성하고 테스트한 후 왼쪽 탐색 메뉴에서 Deployment를 클릭한다.
  2. 배포 옵션으로 OpenMV Library 를 검색하여 선택한 다음 Build를 클릭한다(그림 8).

그림 8: OpenMV 라이브러리 배포. (출처: 마우저 일렉트로닉스)

도구는 훈련된 모델, 라벨 및 객체 인식 모델에 대한 코드가 포함된 Python 파일이 들어 있는 ZIP 폴더를 만든다. 이 모든 파일의 압축을 푼다.

OpenMV IDE에서 모델 실행

이제 Edge Impulse를 사용하여 모델을 훈련했으므로 이를 Nicla Vision에 업로드하고 OpenMV IDE에서 다시 테스트한다.

  1. Micro USB 케이블을 사용하여 Nicla Vision을 컴퓨터에 연결한다.
  2. 자동으로 열리는 Nicla Vision의 저장 폴더에 추출한 trained.tflite 및 labels.txt 파일을 업로드한다.
  3. OpenMV IDE를 연다.
  4. 창의 왼쪽 하단 모서리에 있는 흰색 연결 아이콘을 클릭하여 Nicla Vision을 OpenMV IDE에 연결한다.
  5. 창의 왼쪽 하단 모서리에 있는 녹색 재생 버튼을 클릭하여 object_detection.py를 실행한다 (그림 9).
  6. 창의 오른쪽에 카메라가 활성화되어야 한다. 카메라에 여러 PPE 사진을 보여주어 모델을 테스트한다.
  7. 창의 왼쪽 하단에 있는 Serial Terminal 탭을 클릭한다. 이렇게 하면 카메라의 출력이 표시된다. 예를 들어, 헬멧을 쓴 근로자를 카메라에 보여주면 직렬 터미널에 Helmet이라고 표시된다(그림 9).

그림 9: OpenMV IDE에서 훈련된 Edge Impulse 모델을 실행하는 Nicla Vision. (출처: 마우저 일렉트로닉스)

하드웨어 연결

그림 10의 회로도는 시스템이 제대로 작동하는 데 필요한 하드웨어 연결을 보여준다. 코드에도 이러한 특정 연결이 포함되어 있으므로 핀 번호에 대한 연결을 정확히 따라야 한다.

그림 10: SafeGear Check 하드웨어 회로도. (출처: 마우저 일렉트로닉스)

그림 11은 브레드보드에 완성된 회로를 보여준다.

그림 11: 완전히 구축된 SafeGear Check 회로. (출처: 마우저 일렉트로닉스)

회로를 만들려면 다음 단계를 따른다:

  1. 푸시 버튼을 연결한다.
    1. 각 푸시 버튼에 대해 반대쪽 모서리에 있는 두 개의 단자(예: 대각선 단자)를 찾는다. 대각선 단자 중 하나를 VCC에 연결한다.
    2. 다른 대각선 단자를 10KΩ 저항의 한쪽 끝에 연결하고 저항의 다른 쪽 끝을 GND에 연결한다.
    3. 저항과 동일한 단자에서 해당 버튼에 할당된 Nicla Vision 핀으로 와이어를 연결한다: Helmet 버튼 PE13, Vest 버튼 PE14, Mask 버튼 PE11, Gloves 버튼 PF3.
    4. 각 푸시 버튼에 대해 1~3단계를 반복한다.
  2. 타워 라이트를 연결한다.
    1. 세 개의 NPN 바이폴라 트랜지스터(색상 채널당 하나씩) 각각의 이미터를 GND에 연결한다.
    2. 각 트랜지스터의 베이스를 470Ω 저항의 한쪽 끝에 연결한다.
    3. 각 저항의 다른 쪽 끝을 해당하는 Nicla Vision 출력 핀(각각 PG12, D2, D3)에 연결한다.
    4. 각 컬렉터를 해당하는 타워 라이트 색상 와이어에 연결한다.
      • 녹색 라이트 와이어: PG12 트랜지스터의 컬렉터
      • 빨간색 라이트 와이어: D2 트랜지스터의 컬렉터
      • 노란색 라이트 와이어: D3 트랜지스터의 컬렉터
    5. 역전압 상태로부터 트랜지스터와 LED를 보호하기 위해 각 컬렉터를 다이오드를 통해 +12V 라인에 연결한다. (참고: +12V는 타워 라이트 전용이며, 접지는 공통이어야 하지만 전압 레일은 격리되어야 한다.)

디버그 팁: 트랜지스터로 타워 라이트를 제어할 수 없는 경우, 멀티미터를 다이오드 모드로 사용하여 각 트랜지스터가 제대로 작동하는지 확인한다. 적절한 순방향 전압 강하(일반적으로 0.6V~0.7V)가 있는지 베이스-이미터 및 베이스-컬렉터 접합부를 확인한다.

  1. DFPlayer를 연결한다.
    1. 1KΩ 저항의 한쪽 끝을 DFPlayer의 RX 단자에 연결하고 다른 쪽 끝을 Nicla Vision 핀(D1)에 연결한다.
    2. 1000 µF 커패시터의 양극 단자를 DFPlayer의 VCC에 연결하고 음극 단자를 DFPlayer의 GND에 연결한다.
  2. 모든 접지선을 브레드보드의 접지 레일에 연결한다.
  3. 전원 공급 장치를 벽면에 꽂고 Nicla Vision을 컴퓨터에 꽂는다.

OpenMV 코드에 추가

이제 필요한 모든 PPE를 올바르게 식별할 수 있는 작동 모델이 있으므로, 라이브러리를 가져오고, 하드웨어를 초기화하며, OpenMV의 코드에 로직 문을 추가할 수 있다.

라이브러리 가져오기

다음 코드를 사용하여 필요한 라이브러리를 가져온다:

import sensor, image, time, ml, math, uos, gc, pyb

from machine import Pin, I2C

from vl53l1x import VL53L1X

from pyb import UART

  • sensor 및 image 라이브러리를 사용하면 Nicla Vision 카메라가 그 앞에 서 있는 사람을 스캔하고 필수 PPE 착용 여부를 결정할 수 있다.
  • time 라이브러리는 Nicla Vision 자체의 감지 기간을 정의한다.
  • ml 라이브러리에는 머신 러닝 모델이 포함되어 있다.
  • math 라이브러리는 모델에 사용된 모든 계산을 활성화한다.
  • uos 라이브러리는 microSD 카드의 파일을 포함하여 파일 시스템 작업을 처리한다.
  • garbage collection (gc) 라이브러리는 사용하지 않는 메모리를 해제한다.
  • pyb 라이브러리는 PC와 Nicla Vision 간의 통신뿐만 아니라 Nicla Vision의 모든 하드웨어 입력을 제어한다.
  • Pin 및 I²C 라이브러리를 통해 Nicla Vision은 타워 라이트 및 스피커와 같은 하드웨어를 제어할 수 있다.
  • VL53L1X 라이브러리는 근접 센서를 사용할 수 있게 해준다.
  • UART 라이브러리는 음성 피드백을 위해 DFPlayer 및 스피커와의 통신을 가능하게 한다.

하드웨어 초기화

3개의 상태 표시등과 4개의 푸시 버튼을 Nicla Vision에 연결하려면 초기화해야 한다. 그림 10의 회로도를 참조하여 물리적 연결이 코드에 지정된 것과 일치하는지 확인한다.

green_led = Pin("PG12",Pin.OUT)

yellow_led = Pin("D3",Pin.OUT)

red_led = Pin("D2",Pin.OUT)

 

button_helmet = Pin("PE13",Pin.IN)

button_vest = Pin("PE14",Pin.IN)

button_mask = Pin("PE11",Pin.IN)

button_gloves = Pin("PF3",Pin.IN)

로그 파일 초기화

작업자 정보와 감지 결과를 저장하려면 먼저 system_log.txt라는 텍스트 파일을 만들어야 한다. 그런 다음 해당 파일 이름을 코드에 포함시킨다(예: LOG_FILE = “system_log.txt”). 이는 시스템에 날짜, 작업자 이름 및 감지 결과를 포함하는 타임스탬프가 찍힌 기록을 생성하도록 지시한다.

def log_event(username, message):

   try:

     dt = rtc.datetime()

     timestamp = "{:04d}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}".format(dt[0], dt[1], dt[2], dt[4], dt[5], dt[6])

     log_entry = f"{timestamp},{username},{message}\n"

     with open(LOG_FILE, "a") as f:

       f.write(log_entry)

   except Exception as e:

     print(f"ERROR: Failed to write to log file: {e}")

DFPlayer 및 스피커 초기화

다음 코드는 감지 결과에 따른 음성 출력을 위해 DFPlayer Mini와 통신하도록 UART가 어떻게 구성되는지 보여준다. DFPlayer로 전송되는 각 명령은 고정된 프레임 구조를 따른다. 시작 바이트(0x7E)로 시작하여 버전 바이트, 명령 길이 및 기타 매개변수를 포함하고 종료 바이트(0xEF)로 끝난다. DFPlayer는 이 프레임을 사용하여 볼륨을 설정하고 재생할 적절한 오디오 파일을 선택한다.

START_BYTE = 0x7E

VERSION_BYTE = 0xFF

COMMAND_LENGTH = 0x06

END_BYTE = 0xEF

ACKNOWLEDGE = 0x00

 

uart = UART(9, 9600)

uart.init(9600, bits=8, parity=None, stop=1, timeout_char=1000)

USB COM 포트 연결

DFPlayer와 스피커는 UART 연결을 사용하기 때문에, Nicla Vision의 감지 결과를 웹 인터페이스에서 볼 수 있도록 USB 연결을 설정해야 한다. 이는 USB를 통해 Nicla Vision과 웹 인터페이스 간의 통신을 설정하므로 중요한 단계이다.

usb = pyb.USB_VCP()

근접 센서 임계값 설정

다음 코드는 VL53L1X ToF 센서가 감지할 수 있는 최대 거리(1,000mm)를 설정하고 센서가 움직임이나 존재를 감지할 때 시스템이 활성화되도록 지시한다.

PROXIMITY_THRESHOLD_MM = 1000

tof = None

try:

   tof_i2c = I2C(2)

   tof = VL53L1X(tof_i2c)

   print("INFO: Proximity sensor initialized.")

except Exception as e:

   print(f"ERROR: Proximity sensor not found. Error: {e}")

근접 센서가 활성화되면 노란색 타워 라이트가 켜지고(그림 12), Nicla Vision이 작업자의 존재를 감지하기 시작한다. 작업자가 로그인하면 시스템이 존재 감지를 표시한다.

그림 12: 노란색 타워 라이트를 트리거하는 근접 센서. (출처: 마우저 일렉트로닉스)

푸시 버튼 입력 초기화

다음 코드는 푸시 버튼을 초기화하고 필수 PPE를 선택할 수 있게 해준다. 선택한 각 항목은 웹 인터페이스의 'Employer Settings' 아래에 나타난다.

PPE 선택을 마치고 Log Out을 클릭하면 시스템이 목록을 업데이트하고 이를 Nicla Vision으로 전송한다. Nicla Vision은 이 목록을 사용하여 작업자가 필수 장비를 준수하는지 확인한다.

while(True):

   is_helmet_pressed = (button_helmet.value() == 1)

   is_vest_pressed = (button_vest.value() == 1)

   is_mask_pressed = (button_mask.value() == 1)

   is_gloves_pressed = (button_gloves.value() == 1)

   required_items = []

 

   if is_helmet_pressed:

     required_items.append("Helmet")

   if is_vest_pressed:

     required_items.append("Vest")

   if is_mask_pressed:

     required_items.append("Mask")

   if is_gloves_pressed:

     required_items.append("Gloves")

   current_gear_list = ",".join(required_items)

   if current_gear_list != last_gear_list_sent:

     print(f"GEAR_LIST:{current_gear_list}")

     last_gear_list_sent = current_gear_list

감지 결과를 위한 로직 문 만들기

모든 하드웨어 연결을 초기화한 후 감지 결과에 대한 로직 문을 작성한다. 이러한 문은 PPE의 존재 여부에 따라 시스템이 어떻게 반응하는지 정의한다. Nicla Vision이 모든 필수 PPE를 감지하면 녹색 표시등이 켜지고, 웹 인터페이스에 "all clear" 메시지가 표시되며, 스피커에서 "all clear" 오디오 파일이 재생된다. Nicla Vision이 모든 PPE를 감지하지 못하면 빨간색 표시등이 켜지고, 웹 인터페이스에 누락된 항목이 표시되며, 스피커에서 "missing gear" 오디오 파일이 재생된다.

if all_gear_found:

     final_result_message = "All clear. Please proceed to the site."

     green_led.high()

     send_command(0x03, 0x00, 0x02)

     print(f"RESULT:{final_result_message}")

     time.sleep_ms(500)

   else:

     final_result_message = "MISSING GEAR: {}. Please wear all required safety gear before entering the site.".format(", ".join(missing_items))

     red_led.high()

     send_command(0x03, 0x00, 0x01)

     print(f"RESULT:{final_result_message}")

Visual Studio Code를 사용한 웹 인터페이스 개발

이 프로젝트는 웹 인터페이스의 프런트엔드와 백엔드를 모두 관리하기 위해 VS Code를 사용한다. 프런트엔드 파일은 페이지 디자인을 정의하여 고용주와 직원 모두가 액세스할 수 있도록 한다. 이러한 파일은 public 폴더에 있으며, 여기에는 직원 대시보드 페이지, 고용주 및 직원 로그인 페이지, 고용주 설정 페이지가 포함된다(그림 13).

이러한 파일에 액세스하려면 VS Code에서 SGC-WEB 프로젝트를 연다. 열리면 왼쪽 패널(즉, 탐색기)에 public 폴더를 포함하여 SGC-WEB 내의 모든 폴더가 표시된다.

server_app 폴더에는 server.js 파일이 들어 있으며, 여기에는 Nicla Vision에서 웹 인터페이스로의 직렬 포트 연결이 포함되어 있다.

그림 13: Visual Studio Code 파일 레이아웃. (출처: 마우저 일렉트로닉스)

다음 코드는 서버를 생성하고 설정하기 위해 웹 인터페이스와 직렬 포트 연결을 설정한다.

const express = require('express');

const http = require('http');

const { Server } = require("socket.io");

const { SerialPort } = require('serialport');

const { ReadlineParser } = require('@serialport/parser-readline');

const app = express();

const server = http.createServer(app);

const io = new Server(server);

다음 코드는 푸시 버튼 인터페이스, Nicla Vision 및 웹 애플리케이션 간의 데이터 교환을 관리한다. parser.on('data', ...) 함수는 Nicla Vision에서 Node.js 백엔드로 전송된 직렬 메시지를 수신한다. 선택한 안전 장비를 나타내는 입력 데이터가 수신되면, 서버는 웹 인터페이스에 gear-list-update 이벤트를 내보낸다. 처리 후 Nicla Vision은 선택한 안전 장비가 식별되었는지 여부를 나타내는 감지 결과를 보내고, 이는 detection 이벤트로 전송된다. 이러한 결과는 웹 인터페이스의 해당 시각적 표시기와 스피커의 사운드를 제어한다.

parser.on('data', (data) => {

  console.log('Data from Nicla:', data);

  if (data.startsWith('GEAR_LIST:')) {

   const listString = data.substring(10).trim();

   io.emit('gear-list-update', listString);

  }

});

 

parser.on('data', (data) => {

  console.log('Data from Nicla Vision:', data);

  if (data.startsWith('RESULT:')) {

   const userMessage = data.substring(7);

   io.emit('detection', userMessage);

  } else if (data.startsWith('ERROR:')) {

   io.emit('detection', data);

  }

});

server.js 파일의 나머지 부분은 Express를 사용하여 서버 라우팅을 정의한다. 이러한 경로는 브라우저에 제공되는 프런트엔드 파일(예: 로그인 페이지 또는 고용주 대시보드)과 사용자가 웹 인터페이스와 상호 작용할 때(예: 사용자 이름 제출, 로그인 또는 페이지 간 이동) 발생하는 작업을 지정한다. 이 파일에는 웹 인터페이스를 시작하는 node server.js를 실행할 때 서버를 초기화하는 로직도 포함되어 있다. 콘솔 로그 문은 코드 전체에 포함되어 사용자 로그인 및 장비 감지에서 로그아웃에 이르기까지 모든 기능이 올바르게 실행되고 시스템이 의도한 대로 실행되고 있는지 확인한다. 서버를 실행하기 전에 컴퓨터의 장치 관리자에서 Nicla Vision에 할당된 COM 포트를 확인하고 server.js에 지정된 포트(예: COM5)와 일치하는지 확인한다. 이렇게 하면 Nicla Vision과 PC 간의 적절한 직렬 통신이 보장된다.

실행

이제 모든 하드웨어 및 소프트웨어 구성 요소를 통합할 준비가 되었다 (그림 14).

  1. VS Code에서 server.js가 포함된 폴더에 터미널을 열고 npm init를 실행하여 package.json 파일을 만든다. 그러면 node.js 환경이 초기화된다.
  2. npm install express 를 실행하여 Express 프레임워크를 설치한다(node_modules 폴더가 생성되고 package-lock.json이 업데이트됨).
  3. npm install을 실행하여 package.json에 나열된 추가 패키지를 설치한다.

이러한 종속성을 통해 백엔드는 웹 인터페이스 및 Nicla Vision 모두와 통신할 수 있다.

  1. Nicla Vision용 OpenMV IDE 코드와 VS Code의 모든 프런트엔드 및 백엔드 파일을 저장한다.
  2. 포트 충돌을 방지하기 위해 Nicla Vision의 플러그를 뽑았다가 다시 연결한다.

그림 14: SafeGear Check의 최종 설정. (출처: 마우저 일렉트로닉스)

다음 단계에서는 server.js 파일을 실행하여 웹 인터페이스를 열고 고용주로 로그인하여 설정을 구성한 다음 직원으로 로그인하여 PPE를 착용한 상태에서 시스템 기능을 테스트한다.

  1. VS Code 터미널에서 node server.js를 실행한다(그림 15).

    클릭 가능한 링크(http://localhost:3000)가 제공된다.

그림 15: VS Code 터미널에서 server.js 실행. (출처: 마우저 일렉트로닉스)

  1. 링크를 클릭하여 SafeGear Check용 웹 인터페이스를 연다 (그림 16).

그림 16: Employee Sign-In 페이지는 메인 랜딩 페이지이기도 하다. (출처: 마우저 일렉트로닉스)

  1. 페이지 오른쪽 상단에 있는 Employer Settings 버튼을 클릭한다.
  2. Employer Sign-In 페이지(그림 17)에서 Employer ID로 "Mouser"를 입력한다. 필요한 경우 VS Code의 "employer-login" 파일에서 이 필드를 수정할 수 있다.

그림 17: Employer Sign-In 페이지. (출처: 마우저 일렉트로닉스)

  1. Employer Settings 페이지(그림 18)에는 회로의 어떤 버튼이 어떤 PPE에 해당하는지 표시된다. 브레드보드에서 필수 PPE에 해당하는 버튼을 누른다.

그림 18: Employer Settings 페이지. (출처: 마우저 일렉트로닉스)

  1. 버튼을 누르면 해당 PPE 이름이 화면에 나타나며 (그림 19), Nicla Vision이 확인할 필수 PPE로 설정이 확정된다.
  2. 필수 PPE를 설정한 후 Return to Sign-in Page를 클릭하여 로그아웃하고 Employee Sign-In 페이지로 돌아간다.

그림 19: 필수 PPE 설정. (출처: 마우저 일렉트로닉스)

  1. 이름과 성을 사용하여 Employee Sign-In 페이지 (그림 20)에 로그인한다.

그림 20: Employee Sign-In 페이지. (출처: 마우저 일렉트로닉스)

  1. 로그인 확인을 받으면 (그림 21), Start Safety Check를 클릭한다. 근접 센서가 존재와 움직임을 감지하여 노란색 표시등이 켜지도록 트리거해야 한다.

그림 21: 안전 점검 시작 페이지. (출처: 마우저 일렉트로닉스)

  1. Nicla Vision은 직원을 스캔하여 Employee Settings 페이지에서 선택한 모든 PPE를 착용하고 있는지 확인한다.
    1. Nicla Vision이 누락된 PPE를 감지하면 빨간색 표시등이 켜지고 (그림 22), 스피커에서 “Missing Gear” 오디오 메시지가 재생되며, 웹 인터페이스에는 누락된 PPE를 항목별로 보여주는 “Missing Gear” 메시지가 표시된다 (그림 23).

그림 22: 누락된 PPE를 알리는 빨간색 표시등, 화면 메시지 및 음성 메시지. (출처: 마우저 일렉트로닉스)

그림 23: 작업자가 PPE를 누락했을 때 웹 인터페이스에 표시되는 장비 누락 메시지. (출처: 마우저 일렉트로닉스)

    1. Nicla Vision이 모든 필수 PPE를 감지하면 녹색 표시등이 켜지고(그림 24), 스피커에서 “All Clear” 오디오 메시지가 재생되며, 웹 인터페이스에 “All Clear” 메시지가 표시된다(그림 25).

그림 24: 필수 장비가 감지될 때 나타나는 All Clear 메시지, 녹색 표시등 및 해당 음성 메시지. (출처: 마우저 일렉트로닉스)

그림 25: 필수 장비가 감지될 때 웹 인터페이스에 나타나는 All Clear 메시지. (출처: 마우저 일렉트로닉스)

  1. "All Clear" 메시지를 받으면 Log Out을 클릭한다. 시스템이 초기화되어 다음 직원이 로그인할 수 있게 된다.
  2. 직원의 로그인 정보와 감지 결과는 Systems_log.txt 파일에 저장된다(그림 26).

그림 26: system_log.txt 파일의 날짜, 시간, 직원 이름 및 감지 결과. (출처: 마우저 일렉트로닉스)

맺음말

SafeGear Check 프로젝트는 Arduino Nicla Vision이 위험한 환경에서 작업하기 위해 올바른 PPE를 착용한 직원을 어떻게 효과적으로 감지할 수 있는지 보여준다. Nicla Vision은 Edge Impulse의 훈련된 AI 모델을 사용하여 필수 PPE를 효과적으로 식별하는 동시에, 감지 결과에 따라 타워 라이트 및 스피커와 같은 외부 요소를 제어할 수 있다.

시스템의 웹 인터페이스를 통해 고용주는 필수 PPE를 설정할 수 있고, 직원은 로그인하여 감지 시스템을 활성화할 수 있다. SafeGear Check를 사용하면 고용주는 위험한 환경에 들어가기 전에 직원이 장비를 잘 갖추고 보호받고 있는지 확인할 수 있어 작업장 사고 건수를 줄이는 데 도움이 된다.

 

출처

[1]https://www.osha.gov/laws-regs/federalregister/1994-04-06

 


저자 소개

베네샤 아로키아사미(Venesha Arockiasamy)는 럿거스 대학교(Rutgers University)Profile Photo of Venesha Arockiasamy에서 컴퓨터 공학을 전공하고 있는 예비 4학년 학생이다.  그녀는 임베디드 시스템과 인공지능의 실용적인 응용 분야에 깊은 관심을 두고 있다. 하드웨어 및 소프트웨어 분야의 경험을 바탕으로, 베네샤는 이 두 분야를 결합하여 기술과 머신러닝을 통해 현실 세계의 문제를 해결하는 새로운 방안을 모색하고자 한다.