GDSC-University-of-Seoul / 2021-spring-project

Repository for DSC-UOS Spring Project Team
8 stars 0 forks source link

[SPRINT#3] 프로젝트 시작을 위한 준비작업 - 조사 작업 #3

Closed handal95 closed 3 years ago

handal95 commented 3 years ago

Title

1주차 미션

Description

프로젝트 시작을 위한 준비작업을 시작합니다.

주제 선정에 대해 논의한 내용들은 기반으로 보다 구체화된 프로젝트의 목표 설정을 위해서 각 PART 별 담당자는 관련 부분에 대한 조사 작업을 진행합니다.

프로젝트의 흐름

영상 센서 데이터를 활용해서 데이터를 수집한다. 수집된 데이터는 Server로 전송해서 가공한다. 머신러닝을 활용해 데이터를 가공해 서비스 모델을 구현한다. 구성된 서비스는 주로 Web에 초점을 맞추어 제공된다.

위의 프로젝트 흐름을 구체화 하기 위해서 관련 자료들의 조사 및 환경 구축을 준비합니다.

Mission List

@handal95 영상데이터 관련 오픈 데이터셋 조사

@edit8080
JIRA 툴 사용 관련 멤버 초대 등 / 간단한 UI 스토리보드

@rxdcxdrnine Local환경에 node.js 서버 구축 테스트

@YubeenSon 프로젝트에 사용할 DBMS 조사 ( 영상 데이터 관련 )

@owao 보유중인 센서 키트 확인, 영상 센서 구입 시 필요 예산 및 스펙 확인

Assignees Checklist

edit8080 commented 3 years ago

현재까지 비디오 스트리밍 방법을 찾기 위한 진행한 과정과 발생한 이슈를 공유합니다.

1. Flask를 활용한 비디오 스트리밍

현재 파이 카메라가 없는 관계로 노트북의 웹 캠을 이용하여 비디오 스트리밍을 진행해보았습니다. 여기까진 난이도가 높지 않아 정상적으로 스트리밍되는 것을 볼 수 있었습니다. (코드 - https://github.com/edit8080/Webcam-Streaming)

2. React와 결합 시도

이제 프론트엔드에서 사용할 React와 결합하기 위해 웹 동작과 라우팅 정보를 가지고 있는 React 파일을 Webpack을 통해 Flask 서버가 활용할 수 있도록 변환하는 방법을 생각했습니다. image

하지만 위 방법에서는 정상적으로 React 라우팅이 동작하지 않았고 이를 해결하기 위해 추가적인 문의와 자료를 검색했습니다.

3. API? Socket.io?

위 문제를 해결하기 위해 찾아낸 첫 번째 방법은 Flask 서버에서 비디오 프레임 데이터를 내보내는 API를 구성하는 방법입니다. Flask 서버에서 API형태로 비디오 프레임을 내보내면 React에서 axios를 사용해 해당 비디오 프레임을 가져올 수 있습니다. image

두 번째 방법은 Flask 서버와 백엔드를 Socket.io로 통신하면서 비디오 프레임을 내보내는 방법입니다. 이후 React에서 백엔드 가 Flask 서버에서 받은 비디오 프레임을 사용할 수 있습니다. image

두 방법의 차이를 생각한다면 첫 번째로는 단방향과 양방향이라고 생각합니다. 만약 라즈베리파이의 Flask서버에서 비디오 프레임만을 받는 것으로 충분하다면 첫 번째 방법을, 전달받은 비디오 프레임을 백엔드에서 처리한 후 다시 라즈베리파이로 전송해야 하는 동작이 필요하면 두 번째 방법이 좋다고 생각합니다.

두 번째 차이는 성능의 차이입니다. 비디오 스트리밍간 발생하는 프레임 데이터의 양은 매우 많을 것입니다. 이 과정에서 백엔드를 거치게 되면 첫 번째 방법과는 당연히 어느 정도의 성능 차이가 존재할 것입니다. 따라서 성능을 우선적으로 판단한다면 첫 번째 방법이 더 좋다고 생각합니다.

멤버분들의 의견이나 피드백 언제나 환영합니다 😀

owao commented 3 years ago

ESP32-CAM

https://www.youtube.com/watch?v=9KfZub1dvaM 아두이노 연결 없이 통신할 때는 이런 식으로 사용되는 것 같습니다!(조립된 이미지를 보여드리기 위해 가져왔습니다)

https://makernambo.com/109 ESP32-CAM가 이런 식으로 서버로 프레임을 전송하는 것 같은데, 이 서버에 올린 데이터를 우리 서버로 받아오면 라즈베리파이가 굳이 없어도 되지 않을까 싶습니다.

https://blog.naver.com/mandlenam/222265034777 MQTT를 이용하면 원격으로 센서데이터를 받아올 수 있다고 하네요. 스크럼에서 MQTT 얘기가 나왔던 것 같아 가져와 봤습니다.

YubeenSon commented 3 years ago

Cassandra DB

자세한 설명이 있는 페이지 링크를 첨부합니다 https://meetup.toast.com/posts/58 https://baek.dev/post/23/

장점이 많아 보이지만, Cassandra DB는 정말 대용량의 데이터의 빠른 입, 출력에 쓰이는게 적합하다 생각되어 MongoDB가 본 프로젝트에 더 적합하겠다고 생각하였습니다!

handal95 commented 3 years ago

실제 IoT Device 를 통해서 데이터를 받아오기 전까지 모델 학습 및 이상행동 관련 행동 검출을 위해서 AI HUB의 CCTV 이상행동 감지 데이터 셋을 사용하겟습니다!

데이터 다운로드받으려면 사용 승인이 필요해서 월요일 중으로 데이터 사용 신청진행해두겠습니다!

owao commented 3 years ago

ESP32CAM 구매

더 싼 곳을 찾아서 배송비 포함 11300원으로 주문 완료했습니다! 아두이노에 연결하면 되니까 FTDI 프로그래머는 따로 구입하지 않았습니다. 이후 기기 관련으로 지출이 발생한다면 출력 장치(필요하다면)와 아두이노 휴대용 배터리 정도가 될 것으로 생각됩니다.

handal95 commented 3 years ago

실제 IoT Device 를 통해서 데이터를 받아오기 전까지 모델 학습 및 이상행동 관련 행동 검출을 위해서 AI HUB의 CCTV 이상행동 감지 데이터 셋을 사용하겟습니다!

데이터 다운로드받으려면 사용 승인이 필요해서 월요일 중으로 데이터 사용 신청진행해두겠습니다!

오늘 AI HUB의 이상행동 감지 데이터 셋 사용관련 승인 신청을 보냈습니다! 심사에 하루 정도걸리고, 신청 사유에 따라 반려되는 경우도 있다 하니 데이터셋 신청 승인되는 대로 추가 답글 달아두겠습니다

rxdcxdrnine commented 3 years ago

https://github.com/DSC-University-of-Seoul/2021-spring-project/tree/feature/backend-test

MQTT 이용해 간단하게 python 의 mqtt 클라이언트에서 node 의 mqtt 클라이언트로 메시지를 전달하는 코드를 구현하였습니다. 위 브랜치에서는 임의로 온도가 0.5초 간격으로 전달됨을 가정하고 코드를 작성하였습니다.

MQTT 를 구현하기 위해서는 MQTT 브로커를 설치해 실행한 뒤, app.py 에서는 메시지를 전달(publish), app.js 에서는 메시지를 구독(subscribe) 하는 과정이 필요합니다. 아래 그림이 이해에 더 도움되실 것 같아요!

image

정윤님께서 전에 올려주신 링크(http://wiznetacademy.com/wp/?p=8267)와 저희 프로젝트가 비슷하게 진행될 거라고 생각하는데, 링크에서도 MQTT 브로커를 PC에 설치하는 과정이 역시 필요합니다.

그리고 MQTT에 관해서 보다보니 멀티스레드, 블로킹에 관한 이슈도 꽤 보이던데, MQTT 브로커가 설치된 PC에서 메시지 전달만 전담하고 이벤트를 처리할 필요가 없다면 크게 문제가 될 것 같지는 않을 것 같습니다. 수요일까지는 이미지 파일을 전달할 fiel object 나 base64, 3D array 등 여러가지 수단 중에서 어떤 것이 더 나을지 생각해보고 테스트해보겠습니다.

edit8080 commented 3 years ago

조사를 진행하면서 비디오의 실시간 스트리밍을 위해 REST API를 사용하는 것보다 ESP32-CAM의 비디오 스트리밍 서버 기능을 사용하는 것이 더 편리하다고 생각했습니다. 따라서 사용자 인터페이스에서 비디오 스트리밍 기능은 정윤님이 올려주신 자료를 참고하여 ESP32-CAM의 비디오 스트리밍 서버 기능을 사용할 예정입니다.

다음은 IoT와 백엔드를 REST API를 통해 연계하는 방법을 조사했습니다. 이를 위해서는 ESP32-CAM에서 촬영하는 비디오 프레임 데이터를 일정한 delay 간격으로 나누어 이미지 파일로 저장하는 웹 서버를 구성하는 방법이 가장 좋다고 생각했습니다. 이미지 웹 서버를 구성하면 추후 ML 이나 Data 파트에서도 해당 웹 서버에 저장된 이미지를 통해 학습 결과를 도출하거나 DB에 관련 이미지의 링크를 저장할 수 있다고 생각했습니다. 제가 참고한 자료에서는 이미지 웹 서버를 PHP로 구성하여 활용하고 있는데 이는 저희의 환경에 맞게 구성하면 될 것 같습니다.

image

이전 회의 때 논의된 이슈로 비디오 프레임(이미지)의 전송을 위한 로컬 PC의 필요성이 대두된 바 있습니다. 이 문제와 웹 서버 구성 문제를 해결하기 위해 클라우드 서비스(AWS IoT Core)의 활용을 제안하는 바입니다. AWS IoT Core는 IoT에서도 AWS에 접근할 수 있도록하는 AWS 서비스입니다. AWS IoT Core를 통해 ESP32-CAM에서 촬영한 이미지를 AWS S3 에 저장하는 방식을 사용하면 로컬 PC의 제한과 웹 서버 구성 문제를 동시에 해결할 수 있을 것으로 예상됩니다. 만약 이 방법을 채택한다면 저희가 구성할 동작과 거의 일치하는 다음의 자료를 참고할 수 있습니다. 이 부분은 AWS IoT 서비스 구성에 MQTT 연결이 필요하기에 창구님(@rxdcxdrnine)의 의견을 듣고 싶습니다.

image

rxdcxdrnine commented 3 years ago

@edit8080

정말 좋은 아이디어 감사합니다! 저도 MQTT 브로커 역할을 할 로컬 PC 대신 AWS IoT Core 를 사용하는 쪽이 더 안정성 있고 경험치를 쌓는데 있어서 좋을 거라고 생각했습니다. 다만 맨 아래 이미지에서 lambda 를 이용하면 백엔드와 ML을 포함한 프로젝트 전체를 전반적인 데이터 파이프라인을 AWS 에 올리는 것을 고려해봐야할 것 같습니다.

또 아두이노 ESP32 에서 이미지 웹서버에 저장하는 부분을 구체화 해보고자 합니다. DB hit 을 줄이기 위해 아래 방법들을 생각해보았습니다.

(로컬 DB를 사용할 경우)

  1. IoT Core MQTT Broker 로부터 Subscribe 후 이미지 파일을 받아 In-memory DB 에 저장 후, 일정 시간 간격 (예를 들면 1분) 마다 local DB 이미지 파일 insert
  2. AWS S3 에 이미지 파일을 저장 후, 일정 시간 간격 (예를 들면 1분) 마다 crontab 등을 이용한 스케줄링으로 local DB 파일 경로 insert

(AWS NoSQL DB 를 사용할 경우)

  1. AWS S3 에 이미지 파일을 저장 후, AWS NoSQL DB (e.g. DynamoDB/DocumentDB) 로 AWS lambda 를 이용해 DB insert

아직 AWS에 대해 아는게 거의 없어 공상에 그칠 방법일 수도 있을 것 같습니다 ㅋㅋ 데이터 파이프라인에도 신경써주신 태희님께 감사드립니다!

rxdcxdrnine commented 3 years ago

https://github.com/DSC-University-of-Seoul/2021-spring-project/tree/feature/backend-test

aws iot 에 기기를 등록하고 노드의 aws-iot-device-sdk 모듈을 통해 aws iot 와 연결하고 테스트까지 진행해봤습니다. 디바이스 인증서 등록을 제외하고는 노드의 mqtt 모듈과 쓰임새가 거의 똑같고, 활용하는데 어렵지 않을 것 같습니다.

aws iot 요금과 프리티어 정책은 아래 링크에서 확인하실 수 있습니다.

https://aws.amazon.com/ko/iot-core/pricing/

handal95 commented 3 years ago

https://github.com/DSC-University-of-Seoul/2021-spring-project/tree/feature/backend-test

aws iot 에 기기를 등록하고 노드의 aws-iot-device-sdk 모듈을 통해 aws iot 와 연결하고 테스트까지 진행해봤습니다. 디바이스 인증서 등록을 제외하고는 노드의 mqtt 모듈과 쓰임새가 거의 똑같고, 활용하는데 어렵지 않을 것 같습니다.

aws iot 요금과 프리티어 정책은 아래 링크에서 확인하실 수 있습니다.

https://aws.amazon.com/ko/iot-core/pricing/

@rxdcxdrnine AWS IoT 서비스를 사용하는 목적에 영상을 스트리밍하는 것도 포함하는 건가요?? 아니면 단순히 MQTT를 통한 일반 Push 알람 같은 용도를 목적으로 하는 서비스인가요?

영상이 목적이라면, 뭔가 요금 정책에 따라서 계산을 해보긴 했는데, 디바이스 당 스트리밍 비용이 월 10,368 USD 으로 나와서 뭔가 제가 요금 책정 방식을 잘못 이해한건가 싶네요

===========================================

AWS 메시징 요금 정책 요금 예 1

30일 동안 사용자 디바이스에서 매시간 2KB의 메시지 1개를 AWS IoT Core에 게시하고 AWS IoT Core는 이 메시지를 5개의 다른 디바이스에 전달합니다. 요금은 다음과 같이 계산됩니다.

AWS IoT Core로 게시 비용

게시된 메시지 수: 메시지 1개/시간 24시간/일 30일 = 메시지 720개 게시된 메시지 요금: 메시지 720개 * 1 USD/메시지 1,000,000개 = 0.00072 USD

30일동안 매 시간 72GB의 메세지 1개 (~ 5kb의 메세지 14.4M개 )에 대한 게시비용

게시된 메시지 수: 메시지 14,400,000개/시간 24시간/일 30일 = 메시지 10,368,000,000 개 게시된 메시지 요금: 메시지 약 10,368,000,000 개 * 1 USD/메시지 1,000,000개 = 10,368 USD = 기기 한대의 24시간 영상을 AWS IoT를 이용한 스트리밍 비용 ~ 10,368 USD

뭔가 제가 책정법을 잘못 계산한거겠죠...?

rxdcxdrnine commented 3 years ago

https://github.com/DSC-University-of-Seoul/2021-spring-project/tree/feature/backend-test aws iot 에 기기를 등록하고 노드의 aws-iot-device-sdk 모듈을 통해 aws iot 와 연결하고 테스트까지 진행해봤습니다. 디바이스 인증서 등록을 제외하고는 노드의 mqtt 모듈과 쓰임새가 거의 똑같고, 활용하는데 어렵지 않을 것 같습니다. aws iot 요금과 프리티어 정책은 아래 링크에서 확인하실 수 있습니다. https://aws.amazon.com/ko/iot-core/pricing/

@rxdcxdrnine AWS IoT 서비스를 사용하는 목적에 영상을 스트리밍하는 것도 포함하는 건가요?? 아니면 단순히 MQTT를 통한 일반 Push 알람 같은 용도를 목적으로 하는 서비스인가요?

영상이 목적이라면, 뭔가 요금 정책에 따라서 계산을 해보긴 했는데, 디바이스 당 스트리밍 비용이 월 10,368 USD 으로 나와서 뭔가 제가 요금 책정 방식을 잘못 이해한건가 싶네요

===========================================

AWS 메시징 요금 정책 요금 예 1 30일 동안 사용자 디바이스에서 매시간 2KB의 메시지 1개를 AWS IoT Core에 게시하고 AWS IoT Core는 이 메시지를 5개의 다른 디바이스에 전달합니다. 요금은 다음과 같이 계산됩니다. AWS IoT Core로 게시 비용 게시된 메시지 수: 메시지 1개/시간 24시간/일 30일 = 메시지 720개 게시된 메시지 요금: 메시지 720개 * 1 USD/메시지 1,000,000개 = 0.00072 USD

* 가정 1 ) ESP32-CAM 을 통해서 제공되는 영상의 해상도를 1280_1024_RGB라고 가정

* 가정 2 ) 24시간 영상을 스트리밍 하는 것이라 가정

* 가정 3 ) 1280_1024_RGB의 해상도의 영상(50MB/분) 24시간 분량의 데이터 = 약 72GB / 24시간

