본문 바로가기

홈어시스턴트 IoT

마당에 사람이 있습니다. Frigate이용 카메라(RTSP) 사람 인식

홈어시스턴트의 마당 쪽 기본 화면은 다음과 같습니다.

 

  • CCTV를 활용하는 수준은 그냥 보기만 하는 것이었습니다.
  • Wyze 앱을 이용하면 화면에 움직임을 감지하여 알림을 받을 수 있지만, 사람이 아닌 움직임과 지나가는 차의 헤드라이트로도 알림이 와서 실효성이 없었습니다. 
  • 이벤트 녹화는 시놀로지 NAS에 움직임 기반으로 하고 있습니다. 

그래서, 이번에는 사람을 제대로 인식하여 실내에 음성으로 알리기 위한 방법을 찾아서 설정해 보았습니다. 

 

홈어시스턴트 대시보드 마당쪽 표시

 

Odroid XU4의 성능이 약해서 Frigate를 외부의 윈도우11 도커에서 가동하여 연동하는 내용입니다. 사람의 인식은 N100 CPU로도 가능하지만 Coral의 Edge TPU보드를 이용했습니다. 

 

최종 기능은 사람이 마당에 있으면, 구글 스피커로 "마당에 사람이 있습니다."라고 방송하는 것입니다. 일단은 잘 되는 듯합니다. 처음에는 강아지도 사람으로 인식하는데, 쳇지피티에게 튜닝 방법을 물어보면 이것 저것 잘 정리해 주며 그대로 따라하면 됩니다. 

 

크롬 PIP기능으로 바탕화면에서 보는 모습

 

이렇게 사용기를 쓰는 것도 사실은 의미가 별로 없는게 쳇지피티나 제미나이에게 물어보면 거의 다 나오거나 물어봐서 해결한 내용이기 때문입니다.

생활 중 불편한 점 - 누가 와도 잘 안보이는 거실 구조   

 

  • 거실의 소파에 앉아 있으면 마당에 사람이 와도 잘 모르는 상황이었습니다.
  • RTSP펌웨어를 올린 Wyze 구형 카메라의 영상을 홈어시스턴트의 대시보드에 띄워서 보기는 하지만, "사람"을 인식하는 기능은 Frigate까지 올리기에는 Odroid가 버거워할 것 같아서 미루고 있었습니다.
  • 그러다가 윈도우11(N100/16GB/512GB)에 Figate 도커 이미지를 이용하고, 구글의 코랄 엣지TPU를 이용할 수 있다는 이야기를 듣고 구축해 보았습니다. 리눅스 우분투로 설치하면 아주 쉽기는 하지만, 윈도우11 프로가 아깝고 다른 용도로도 쓰는 중이라서 이 방법을 사용했습니다. 

작업 필요한 사항 

 

  • 먼저 윈도우11용 도커 데스크탑을 설치할 때 WSL2(윈도우 서브시스템 리눅스)를 사용하도록 선택하고, 도커의 설정 -> 리소스 - WSL Integration에서도 선택해 주어야 합니다(아래 그림 참조). 참고로, WSL2를 윈도우11에서 설치하는 방법에 대해서는 마이크로소프트 코파일럿이나 제미나이, 쳇지피티 등에게 문의하면 잘 안내해 줍니다. 