30일동안 매 시간 72GB의 메세지 1개 (~ 5kb의 메세지 14.4M개 )에 대한 게시비용

게시된 메시지 수: 메시지 14,400,000개/시간 24시간/일 30일 = 메시지 10,368,000,000 개 게시된 메시지 요금: 메시지 약 10,368,000,000 개 * 1 USD/메시지 1,000,000개 = 10,368 USD = 기기 한대의 24시간 영상을 AWS IoT를 이용한 스트리밍 비용 ~ 10,368 USD

뭔가 제가 책정법을 잘못 계산한거겠죠...?

제가 이미지 파일의 용량은 생각 안했네요 ㅠㅠ 적어주신대로 24시간동안 저정도의 요금이 나올거라고 상상하기 어렵습니다만, 그래도 비용이 꽤 나오겠네요..

edit8080 commented 3 years ago

https://github.com/DSC-University-of-Seoul/2021-spring-project/tree/feature/backend-test aws iot 에 기기를 등록하고 노드의 aws-iot-device-sdk 모듈을 통해 aws iot 와 연결하고 테스트까지 진행해봤습니다. 디바이스 인증서 등록을 제외하고는 노드의 mqtt 모듈과 쓰임새가 거의 똑같고, 활용하는데 어렵지 않을 것 같습니다. aws iot 요금과 프리티어 정책은 아래 링크에서 확인하실 수 있습니다. https://aws.amazon.com/ko/iot-core/pricing/

@rxdcxdrnine AWS IoT 서비스를 사용하는 목적에 영상을 스트리밍하는 것도 포함하는 건가요?? 아니면 단순히 MQTT를 통한 일반 Push 알람 같은 용도를 목적으로 하는 서비스인가요?

영상이 목적이라면, 뭔가 요금 정책에 따라서 계산을 해보긴 했는데, 디바이스 당 스트리밍 비용이 월 10,368 USD 으로 나와서 뭔가 제가 요금 책정 방식을 잘못 이해한건가 싶네요

===========================================

AWS 메시징 요금 정책 요금 예 1 30일 동안 사용자 디바이스에서 매시간 2KB의 메시지 1개를 AWS IoT Core에 게시하고 AWS IoT Core는 이 메시지를 5개의 다른 디바이스에 전달합니다. 요금은 다음과 같이 계산됩니다. AWS IoT Core로 게시 비용 게시된 메시지 수: 메시지 1개/시간 24시간/일 30일 = 메시지 720개 게시된 메시지 요금: 메시지 720개 * 1 USD/메시지 1,000,000개 = 0.00072 USD

  • 가정 1 ) ESP32-CAM 을 통해서 제공되는 영상의 해상도를 1280_1024_RGB라고 가정
  • 가정 2 ) 24시간 영상을 스트리밍 하는 것이라 가정
  • 가정 3 ) 1280_1024_RGB의 해상도의 영상(50MB/분) 24시간 분량의 데이터 = 약 72GB / 24시간