WSLintegration 선택, 커스텀 설치한 Ubuntu-22.04는 선택 안해도 됩니다.

 

    1. Coral 윈도우용 드라이버 설치(오류가 나오는 ...dk 어쩌구는 설치하지 않거나 나중에 삭제합니다) 
    2. 컴퓨터에 Coral연결하여 장치 드라이버가 잘 잡히는 지 확인(USB-C 케이블 중 충전만 가능한 것들이 있으므로). 참고로 나중에 우분투로 잘 공유가 완료되면, 윈도우의 장치 관리자에서 USBIP Shared Device로 나타납니다.  
    3. 우분투에서 사전 작업을 수행합니다(https://github.com/blakeblackshear/frigate/discussions/4375 참조). 
      1. sudo apt install linux-tools-virtual hwdata
      2. sudo update-alternatives --install /usr/local/bin/usbip usbip `ls /usr/lib/linux-tools/*/usbip | tail -n1` 20
    4. 윈도우11 관리자 파워쉘에서 다음 명령 진행합니다. 만약 usbipd list에 나온 Coral의 값이 1-3인 경우에는 아래와 같이 됩니다. 
      1. usbipd list
      2. usbipd bind --busid 1-3
      3. usbipd attach --wsl --busid 1-3
    5. 공유가 잘 되었으므로 우분투에서 다음 작업을 합니다. 
      1. ping -c 1 google.com     => 의외로 DNS문제로 인터넷이 안되는 경우가 있었습니다. LLM에게 문의하여 해결할 수 있습니다. 
      2. curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /usr/share/keyrings/coral-edgetpu-archive-keyring.gpg
      3. echo "deb [signed-by=/usr/share/keyrings/coral-edgetpu-archive-keyring.gpg] https://packages.cloud.google.com/apt coral-edgetpu-stable main"   | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list
      4. sudo apt update
      5. sudo apt-get install libedgetpu1-std     => Coral 장치가 Google이라는 글자 포함 인식되어야 합니다.  
      6. lsusb   => Bus 001 Device 003: ID 18d1:9302 Google Inc.구입 후 모셔만 두던 구글의 코랄 엣지TPU를 윈도우11 컴퓨터의 USB포트에 연결하고, USBIPD 도구를 이용하여 WSL2에서 돌아가는 우분투에 USB 사용권을 넘겨주어야 합니다. 역시 LLM에게 문의하면 잘 알려주기는 합니다만, 순서는 다음과 같습니다.  

5의 설치 명령은 아래와 같이 해도 됩니다. 

 

echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list

deb https://packages.cloud.google.com/apt coral-edgetpu-stable main

curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
100  1022  100  1022    0     0   1371      0 --:--:-- --:--:-- --:--:--  1371
OK

sudo apt update

sudo apt-get install libedgetpu1-std

 

  • 이제 장치의 연결이 끝났으므로 Frigate 도커 이미지로 컨테이너를 만들어 실행하는 명령은 다음과 같습니다. 참고로, 도커 명령은 윈도우11의 파워쉘에서 해줍니다(커맨드 프롬프트에서도 가능). 
docker run -d `
		  --name frigate `
		  --restart=unless-stopped `
		  --privileged `
		  --shm-size=256mb `
		  -v C:\frigate\config:/config `
		  -v C:\frigate\storage:/media/frigate `
		  -p 5000:5000 `
		  -p 8971:8971 `
		  -p 8554:8554 `
		  -p 8555:8555/tcp `
		  -p 8555:8555/udp `
		  --device /dev/bus/usb:/dev/bus/usb `
		  -e TZ=Asia/Seoul `
		  ghcr.io/blakeblackshear/frigate:0.17.0

 

  • 만약 5000 포트가 사용 중이라고 나오면, 먼저 파워쉘에서 net stop winnat과net start winnat을 간단히 해본 후 안되면 역시 LLM에게 문의하여 방화벽 등 작업을 해 줍니다. 
  • docker logs -f frigate를 통해 최초 User인 admin에 대한 Password가 로그에 나타납니다. https://localhost:8971로 접속할 때에는 이 비밀번호가 필요합니다. 

config.yaml 예시

본인의 상황에 맞도록 xxxx 부분은 바꿔주면 됩니다. 

mqtt:
  enabled: true
  host: 192.168.0.xx
  port: 1883
  topic_prefix: frigate
  client_id: frigate_n100
  user: xxxx 
  password: xxxx

detectors:
  coral:
    type: edgetpu
    device: usb

go2rtc:
  streams:
    wyze_cam:
      - rtsp://xxxx:xxxx@192.168.0.xx/live

objects:
  track:
    - person
    - dog
  filters:
    person:
      min_score: 0.60
      threshold: 0.80
      min_area: 5000
      max_area: 0.45
      min_ratio: 0.20
      max_ratio: 0.55
    dog:
      min_score: 0.55
      threshold: 0.70

cameras:
  wyze_cam:
    enabled: true
    ffmpeg:
      inputs:
        - path: rtsp://127.0.0.1:8554/wyze_cam
          input_args: preset-rtsp-restream
          roles:
            - detect

    detect:
      enabled: true
      width: 640
      height: 360
      fps: 5

    zones:
      yard:
        coordinates: 0.153,0.46,0.629,0.286,0.914,0.528,0.378,0.78
        loitering_time: 0
        inertia: 3
        objects:
          - person
        filters:
          person:
            min_area: 7000
            threshold: 0.82
            max_ratio: 0.50

    review:
      alerts:
        required_zones: yard
      detections:
        required_zones: yard

version: 0.17-0

 

Coral을 사용하고 있는 모습 

 

Frigate의 설정에서 coral 보드가 잘 사용되고 있음을 알 수 있습니다.

 

 

홈어시스턴트에서 필요한 사항  

MQTT 메시지를 받아 줄 Mosquitto broker가 애드온에 설치가 되어 있어야 합니다. 아래 화면의 구성에 가서 로그인할 아이디와 패스워드를 지정하여 추가해 줍니다. 

 

설정 - 애드온에서 설치

 

HACS에서는 Frigate를 설치해 둡니다. 

 

홈어시스턴트와 연동을 위한 Frigate는 HACS에서 설치

 

장치로 추가한 후의 모습

설정 - 통합구성요소 - Frigate - Wyze Cam(이름은 직접 지은 값)을 선택하면 아래와 같이 정보가 나타납니다. Person 항목에는 마지막 사람 인식 모습이 보이며(실제로는 강아지의 겨울 외투의 八 자 모양 때문에 사람으로 오탐됨), 기기 설정에서 "Detect"가 켜진 모습이 확인됩니다. 

 

추가된 Frigate 요소의 상세 내용입니다.

 

야간에 반사된 강아지의 외투와 앞다리가 교묘하게 사람을 닮은 모습

 

결론

N100과 같이 저전력이면서도 고성능의 컴퓨터로 여러 대의 CCTV를 연결하여 관리할 수 있다는 생각이 듭니다. 오탐을 줄이기 위해서는 좀 더 보완이 필요해 보이고, 홈어시스턴트와 연동하여 다양한 기능을 수행이 가능할 것 같습니다. 

 

장치 인식 문제 

 

윈도우11의 WSL2를 통한 장치 작동은 잘 안되는 편입니다. 계속 사용하다가 껐다 켜서 다시 설정하니까 WSL2 우분투에서 Bus 001 Device 003: ID 18d1:9302 Google Inc. 장치로 인식이 잘 안되더군요. 그래서 알게 된 아래 내용을 참고하여 주세요. 

 

WSL2에서 돌아가는 우분투에서 인식이 잘 되어야, WSL2를 기반으로 돌아가는 도커 이미지의 Frigate 컨테이너도 구글 장치로 인식이 잘 되겠지요. 

 

우선 usbipd 명령 시 경고 메시지를 보고 싶지 않으므로, 윈도우11에 드라이버 설치 시 자동으로 설치되는 아래 프로그램을 삭제하세요. 

 

프로그램 추가/삭제에 가서 삭제합니다.

 

그리고, 장치 드라이버에서 아래 내용을 잘 확인하여야 합니다. Coral USB Accelerator로 인식되어야만 usbipd bind와 usbipd attach 가 문제 없이 작동하고, WSL2 기반의 도커 Frigate 인스턴스에서도 잘 인식할 수 있습니다. (DFU)가 붙으면 펌웨어가 잘 올라오지 못했다는 의미입니다. WSL2 우분투는 종료한 상태에서 도커 데스크탑을 실행하여 Coral 장치가 잘 인식된다면 docker logs -f frigate에서 오류가 나오지도 않게 되고, 윈도우11에서는 범용 직렬 버스 장치 밑에서 사라집니다. 아래 사진은 장치관리자 메뉴에서 보기 - 숨겨긴 장치 표시를 한 상태입니다. 

 

장치 관리자에서 인식되는 2가지 종류

 

참고로, Odroid XU4에서도 해보려고 했는데 결국 구글 장치로 인식은 실패했습니다.