30일동안 매 시간 72GB의 메세지 1개 (~ 5kb의 메세지 14.4M개 )에 대한 게시비용

게시된 메시지 수: 메시지 14,400,000개/시간 24시간/일 30일 = 메시지 10,368,000,000 개 게시된 메시지 요금: 메시지 약 10,368,000,000 개 * 1 USD/메시지 1,000,000개 = 10,368 USD = 기기 한대의 24시간 영상을 AWS IoT를 이용한 스트리밍 비용 ~ 10,368 USD

뭔가 제가 책정법을 잘못 계산한거겠죠...?

@handal95

이미지 크기 = 1280 1024 2 1/8 = 327,680Byte/1024 = 320KB 30초 Delay로 이미지 전송 = 24시간 60분 60초 / 30초 = 2880 메세지 / 일 메세지 수 = (320KB / 5KB) (2880 메세지 / 일) = 184320 메세지/일 메세지 요금 = (184320 메세지 / 일 ) * 1 USD/메시지 1,000,000개 = 0.184320 USD / 일

저는 계산하면 이렇게 나오는데 너무 차이가 많이 나네요 ㅋㅋㅋ 혹시 상일님이 가정 3에서 계산한 1280_1024_RGB의 해상도의 영상(50MB/분) 24시간 분량의 데이터 = 약 72GB 이 내용에서 1280_1024_RGB의 해상도의 영상 크기가 50MB/분 이 어떻게 계산되었는지 알 수 있을까요? 그리고 ML 에서도 Delay를 통한 이미지가 아닌 실시간 이미지가 필요하신지도 궁금합니다 😀

<계산 참고 자료>

  1. ESP32-CAM(OV2646) 압축률 참고 자료
  2. JPEG 이미지 크기 계산 참고 자료
handal95 commented 3 years ago

https://github.com/DSC-University-of-Seoul/2021-spring-project/tree/feature/backend-test aws iot 에 기기를 등록하고 노드의 aws-iot-device-sdk 모듈을 통해 aws iot 와 연결하고 테스트까지 진행해봤습니다. 디바이스 인증서 등록을 제외하고는 노드의 mqtt 모듈과 쓰임새가 거의 똑같고, 활용하는데 어렵지 않을 것 같습니다. aws iot 요금과 프리티어 정책은 아래 링크에서 확인하실 수 있습니다. https://aws.amazon.com/ko/iot-core/pricing/

@rxdcxdrnine AWS IoT 서비스를 사용하는 목적에 영상을 스트리밍하는 것도 포함하는 건가요?? 아니면 단순히 MQTT를 통한 일반 Push 알람 같은 용도를 목적으로 하는 서비스인가요? 영상이 목적이라면, 뭔가 요금 정책에 따라서 계산을 해보긴 했는데, 디바이스 당 스트리밍 비용이 월 10,368 USD 으로 나와서 뭔가 제가 요금 책정 방식을 잘못 이해한건가 싶네요

===========================================

AWS 메시징 요금 정책 요금 예 1 30일 동안 사용자 디바이스에서 매시간 2KB의 메시지 1개를 AWS IoT Core에 게시하고 AWS IoT Core는 이 메시지를 5개의 다른 디바이스에 전달합니다. 요금은 다음과 같이 계산됩니다. AWS IoT Core로 게시 비용 게시된 메시지 수: 메시지 1개/시간 24시간/일 30일 = 메시지 720개 게시된 메시지 요금: 메시지 720개 * 1 USD/메시지 1,000,000개 = 0.00072 USD

  • 가정 1 ) ESP32-CAM 을 통해서 제공되는 영상의 해상도를 1280_1024_RGB라고 가정
  • 가정 2 ) 24시간 영상을 스트리밍 하는 것이라 가정
  • 가정 3 ) 1280_1024_RGB의 해상도의 영상(50MB/분) 24시간 분량의 데이터 = 약 72GB / 24시간

30일동안 매 시간 72GB의 메세지 1개 (~ 5kb의 메세지 14.4M개 )에 대한 게시비용 게시된 메시지 수: 메시지 14,400,000개/시간 24시간/일 30일 = 메시지 10,368,000,000 개 게시된 메시지 요금: 메시지 약 10,368,000,000 개 * 1 USD/메시지 1,000,000개 = 10,368 USD = 기기 한대의 24시간 영상을 AWS IoT를 이용한 스트리밍 비용 ~ 10,368 USD 뭔가 제가 책정법을 잘못 계산한거겠죠...?

@handal95

  • 가정 1) ESP32-CAM은 1600 x 1200 이미지까지 지원하지만 상일님의 가정대로 1280 x 1024 해상도로 설정하였습니다.
  • 가정 2) 24 시간 영상 스트리밍은 프론트엔드에서는 ESP32의 비디오 스트리밍을 서버를 사용하기 때문에 불필요하다고 생각했습니다. 따라서 30초 Delay를 설정하여 이미지 파일을 전송하는 것으로 가정하였습니다.
  • 가정 3) ESP32-CAM은 JPEG 포멧의 8bit 손실 압축을 사용합니다

이미지 크기 = 1280 1024 2 1/8 = 327,680Byte/1024 = 320KB 30초 Delay로 이미지 전송 = 24시간 60분 60초 / 30초 = 2880 메세지 / 일 메세지 수 = (320KB / 5KB) (2880 메세지 / 일) = 184320 메세지/일 메세지 요금 = (184320 메세지 / 일 ) * 1 USD/메시지 1,000,000개 = 0.184320 USD / 일

저는 계산하면 이렇게 나오는데 너무 차이가 많이 나네요 ㅋㅋㅋ 혹시 상일님이 가정 3에서 계산한 1280_1024_RGB의 해상도의 영상(50MB/분) 24시간 분량의 데이터 = 약 72GB 이 내용에서 1280_1024_RGB의 해상도의 영상 크기가 50MB/분 이 어떻게 계산되었는지 알 수 있을까요? 그리고 ML 에서도 Delay를 통한 이미지가 아닌 실시간 이미지가 필요하신지도 궁금합니다

<계산 참고 자료>

  1. ESP32-CAM(OV2646) 압축률 참고 자료
  2. JPEG 이미지 크기 계산 참고 자료

이미지 크기(해상도)

해상도 산정은 정윤님이 올려주신 블로그 링크에 나와있는 글들과 130만 화소(1280*1024) 산정 자료 등을 고려했습니다.

1280 * 1024 이하의 해상도의 경우 CCTV를 활용한 서비스 품질이 너무 좋지 않아서 제외하고, 최근에는 기본적으로 130만(HD급)이상의 해상도를 사용하는 경우가 많은 것 같아서 해당 해상도로 가정 했습니다

따라서 130만 이상의 해상도는 되어야 할 것 같은데, 1600 x 1200 으로 처음에 접근했었다가, 이후 식들에서 데이터 량이 너무 크게 나와서 기준치 넘기는 최솟값 1280 x 1024로 선정했습니다. (1.4배정도 차이납니다)

초당 이미지프레임 (FPS)

언급하지 않았던 생략된 변수로 fps는 12로 가정해두고 진행했었는데, 어젯밤에 여러 기사들과 영상들을 비교해보면서 12fps정도는 되어야 최소한 객체의 행동을 사람/기계가 보더라도 동작이 부드러운 것 같아서 해당으로 선정했습니다.

CCTV 화소 산정과 FPS 산정 기준 영상

JPEG 압축

각 프레임의 이미지에 대한 가정은 태희님과 동일하게 JPEG 포맷의 표준 압축(1/8)로 가정해두었습니다.

분당 영상데이터 50MB

따라서 이미지 한장의 크기 = WIDTH HEIGHTS CHANNEL (압축률) 의 식을 기반으로 (이미지 한장의 크기) 1280 1024의 RGB image = 1280 1024 3 / 8 = 3,932,160 bit = 491,520 Byte (490KB) (1초당 원본 영상의 크기) 12fps 490KB = 5.880 MB (1분당 원본 영상의 크기) 60 second (1초당 이미지 크기) = 352.8 MB 로 계산이 되는데,

최종적으로 이하 메세지 크기를 계산하는 과정에서 사용한 용량의 크기는 (1분당 원본 영상의 크기) * (압축률) = 352.8 MB / 8 = 44.1 MB(약 50MB)로 가정했습니다.

! 마지막 단계의 영상데이터 압축에서의 압축률은 정말 임의적으로 계산했습니다. ! 앞뒤 프레임간의 변화만을 저장하는 방식도 있다고 얼핏 들어서, 이미지와 동일하게 1/8로 잡고 진행했습니다.

제가 다시 살펴봤을때 제가 산정한 방식과 태희님이 산정하신 방식에서 가장 큰 차이는,

  1. 요금제 - 월간기준(상일) - 일간기준(태희) 으로 인한 30배 차이
  2. FPS - 12FPS - 1/30 FPS 으로 인한 360배 차이 (delay...? 이부분은 제대로 이해 못해서 하단에 적어두겠습니다.)
  3. 3채널 - 2채널 - 으로 인한 1.5배 차이

그리고 그 외적 요소들로 인해서 추가적으로 요금 차이가 발생해서 54,320배의 차이가 벌어진 것 같습니다.

============

200만 화소 IP 카메라 저장용량

Voice 포함 여부 및 FPS, 영상 저장시 압축률에 따라 이런 저런 차이가 있긴 하겠지만, 대체로 1280 * 1024 이미지를 기준으로 분당 영상 용량에 대해서 전체 스트리밍을 진행한다면 분당 50MB언저리 즈음 나오긴 할 것 같습니다.

edit8080 commented 3 years ago

@handal95 올려주신 계산 과정을 잘 살펴보았습니다. 추가로 CCTV 저장 용량 등의 자료를 찾아보았는데 채널과 영상 압축률 같은 부분을 제외하면 상일님의 계산이 맞는 것 같습니다. 비디오 용량을 평소에 생각해본적이 없었는데 이렇게 보니 매우 크네요. 질문 드린 내용은 1/30 fps를 의미하는 것이었습니다. 전 ML 파트의 진행 방향이 ESP32-CAM에서 전체 프레임이 아닌 일정한 간격의 특정 프레임을 대상으로 결과를 도출한다고 이해하여 말씀드린 내용이었습니다.

하지만 상일님의 생각은 실시간 영상 처리를 목적으로 ML 파트를 진행하는 것이었군요. 그런 점에서 볼 때 상일님이 12fps를 설정한 점도 이해가 되었습니다. 확실히 관련 영상을 찾아봤는데 10fps가 마지노선인 것 같더군요. 그렇다면 AWS IoT Core 사용은 제한될 것으로 보이고 로컬 PC를 영상을 저장하는 웹 서버로 구성하는 방향으로 다시 돌아가야할 것 같습니다.

AWS IoT 사용 비용 계산해주시고 관련 이슈 제안해주셔서 감사합니다 🙇‍♂️

edit8080 commented 3 years ago

사용자 인터페이스 측면에서 제공할 기능을 구체화할 방향에 대해 생각하고 있었는데 오늘 상일님이 모니터링 시스템 구현에 대한 아이디어를 제시해 주셔서 관련 자료를 찾고 사용자 인터페이스에서 구현할 기능에 대해 생각해보았습니다.

가장 먼저 모니터링 시스템의 목적과 이를 달성하기 위한 시스템 프로세스에 대해 조사해보았습니다. 한국데이터산업진흥원의 자료에 따르면 모니터링 시스템의 목적은 1. 빠른 장애 탐지 2. 다운타임의 최소화 3. 의사결정에 도움을 주는 것 4. 자동화 입니다. 이 중에서 저희 프로젝트에서는 1. 빠른 장애 탐지와 3. 의사결정에 도움을 주는 것 이 두 목적이 핵심이 되어야한다고 생각했습니다.

따라서 두 목적을 달성하기 위해서는 실시간 처리를 통해 빠른 장애 탐지를 달성하고 사용자 인터페이스 구성을 통해 의사결정에 도움을 주는 목적을 달성해야 한다고 생각했습니다. 의사결정에 도움을 주기 위해서 가장 좋은 방법은 위의 자료에도 나와있다시피 시각적으로 표현하는 것입니다. 저는 이 부분을 데이터를 시각적으로 표현할 수 있고 React와 호환하여 사용할 수 있는 react-map-gl을 사용하여 구현하고자 생각하고 있습니다. 이전에 수행했던 관련 프로젝트 이미지를 보면 이해가 쉬울것 같아 하단에 관련 이미지를 첨부하였습니다.

데이터 시각화

이와 더불어 데이터 시각화에 대해 FE 입장에서 추가적으로 제공할 기능에 대해 생각해보았습니다. 구현할 기능은 실시간 처리가 불가능한 경우를 고려하여 선정하였습니다.

<지역구를 기준으로 표현>

YubeenSon commented 3 years ago

사용자 인터페이스 측면에서 제공할 기능을 구체화할 방향에 대해 생각하고 있었는데 오늘 상일님이 모니터링 시스템 구현에 대한 아이디어를 제시해 주셔서 관련 자료를 찾고 사용자 인터페이스에서 구현할 기능에 대해 생각해보았습니다.

가장 먼저 모니터링 시스템의 목적과 이를 달성하기 위한 시스템 프로세스에 대해 조사해보았습니다. 한국데이터산업진흥원의 자료에 따르면 모니터링 시스템의 목적은 1. 빠른 장애 탐지 2. 다운타임의 최소화 3. 의사결정에 도움을 주는 것 4. 자동화 입니다. 이 중에서 저희 프로젝트에서는 1. 빠른 장애 탐지와 3. 의사결정에 도움을 주는 것 이 두 목적이 핵심이 되어야한다고 생각했습니다.

따라서 두 목적을 달성하기 위해서는 실시간 처리를 통해 빠른 장애 탐지를 달성하고 사용자 인터페이스 구성을 통해 의사결정에 도움을 주는 목적을 달성해야 한다고 생각했습니다. 의사결정에 도움을 주기 위해서 가장 좋은 방법은 위의 자료에도 나와있다시피 시각적으로 표현하는 것입니다. 저는 이 부분을 데이터를 시각적으로 표현할 수 있고 React와 호환하여 사용할 수 있는 react-map-gl을 사용하여 구현하고자 생각하고 있습니다. 이전에 수행했던 관련 프로젝트 이미지를 보면 이해가 쉬울것 같아 하단에 관련 이미지를 첨부하였습니다.

데이터 시각화

이와 더불어 데이터 시각화에 대해 FE 입장에서 추가적으로 제공할 기능에 대해 생각해보았습니다. 구현할 기능은 실시간 처리가 불가능한 경우를 고려하여 선정하였습니다.

<지역구를 기준으로 표현>

  • 지역구 전체 관리 a) 어린이집에서 발생한 사건, 사고를 레이블에 따라 표현 b) 지역구 클릭 시 해당 지역구에서 발생한 사건, 사고 발생 통계를 볼 수 있음
  • 지역구 내 관리 a) 어린이집 위치 표시 → 공공 데이터를 활용하거나 장소에 대한 위치 정보 연계 b) 사건, 사고 발생 시 알림 → 어린이집 위치 마커 색상 변화, 알림 메세지 전송 c) 해당 CCTV 클릭 시 관련 영상 재생 (또는 스트리밍)

저도 자료를 찾는 중에 몇 가지 발견하여 글을 남깁니다.

태희님이 말씀해주신 빠른 장애 탐지부분은 CCTV영상을 30분 혹은 1시간 주기로 모델에 적용시킨다면 기능을 구현할 수 있을 것 같습니다. 그리고 의사결정에 도움을 주는부분은 이상행동 감지에 따른 사후조치의 진행단계를 표시하는 것으로 기능을 추가하면 어떨까합니다. 예를 들어, 이상행동 감지에 따른 추후조치의 단계는 1. 현장 방문 2-1. 이상행동 오감지 2-2. 현장 확인(종결) 2-3. 현장 확인(문제 상황 파악) 3-3. 경찰 인계 등으로 구성될 수 있습니다.

그리고 웹에서의 영상 재생 혹은 스트리밍은 비용상, 보안상, 규정상의 문제로 어려울 것 같습니다..자료에 따르면 어린이집의 CCTV영상 열람을 위해서는 영상 시청 신청과 그에 따른 기관의 응답이 필요합니다. 시 담당자가 전체적인 관리자라하여도 영상을 재생해서 볼 권한은 갖고 있지 않다고 생각합니다..! (물론 이에 대한 설정은 팀 내에서 임의적으로 변경되어도 되는 부분이어서 스크럼때 얘기를 나눠보고싶습니다!)

제가 자료를 찾던 중 프론트에 내용 구성에 도움이 될 것 같은 페이지를 찾아 공유합니다! 어린이집정보공개포털에 '사고 보고 아동 현황'에서 발생 가능한 사고와 지역별 통계를 표로 보여주고 있었습니다. 그리고 이 페이지에서 API를 통해 어린이집별 기본 정보를 얻어올 수 있는데, 기본 정보에는 위도, 경도가 있어 위치 표시에 이용될 수 있을 것 같습니다.

또한 DB쪽에서는 영상 데이터의 실시간 스트리밍 혹은 영상 데이터의 이동이 불필요해질 경우, NoSQL이 아닌 RDB로 바꿀 것 같습니다.

handal95 commented 3 years ago

사고 보고 아동 현황'에서 발생 가능한 사고와 지역별 통계를 표로 보여주고 있었습니다. 그리고 이 페이지에서 API를 통해 어린이집별 기본 정보를 얻어올 수 있는데, 기본 정보에는 위도, 경도가 있어 위치 표시에 이용될 수 있을 것 같습니다.

  1. 빠른 장애 탐지부분에 대해서는 이야기를 나눠봐야 할 것 같네요. 하루이내 탐지를 베이스로 잡고, 실시간에 대해서는 다른 사항들이랑 구현적인 면, 성능적인 면 고려해서 Trade-off여지는 남겨둬도 될 것 같아요. 실시간으로 문제가 발생하자마자 탐지할 수 있다면 가장 좋긴 하겠지만, 하루 단위로 영상속 이상행동을 탐지/결산하는 과정에서 찾을 수만 있다면 현재의 시스템과 비교했을 때도 충분히 빠를 것 같아서요.

  2. 실시간 영상 스트리밍은 법적으로 불가능할 것 같습니다.

    • 그 밖에 보육관련 안전업무를 수행하는 기관으로서 보건복지부령으로 정하는 자가 업무의 수행을 위하여 열람시기ㆍ절차 및 방법 등 보건복지부령으로 정하는 바에 따라 요청하는 경우 위 항에 따라서 감독기관이라 할지라도, 영상을 시청하기 위해서는 절차에 따라서 영상정보 시청 신청 절차를 통해야만 가능 할 것 같습니다. 그 외 열람 가능 권한의 경우 #6 [4] CCTV의 보안 - 외부열람권한에 적어두었습니다.

머신러닝을 통한 이상행동 탐지 서비스의 목적은 직접적인 영상보다는, 영상 사용 신청에 필요한 항목들을 빠르게 제공하는 것에 초점을 둬야할 것 같아요.

태희님 언급처럼 그 외 부가적인 관리 기능도 포함되면 전체적으로 서비스 구성의 다양성과 FE/DB 파트 모두 학습/활용거리가 많아서 정말 좋을 것 같네요.

owao commented 3 years ago

https://m.blog.naver.com/PostView.nhn?blogId=einsbon&logNo=221215848541&proxyReferer=https:%2F%2Fwww.google.com%2F 라즈베리 파이 내부에서 자체적으로 영상을 찍어 저장할 수도 있는 것으로 보입니다. 그런데 이 코드는 라즈베리파이 카메라 모듈이라서 ESP-32를 적용시킬 수 있을지는 좀 더 찾아봐야 할 것 같아요. ESP-32 CAM을 테스트해봤더니 프레임이 생각보다 많이 끊겨서 아마 라즈베리파이로 자체 영상을 녹화하려면 그냥 라즈베리파이 카메라 모듈을 써야 할 것 같다는 생각이 드네요... 위에서 분당 50MB 정도일 거라고 계산이 된 것 같아서 그걸 기준으로 생각하면 12시간에 36GB니까 라즈베리파이에 SSD만 잘 장착하면 충분히 가능할 것 같습니다. 256GB SSD를 장착하면 일주일마다 영상을 백업하고 비우면 될 것 같아요!

ESP-32 CAM이 사진을 업로드하는 서버는 코드만 조금 손보면 자체적으로 바꿀 수 있네요. 위에서 주신 링크 https://randomnerdtutorials.com/esp32-cam-http-post-php-arduino/ 를 보면 랜선을 통해서 라즈베리파이로도 전송할 수 있는 것 같은데 이 부분은 좀 더 찾아보도록 하겠습니다. 일단은 라즈베리파이가 로컬 PC의 역할을 충분히 할 수 있을 것 같네요.

rxdcxdrnine commented 3 years ago

@owao 라즈베리파이에 대한 설명 감사합니다!

저는 CCTV 영상 저장 방법과 MQTT 통신에 대해 고민하면서 지금까지 나온 아이디어들을 한번 정리해보고, 프론트엔드/백엔드/ML 의 입장에서 어떻게 데이터를 저장하고 요청/응답을 처리해야할지 의견을 제시해 보고자 했습니다. 먼저 실시간 이미지 전송은 아두이노 ESP-32, 실시간 이미지 저장은 라즈베리파이를 쓴다고 가정하였습니다.

[A. 실시간 이미지 전송하는 경우] ESP-32 모듈 HTTP 통신/MQTT 통신 구현에 따른 시나리오

  1. HTTP 통신 ESP-32에서 스트리밍 서버 구축 프론트엔드/ML 서버에서 각각 ESP-32에 이미지 요청 프론트엔드에서 사용자 요청 시마다 백엔드 서버에 데이터 요청

image

  1. MQTT 통신 ESP-32에서 MQTT 메세지 브로커에 이미지를 메시지로 전송 프론트엔드/ML 서버에서 MQTT 메시지 브로커로부터 이미지를 메시지로 구독 ML 서버에서 DB에 데이터 저장 프론트엔드에서 사용자 요청 시미다 백엔드 서버에 데이터 요청

image

[B. 실시간 이미지 전송하지 않는 경우] ML 온디바이스/서버 구현에 따른 시나리오

  1. 온디바이스 (실시간 탐지) 1-①. HTTP 통신 라즈베리파이에서 flask 서버 구축 프론트엔드에서 라즈베리파이에 이미지 요청 라즈베리파이에서 DB에 데이터 저장 프론트엔드에서 사용자 요청 시미다 백엔드 서버에 데이터 요청

image

1-②. MQTT 통신 라즈베리파이에서 MQTT 메시지 브로커에 메시지 전송 프론트엔드 서버에서 MQTT 메시지 브로커로부터 메시지 구독

image

1-③. 백엔드 서버와 DB도 라즈베리파이 내에서 구축

image

  1. ML 서버 (실간/일간 데이터 모아 탐지) ML 서버에서 시간/일마다 라즈베리파이에 데이터 요청 후 탐지 ML 서버에서 DB 에 데이터 저장 프론트엔드 서버에서 시간/일마다 백엔드에 데이터 요청

image

제가 생각할 때 현재 상황에서 가장 적합한 방법은 실시간 이미지 전송-HTTP 통신입니다. ESP-32 모듈로 구현하면서 별도로 MQTT 통신을 구현할 필요도 없어 간편할 것으로 보입니다. 그리고 실시간 이미지를 전송하지 않고 ML 서버를 구축하는 경우는 제외해야할 것으로 보입니다. 이미지는 디바이스 내에서 SSD에 저장되고 있는데도 이미지를 ML 서버로 보내야하는데에서 불필요한 통신 과정이 소모될 것으로 보입니다.

처음에 MQTT통신을 사용하고 했던 것은 이미지 외에도 여러 종류의 데이터를 양방향 송수신해야한다는 생각이 있어서였습니다. 하지만 지난 수요일에 정해진 Kids Keeper 주제 아래에서는 이미지 데이터만 오고 가기 때문에, HTTP통신으로도 충분하겠다고 생각하게 되었습니다. 또한, ML 서버에서 Object Detection 후에 발생한 데이터를 굳이 백엔드 서버와 양방향 통신을 하지 않고, ML서버와 DB를 직접 연결하여 데이터를 저장해도 될 것으로 생각했습니다. 만약 백엔드 서버를 거쳐서만 DB에 저장하고자 한다면 양방향 통신을 위해 MQTT를 반드시 사용해야하겠지만, ML 서버에서 DB로 저장한다면 더 쉽지 않을까 생각합니다.

오랜시간 생각하다보니 벌써 스크럼 30분전이네요 ㅠㅠ 스크럼에서 다양한 피드백을 들으면 좋을 것 같습니다!

handal95 commented 3 years ago

image

owao commented 3 years ago

image 시리얼 모니터로 fps를 확인할 수 있었네요...ㅋㅋㅋㅠㅠ 방금 알았습니다.. 왼쪽 fps가 순간 전송하는 프레임 기준이고 오른쪽 fps가 평균 fps네요. 영상을 읽는 속도는 5나 6fps 정도 되는 것 같은데 와이파이 지연으로 인해 평균적으로 대략 1에서 2fps 정도만 받아와집니다ㅠ 통신 쪽은 잘 몰라서 그런데 블루투스 전송이 더 안정적일까요?? 일단은 ESP에 블루투스도 내장되어 있다고 들어서, 블루투스로 통신 방법을 바꿀 수 있을지도 다음 스크럼까지 한번 찾아보겠습니다.

handal95 commented 3 years ago

image 시리얼 모니터로 fps를 확인할 수 있었네요...ㅋㅋㅋㅠㅠ 방금 알았습니다.. 왼쪽 fps가 순간 전송하는 프레임 기준이고 오른쪽 fps가 평균 fps네요. 영상을 읽는 속도는 5~6fps 정도 되는 것 같은데 와이파이 지연으로 인해 평균적으로 대략 1~2fps 정도만 받아와집니다ㅠ 통신 쪽은 잘 몰라서 그런데 블루투스 전송이 더 안정적일까요?? 일단은 ESP에 블루투스도 내장되어 있다고 들어서, 블루투스로 통신 방법을 바꿀 수 있을지도 다음 스크럼까지 한번 찾아보겠습니다.

지금 받아오는 방식이 유선인건가요?

owao commented 3 years ago

image 시리얼 모니터로 fps를 확인할 수 있었네요...ㅋㅋㅋㅠㅠ 방금 알았습니다.. 왼쪽 fps가 순간 전송하는 프레임 기준이고 오른쪽 fps가 평균 fps네요. 영상을 읽는 속도는 5~6fps 정도 되는 것 같은데 와이파이 지연으로 인해 평균적으로 대략 1~2fps 정도만 받아와집니다ㅠ 통신 쪽은 잘 몰라서 그런데 블루투스 전송이 더 안정적일까요?? 일단은 ESP에 블루투스도 내장되어 있다고 들어서, 블루투스로 통신 방법을 바꿀 수 있을지도 다음 스크럼까지 한번 찾아보겠습니다.

지금 받아오는 방식이 유선인건가요?

ESP32-CAM 안에 와이파이 모듈이 내장되어 있어 와이파이를 통해 전송하는 형태입니다! 예제 코드도 그렇고 이게 가장 보편적인 사용 방식인 것 같아요. 유선으로 전송하는 방식은 아마 안 쓰는 것 같네요...

handal95 commented 3 years ago

image 시리얼 모니터로 fps를 확인할 수 있었네요...ㅋㅋㅋㅠㅠ 방금 알았습니다.. 왼쪽 fps가 순간 전송하는 프레임 기준이고 오른쪽 fps가 평균 fps네요. 영상을 읽는 속도는 5~6fps 정도 되는 것 같은데 와이파이 지연으로 인해 평균적으로 대략 1~2fps 정도만 받아와집니다ㅠ 통신 쪽은 잘 몰라서 그런데 블루투스 전송이 더 안정적일까요?? 일단은 ESP에 블루투스도 내장되어 있다고 들어서, 블루투스로 통신 방법을 바꿀 수 있을지도 다음 스크럼까지 한번 찾아보겠습니다.

지금 받아오는 방식이 유선인건가요?

ESP32-CAM 안에 와이파이 모듈이 내장되어 있어 와이파이를 통해 전송하는 형태입니다! 예제 코드도 그렇고 이게 가장 보편적인 사용 방식인 것 같아요. 유선으로 전송하는 방식은 아마 안 쓰는 것 같네요...

으흠 그렇군요... 블루투스와 와이파이 비교 와이파이랑 블루투스 성능 비교한 글이 있어서 가져와봤는데, 이론상으론 블루투스가 대역폭/주파수 측면에서도 와이파이보다 빠르긴 쉽지 않을 것 같네요

handal95 commented 3 years ago

04/30 논의에 따라 Mission의 명칭을 Sprint 로 통일합니다. 자료 조사 관련 논의는 마무리 되었다고 판단하고 본 이슈를 Close 하겠습니다. 추가적인 조사가 필요한 경우 새로운 Issue 를 열어주세요.