Skip to content

Capstone-Design-Hongik/Trimenders

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

4 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

CareNote

CareNote๋Š” AgentDVR์—์„œ ๋…นํ™”๋œ ์˜์ƒ์„ RunPod ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๊ณ , ์„œ๋ฒ„์—์„œ ์˜์ƒ์„ ๋ถ„์„ํ•œ ๋’ค ๋‚™์ƒ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๊ณ  ์š”์•ฝ๋ณด๊ณ ์„œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

README์—์„œ๋Š” ๋‹ค์Œ ๋‚ด์šฉ์„ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์–ด๋–ค ํŒŒ์ผ์„ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š”์ง€
  • AgentDVR, RunPod, ์š”์•ฝ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ๊ฐ๊ฐ ์–ด๋–ค ์—ญํ• ์ธ์ง€
  • ์˜์ƒ ๋ถ„์„ ๊ฒฐ๊ณผ๊ฐ€ ์–ด๋””์— ์ €์žฅ๋˜๋Š”์ง€
  • ํด๋” ํƒ์ƒ‰ ๋•Œ๋ฌธ์— ๋А๋ ค์ง€๋˜ ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€
  • ํ…Œ์ŠคํŠธ์™€ ๋ฌธ์ œ ํ•ด๊ฒฐ์€ ์–ด๋–ค ์ˆœ์„œ๋กœ ํ•˜๋ฉด ๋˜๋Š”์ง€

ํ•œ ์ค„ ์š”์•ฝ

๋กœ์ปฌ PC์˜ AgentDVR๊ฐ€ ์˜์ƒ์„ ๋…นํ™”ํ•˜๋ฉด send_video.py๊ฐ€ RunPod ์„œ๋ฒ„์˜ server.py๋กœ ์˜์ƒ์„ ๋ณด๋‚ด๊ณ , ์„œ๋ฒ„๋Š” Qwen ๋ชจ๋ธ๋กœ ์˜์ƒ ์„ค๋ช… ํ…์ŠคํŠธ๋ฅผ ๋งŒ๋“  ๋’ค ๋‚™์ƒ ๊ฐ์ง€, ์ด๋ฉ”์ผ ์•Œ๋ฆผ, ์š”์•ฝ๋ณด๊ณ ์„œ ์ƒ์„ฑ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ „์ฒด ๋™์ž‘ ํ๋ฆ„

AgentDVR ๋…นํ™” ์™„๋ฃŒ
-> send_video.py ์‹คํ–‰
-> RunPod ์„œ๋ฒ„ /health ํ™•์ธ
-> RunPod ์„œ๋ฒ„ /analyze-video/๋กœ ์˜์ƒ ์—…๋กœ๋“œ
-> ์„œ๋ฒ„๊ฐ€ ์˜์ƒ์„ ์ž„์‹œ ์ €์žฅ
-> Qwen3-VL ๋ชจ๋ธ์ด ์˜์ƒ ๋‚ด์šฉ์„ ํ…์ŠคํŠธ๋กœ ๋ถ„์„
-> ๋ถ„์„ ํ…์ŠคํŠธ ํŒŒ์ผ ์ €์žฅ
-> ๊ฐ™์€ ํ…์ŠคํŠธ๋ฅผ ๋ฐ”๋กœ ๋‚™์ƒ ๊ฐ์ง€ ํ•จ์ˆ˜๋กœ ์ „๋‹ฌ
-> 1์ฐจ ๋‚™์ƒ ๊ฐ์ง€
-> ํ•„์š”ํ•˜๋ฉด Claude 2์ฐจ ํŒ๋‹จ
-> ๋‚™์ƒ์œผ๋กœ ํŒ๋‹จ๋˜๋ฉด ์ด๋ฉ”์ผ ์•Œ๋ฆผ
-> ์ •ํ•ด์ง„ ์ฃผ๊ธฐ๋งˆ๋‹ค ์š”์•ฝ๋ณด๊ณ ์„œ ์ƒ์„ฑ ๋ฐ ์ด๋ฉ”์ผ ๋ฐœ์†ก

์ค‘์š”ํ•œ ์ ์€ ๋‚™์ƒ ๊ฐ์ง€์—์„œ ํด๋”๋ฅผ ๋‹ค์‹œ ๋’ค์ ธ์„œ ์ตœ์‹  ํŒŒ์ผ์„ ์ฐพ์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ๋ฐฉ๊ธˆ ๋งŒ๋“  ๋ถ„์„ ํ…์ŠคํŠธ๋ฅผ ๋ฐ”๋กœ ํ•จ์ˆ˜์— ๋„˜๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์‹œ๊ฐ„ ๊ฐ์ง€ ์ง€์—ฐ์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.

์‹คํ–‰ ์œ„์น˜

์ด ํ”„๋กœ์ ํŠธ๋Š” ํฌ๊ฒŒ ๋‘ ์œ„์น˜์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์œ„์น˜ ์‹คํ–‰ ํŒŒ์ผ ์—ญํ• 
RunPod ์„œ๋ฒ„ server.py ์˜์ƒ์„ ๋ฐ›๊ณ , ๋ชจ๋ธ ๋ถ„์„, ๋‚™์ƒ ๊ฐ์ง€, ์š”์•ฝ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์‹คํ–‰
๋กœ์ปฌ Windows PC send_video.py AgentDVR๊ฐ€ ๋งŒ๋“  ๋…นํ™” ์˜์ƒ์„ RunPod ์„œ๋ฒ„๋กœ ์ „์†ก

RunPod์—์„œ๋Š” ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ๋กœ์ปฌ PC์—์„œ๋Š” AgentDVR ์ด๋ฒคํŠธ์— send_video.py๋ฅผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

ํด๋” ๊ตฌ์กฐ

carenote_modular/
  server.py                 RunPod์—์„œ ์‹คํ–‰ํ•˜๋Š” ์„œ๋ฒ„ ์ง„์ž…์ 
  send_video.py             AgentDVR ์˜์ƒ ์ „์†ก ์ง„์ž…์ 
  trigger.example.bat       AgentDVR ์—ฐ๊ฒฐ์šฉ Windows ๋ฐฐ์น˜ํŒŒ์ผ ์˜ˆ์‹œ
  .env.example              GitHub์— ์˜ฌ๋ฆฌ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์˜ˆ์‹œ ํŒŒ์ผ
  .gitignore                ๊ฐœ์ธ ์„ค์ •/๋กœ๊ทธ/์บ์‹œ ์ œ์™ธ ๊ทœ์น™
  main_scheduler.py         3๋ถ„ ์ฃผ๊ธฐ ์š”์•ฝ ์Šค์ผ€์ค„๋Ÿฌ
  chunked_scheduler.py      60๋ถ„ ์ฃผ๊ธฐ ์š”์•ฝ ์Šค์ผ€์ค„๋Ÿฌ
  summary_worker.py         ์š”์•ฝ ์ƒ์„ฑ ํ•จ์ˆ˜ ํ˜ธํ™˜์šฉ ์ง„์ž…์ 
  fall_alert_checker.py     ์ €์žฅ๋œ ํ…์ŠคํŠธ ํŒŒ์ผ ๋‚™์ƒ ์žฌ๊ฒ€์‚ฌ์šฉ ์ง„์ž…์ 
  carenote_dashboard.py     ๊ธฐ์กด ์ฝ”๋“œ ํ˜ธํ™˜์šฉ ๋Œ€์‹œ๋ณด๋“œ ์ง„์ž…์ 
  utils.py                  ๊ธฐ์กด ์ฝ”๋“œ ํ˜ธํ™˜์šฉ ์œ ํ‹ธ ์ง„์ž…์ 

  app/                      FastAPI ์„œ๋ฒ„, ๋ชจ๋ธ ๋กœ๋”ฉ, ์˜์ƒ ๋ถ„์„ ์ž‘์—…
  client/                   RunPod๋กœ ์˜์ƒ์„ ๋ณด๋‚ด๋Š” ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ
  core/                     ํŒŒ์ผ ์ €์žฅ, ์ธ๋ฑ์Šค, ๊ณตํ†ต ๋กœ๊น… ์„ค์ •
  dashboard/                ๋Œ€์‹œ๋ณด๋“œ ์ƒํƒœ์™€ ์„ค์ • ์ €์žฅ
  detection/                ๋‚™์ƒ ๊ฐ์ง€, Claude 2์ฐจ ํŒ๋‹จ, ๋‚™์ƒ ์ด๋ฉ”์ผ
    training_data.py        1์ฐจ ๋‚™์ƒ ๊ฐ์ง€ ์žฌํ•™์Šต์šฉ ๋ฌธ์žฅ ๋ฐ์ดํ„ฐ
    train_classifier.py     fall_classifier.pkl ์žฌํ•™์Šต ์Šคํฌ๋ฆฝํŠธ
  summary/                  ์š”์•ฝ ์ƒ์„ฑ, ์š”์•ฝ ์ด๋ฉ”์ผ, ์š”์•ฝ ์Šค์ผ€์ค„๋Ÿฌ
  web/                      ๋Œ€์‹œ๋ณด๋“œ HTML
  models/                   ๋‚™์ƒ 1์ฐจ ๊ฐ์ง€ ๋ชจ๋ธ ํŒŒ์ผ

์ฃผ์š” ํŒŒ์ผ ์„ค๋ช…

ํŒŒ์ผ ์„ค๋ช…
server.py ์„œ๋ฒ„ ์‹คํ–‰ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ app.main:app์„ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค.
send_video.py AgentDVR๊ฐ€ ๋…นํ™” ์™„๋ฃŒ ํ›„ ์‹คํ–‰ํ•  ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ client.send_video๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
trigger.example.bat AgentDVR์™€ send_video.py๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ ์ฐธ๊ณ ํ•˜๋Š” Windows ๋ฐฐ์น˜ํŒŒ์ผ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.
.env.example GitHub์— ์˜ฌ๋ ค๋„ ๋˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ๋น„๋ฐ€๊ฐ’์€ .env์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
.gitignore .env, ๋กœ๊ทธ, ์บ์‹œ, ์ž„์‹œ ํŒŒ์ผ์ด GitHub์— ์˜ฌ๋ผ๊ฐ€์ง€ ์•Š๋„๋ก ๋ง‰์Šต๋‹ˆ๋‹ค.
main_scheduler.py 3๋ถ„๋งˆ๋‹ค ์š”์•ฝ๋ณด๊ณ ์„œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์Šค์ผ€์ค„๋Ÿฌ์ž…๋‹ˆ๋‹ค.
chunked_scheduler.py 60๋ถ„๋งˆ๋‹ค ์š”์•ฝ๋ณด๊ณ ์„œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ 10๋ถ„ ๋‹จ์œ„ ์กฐ๊ฐ์„ ๋งŒ๋“ค์–ด ๊ธด ์‹œ๊ฐ„๋Œ€๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์š”์•ฝํ•ฉ๋‹ˆ๋‹ค.
summary_worker.py ์š”์•ฝ ์ƒ์„ฑ ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ importํ•ด์„œ ์“ฐ๋˜ ๊ธฐ์กด ์ฝ”๋“œ์™€ ํ˜ธํ™˜๋˜๋„๋ก ๋‚จ๊ฒจ๋‘” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.
fall_alert_checker.py ์ด๋ฏธ ์ €์žฅ๋œ ํ…์ŠคํŠธ ํŒŒ์ผ ํ•˜๋‚˜๋ฅผ ๋‹ค์‹œ ๋‚™์ƒ ๊ฒ€์‚ฌํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
models/fall_classifier.pkl 1์ฐจ ๋‚™์ƒ ๊ฐ์ง€์— ์“ฐ๋Š” ๋ถ„๋ฅ˜ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค.
detection/training_data.py fall_classifier.pkl์„ ๋‹ค์‹œ ํ•™์Šตํ•  ๋•Œ ์“ฐ๋Š” ๋ฌธ์žฅ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค.
detection/train_classifier.py training_data.py๋ฅผ ์ด์šฉํ•ด fall_classifier.pkl์„ ์ƒˆ๋กœ ๋งŒ๋“œ๋Š” ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค.
web/dashboard.html ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ณด๋Š” ๋Œ€์‹œ๋ณด๋“œ ํ™”๋ฉด์ž…๋‹ˆ๋‹ค.

์‹คํ–‰ ์ „ ์ค€๋น„๋ฌผ

RunPod ์„œ๋ฒ„ ์ชฝ์—๋Š” ๋‹ค์Œ์ด ์ค€๋น„๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • Python ์‹คํ–‰ ํ™˜๊ฒฝ
  • Qwen3-VL ๋ชจ๋ธ ํŒŒ์ผ
  • GPU ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ RunPod Pod
  • ํ•„์š”ํ•œ Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • Anthropic API ํ‚ค
  • ์ด๋ฉ”์ผ ๋ฐœ์†ก ๊ณ„์ • ์ •๋ณด

๋กœ์ปฌ Windows PC ์ชฝ์—๋Š” ๋‹ค์Œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • AgentDVR
  • Python ์‹คํ–‰ ํ™˜๊ฒฝ
  • send_video.py๊ฐ€ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ ํด๋”
  • RunPod ์„œ๋ฒ„ ์ฃผ์†Œ

ํ•„์š”ํ•œ Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ์ด๋ฏธ ์„ค์น˜๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—†๋‹ค๋ฉด ๋‹ค์Œ ๊ณ„์—ด์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

fastapi
uvicorn
python-dotenv
requests
anthropic
numpy
scikit-learn
pytz
pydantic
sentence-transformers
transformers
vllm
qwen-vl-utils

RunPod์˜ GPU, CUDA, vLLM, Transformers ๋ฒ„์ „์€ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฏธ์ง€์™€ ๋ชจ๋ธ์— ๋”ฐ๋ผ ๋งž์ถฐ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” .env ํŒŒ์ผ์— ๋„ฃ๊ฑฐ๋‚˜ RunPod ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

GitHub์—๋Š” ์‹ค์ œ .env๋ฅผ ์˜ฌ๋ฆฌ์ง€ ๋ง๊ณ  .env.example๋งŒ ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค. ์ฒ˜์Œ ์‹คํ–‰ํ•˜๋Š” ์‚ฌ๋žŒ์€ .env.example์„ ๋ณต์‚ฌํ•ด์„œ ์ž๊ธฐ ํ™˜๊ฒฝ์— ๋งž๋Š” .env๋ฅผ ๋งŒ๋“ค๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฐ’:

ANTHROPIC_API_KEY=your_anthropic_api_key
SENDER_EMAIL=sender@example.com
SENDER_PASSWORD=your_email_app_password
JANG_EMAIL=receiver@example.com
CARENOTE_SERVER_URL=https://your-runpod-id-9000.proxy.runpod.net

๋ชจ๋ธ๊ณผ ์ €์žฅ ์œ„์น˜:

CHECKPOINT_PATH=/workspace/models/qwen3-vl-8b-instruct-fp8
BASE_RESULT_DIR=/workspace/development/generated_data

์„œ๋ฒ„ ๋ชจ๋ธ ์˜ต์…˜:

GPU_MEMORY_UTILIZATION=0.8
MAX_MODEL_LEN=32768
TENSOR_PARALLEL_SIZE=1
ENFORCE_EAGER=true
MODEL_TIMEOUT_SEC=60
MAX_UPLOAD_BYTES=1073741824

์š”์•ฝ ์Šค์ผ€์ค„๋Ÿฌ:

ENABLE_SUMMARY_SCHEDULER=true

๋‚™์ƒ ๊ฐ์ง€:

EMAIL_ALERT_ENABLED=true
FALL_CLASSIFIER_THRESHOLD=0.65
FALL_CLASSIFIER_PATH=models/fall_classifier.pkl
EMBEDDING_MODEL_NAME=all-MiniLM-L6-v2
CLAUDE_MODEL=claude-sonnet-4-6

๋กœ๊ทธ:

LOG_LEVEL=INFO
CARENOTE_LOG_FILE=/workspace/development/generated_data/logs/carenote.log
CARENOTE_CLIENT_LOG_FILE=logs/send_video.log

AgentDVR ๋Œ€์‹œ๋ณด๋“œ ํ‘œ์‹œ์šฉ:

AGENT_DVR_BASE_URL=http://localhost:8090
AGENT_DVR_OBJECT_ID=1
AGENT_DVR_STREAM_URL=
AGENT_DVR_IFRAME_URL=

AGENT_DVR_OBJECT_ID๋Š” AgentDVR์—์„œ ์นด๋ฉ”๋ผ/์žฅ์น˜๋งˆ๋‹ค ๋ถ€์—ฌ๋˜๋Š” ID์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ์นด๋ฉ”๋ผ ID๊ฐ€ 1์ด๋ฉด ์œ„์ฒ˜๋Ÿผ 1๋กœ ๋‘ก๋‹ˆ๋‹ค.

๊ฐ€์žฅ ๊ธฐ๋ณธ ์‹คํ–‰ ๋ฐฉ๋ฒ•

RunPod์—์„œ ํ”„๋กœ์ ํŠธ ํด๋”๋กœ ์ด๋™ํ•œ ๋’ค ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

uvicorn server:app --host 0.0.0.0 --port 9000

๊ฐ€์ƒํ™˜๊ฒฝ์„ ๋จผ์ € ํ™œ์„ฑํ™”ํ•˜๊ณ  AgentDVR ํ™”๋ฉด ํ‘œ์‹œ ์„ค์ •๊นŒ์ง€ ๊ฐ™์ด ๋„ฃ๋Š”๋‹ค๋ฉด ๋‹ค์Œ์ฒ˜๋Ÿผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์ƒํ™˜๊ฒฝ ๊ฒฝ๋กœ๋Š” ์‚ฌ์šฉํ•˜๋Š” RunPod ์ด๋ฏธ์ง€์— ๋งž๊ฒŒ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

source /path/to/your/venv/bin/activate

export AGENT_DVR_BASE_URL="http://localhost:8090/"
export AGENT_DVR_OBJECT_ID="1"

uvicorn server:app --host 0.0.0.0 --port 9000

์ฝ”๋“œ์—์„œ๋Š” AGENT_DVR_BASE_URL ๋’ค์˜ /๋ฅผ ์ž๋™์œผ๋กœ ์ •๋ฆฌํ•˜๋ฏ€๋กœ http://localhost:8090/์™€ http://localhost:8090 ๋‘˜ ๋‹ค ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€์‹œ๋ณด๋“œ์˜ AgentDVR ์˜์ƒ ์ฃผ์†Œ๋Š” ์„œ๋ฒ„๊ฐ€ ๋งŒ๋“  ๋’ค ๋ธŒ๋ผ์šฐ์ €์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ localhost:8090์€ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์—ด๊ณ  ์žˆ๋Š” PC์—์„œ AgentDVR์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ฃผ์†Œ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ •์ƒ์ ์œผ๋กœ ์ผœ์กŒ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

curl http://127.0.0.1:9000/health

์ •์ƒ ์‘๋‹ต ์˜ˆ์‹œ:

{
  "status": "ok",
  "model_loaded": true
}

์™ธ๋ถ€ PC์—์„œ๋Š” RunPod ํ”„๋ก์‹œ ์ฃผ์†Œ๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

https://your-runpod-id-9000.proxy.runpod.net/health

๋Œ€์‹œ๋ณด๋“œ๋Š” ๋‹ค์Œ ์ฃผ์†Œ์—์„œ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

https://your-runpod-id-9000.proxy.runpod.net/dashboard

3๋ถ„๋งˆ๋‹ค ์š”์•ฝ๋ณด๊ณ ์„œ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์„ ๋•Œ

3๋ถ„ ์ฃผ๊ธฐ ์š”์•ฝ์€ main_scheduler.py๊ฐ€ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„์— ๋ถ™์–ด ์žˆ๋Š” ๊ธฐ๋ณธ 60๋ถ„ ์š”์•ฝ๊ณผ ์ค‘๋ณต๋˜์ง€ ์•Š๊ฒŒ ํ•˜๋ ค๋ฉด ๋จผ์ € ์ž๋™ ์š”์•ฝ์„ ๋•๋‹ˆ๋‹ค.

.env:

ENABLE_SUMMARY_SCHEDULER=false

ํ„ฐ๋ฏธ๋„ 1์—์„œ ์„œ๋ฒ„ ์‹คํ–‰:

uvicorn server:app --host 0.0.0.0 --port 9000

ํ„ฐ๋ฏธ๋„ 2์—์„œ 3๋ถ„ ์š”์•ฝ ์Šค์ผ€์ค„๋Ÿฌ ์‹คํ–‰:

python main_scheduler.py

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์˜์ƒ ๋ถ„์„ ์„œ๋ฒ„๋Š” ๊ณ„์† ์ผœ์ ธ ์žˆ๊ณ , ์š”์•ฝ๋ณด๊ณ ์„œ๋Š” 3๋ถ„๋งˆ๋‹ค ๋ณ„๋„ ํ”„๋กœ์„ธ์Šค์—์„œ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

60๋ถ„ ์š”์•ฝ์„ ๋”ฐ๋กœ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์„ ๋•Œ

์„œ๋ฒ„์™€ ๋ถ„๋ฆฌํ•ด์„œ 60๋ถ„ ์š”์•ฝ ์Šค์ผ€์ค„๋Ÿฌ๋งŒ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

python chunked_scheduler.py

์ด ๊ฒฝ์šฐ์—๋„ ์„œ๋ฒ„ ์ž๋™ ์š”์•ฝ์ด ์ผœ์ ธ ์žˆ์œผ๋ฉด ์ค‘๋ณต ์‹คํ–‰๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋ถ„๋ฆฌ ์šด์˜ํ•  ๋•Œ๋Š” ENABLE_SUMMARY_SCHEDULER=false๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

AgentDVR์—์„œ ์˜์ƒ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•

AgentDVR๋Š” ๋…นํ™”๊ฐ€ ๋๋‚ฌ์„ ๋•Œ ํŠน์ • ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋กœ์ปฌ Windows PC์˜ send_video.py๋ฅผ AgentDVR ์ด๋ฒคํŠธ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

GitHub์—๋Š” ๊ฐœ์ธ PC ๊ฒฝ๋กœ๊ฐ€ ๋“ค์–ด๊ฐ„ ์‹ค์ œ ๋ฐฐ์น˜ํŒŒ์ผ ๋Œ€์‹  trigger.example.bat๋ฅผ ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค. ์‹ค์ œ PC์—์„œ๋Š” ์ด ํŒŒ์ผ์„ ๋ณต์‚ฌํ•ด์„œ AgentDVR๊ฐ€ ์‹คํ–‰ํ•˜๋Š” trigger.bat๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋ฐฐ์น˜ํŒŒ์ผ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜:

CARENOTE_PYTHON_EXE=C:\path\to\python.exe
CARENOTE_SEND_VIDEO_SCRIPT=C:\path\to\carenote_modular\send_video.py
CARENOTE_TRIGGER_LOG_FILE=C:\path\to\logs\trigger.log

์ด ๊ฐ’์„ ๋”ฐ๋กœ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด trigger.example.bat๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ python ๋ช…๋ น๊ณผ ๋ฐฐ์น˜ํŒŒ์ผ์ด ์žˆ๋Š” ํด๋”์˜ send_video.py๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

AgentDVR๊ฐ€ ์˜์ƒ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ธ์ž๋กœ ๋„˜๊ธฐ๋ฉด send_video.py๋Š” ๋‹ค์Œ ์ˆœ์„œ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ „๋‹ฌ๋ฐ›์€ ์˜์ƒ ํŒŒ์ผ์ด ์‹ค์ œ๋กœ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  2. ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ์•ˆ์ •๋  ๋•Œ๊นŒ์ง€ ์ž ์‹œ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
  3. RunPod ์„œ๋ฒ„์˜ /health๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  4. ์„œ๋ฒ„์™€ ๋ชจ๋ธ์ด ์ค€๋น„๋˜์–ด ์žˆ์œผ๋ฉด /analyze-video/๋กœ ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
  5. ์„œ๋ฒ„๊ฐ€ ์ ‘์ˆ˜ํ•˜๋ฉด ๋กœ์ปฌ ์˜์ƒ ํŒŒ์ผ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

๋กœ์ปฌ ์˜์ƒ์„ ์‚ญ์ œํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ๋‹ค์Œ ๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

DELETE_LOCAL_VIDEO_AFTER_SEND=false

์ˆ˜๋™ ํ…Œ์ŠคํŠธ:

python send_video.py C:\path\to\test.mp4

์„œ๋ฒ„ API

์ฃผ์†Œ ๋ฐฉ์‹ ์„ค๋ช…
/health GET ์„œ๋ฒ„์™€ ๋ชจ๋ธ ์ค€๋น„ ์ƒํƒœ ํ™•์ธ
/analyze-video/ POST ์˜์ƒ ์—…๋กœ๋“œ ๋ฐ ๋ถ„์„ ์š”์ฒญ
/dashboard GET ๋Œ€์‹œ๋ณด๋“œ ํ™”๋ฉด
/api/dashboard/status GET ๋Œ€์‹œ๋ณด๋“œ ์ƒํƒœ JSON
/api/dashboard/settings GET ์ˆ˜์‹  ์ด๋ฉ”์ผ ์„ค์ • ํ™•์ธ
/api/dashboard/settings POST ์ˆ˜์‹  ์ด๋ฉ”์ผ ์„ค์ • ๋ณ€๊ฒฝ
/api/dashboard/settings/reset POST ์ˆ˜์‹  ์ด๋ฉ”์ผ ์„ค์ • ์ดˆ๊ธฐํ™”

์˜์ƒ ์—…๋กœ๋“œ๋Š” ๋ฐ”๋กœ ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  202 Accepted๋กœ ์ ‘์ˆ˜๋ฉ๋‹ˆ๋‹ค.

์‘๋‹ต ์˜ˆ์‹œ:

{
  "status": "queued",
  "id": "test_abcdef12",
  "message": "์˜์ƒ ์—…๋กœ๋“œ ์™„๋ฃŒ. ๋ถ„์„์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค."
}

๋ถ„์„์€ ์„œ๋ฒ„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ง„ํ–‰๋˜๋ฉฐ, ๊ฒฐ๊ณผ๋Š” ํ…์ŠคํŠธ ํŒŒ์ผ๊ณผ ๋Œ€์‹œ๋ณด๋“œ ์ƒํƒœ๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์ €์žฅ ์œ„์น˜

๊ธฐ๋ณธ ์ €์žฅ ๋ฃจํŠธ:

/workspace/development/generated_data

ํ•˜์œ„ ํด๋”:

generated_data/
  videos/       ์—…๋กœ๋“œ๋œ ์˜์ƒ ์ž„์‹œ ์ €์žฅ
  texts/        Qwen ๋ถ„์„ ํ…์ŠคํŠธ ์ €์žฅ
  summaries/    ์š”์•ฝ๋ณด๊ณ ์„œ ์ €์žฅ
  status/       ๋Œ€์‹œ๋ณด๋“œ ์ƒํƒœ์™€ ์„ค์ • ์ €์žฅ
  logs/         ์„ค์ •ํ•œ ๊ฒฝ์šฐ ๋กœ๊ทธ ํŒŒ์ผ ์ €์žฅ

ํ…์ŠคํŠธ ์ €์žฅ ์˜ˆ์‹œ:

texts/
  camera_2026-06-17_10-00-00.txt
  _text_index_2026-06-17.jsonl
  _latest_text.json

์š”์•ฝ ์ €์žฅ ์˜ˆ์‹œ:

summaries/
  summary_2026-06-17_10-00-00_to_2026-06-17_11-00-00.txt
  _summary_index.jsonl
  _latest_summary.json

ํด๋”๊ฐ€ ์•ˆ ์—ด๋ฆฌ๊ณ  ๋А๋ ค์ง€๋˜ ๋ฌธ์ œ ํ•ด๊ฒฐ

์ด์ „ ๋ฐฉ์‹์˜ ํ•ต์‹ฌ ๋ฌธ์ œ๋Š” ํ…์ŠคํŠธ ํŒŒ์ผ์ด ๋งŽ์•„์งˆ์ˆ˜๋ก ์ตœ์‹  ํŒŒ์ผ์„ ์ฐพ๊ธฐ ์œ„ํ•ด ํด๋” ์ „์ฒด๋ฅผ ํƒ์ƒ‰ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ผ ์ˆ˜๊ฐ€ ์ ์„ ๋•Œ๋Š” ๋ฌธ์ œ๊ฐ€ ์ž˜ ๋ณด์ด์ง€ ์•Š์ง€๋งŒ, ์žฅ๊ธฐ๊ฐ„ ์šด์˜ํ•˜๋ฉด texts ํด๋” ์•ˆ์˜ ํŒŒ์ผ์ด ๊ณ„์† ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ตœ์‹  ํŒŒ์ผ ํ•˜๋‚˜๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ๋งŽ์€ ํŒŒ์ผ ์ด๋ฆ„๊ณผ ์ˆ˜์ • ์‹œ๊ฐ„์„ ํ™•์ธํ•ด์•ผ ํ•˜๊ณ , ์ €์žฅ์†Œ๊ฐ€ ๋А๋ฆฐ ํ™˜๊ฒฝ์—์„œ๋Š” ๋Œ€์‹œ๋ณด๋“œ๋‚˜ ๋‚™์ƒ ๊ฐ์ง€๊ฐ€ ์ง€์—ฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ๊ตฌ์กฐ๋Š” ๋‘ ๊ฐ€์ง€๋กœ ๋‚˜๋ˆ  ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ, ์‹ค์‹œ๊ฐ„ ๋‚™์ƒ ๊ฐ์ง€๋Š” ํŒŒ์ผ ํƒ์ƒ‰์„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์„œ๋ฒ„๋Š” Qwen ๋ถ„์„์ด ๋๋‚˜๋ฉด ๋ถ„์„ ํ…์ŠคํŠธ๋ฅผ ํŒŒ์ผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋™์‹œ์— ๊ทธ ํ…์ŠคํŠธ ๋ฌธ์ž์—ด์„ ๋‚™์ƒ ๊ฐ์ง€ ํ•จ์ˆ˜์— ๋ฐ”๋กœ ๋„˜๊น๋‹ˆ๋‹ค. ์ฆ‰, ๋‚™์ƒ ๊ฐ์ง€๋Š” "๋ฐฉ๊ธˆ ์ €์žฅํ•œ ํŒŒ์ผ์„ ๋‹ค์‹œ ํด๋”์—์„œ ์ฐพ๋Š” ๋ฐฉ์‹"์ด ์•„๋‹ˆ๋ผ "๋ฐฉ๊ธˆ ์ƒ์„ฑ๋œ ํ…์ŠคํŠธ๋ฅผ ๋ฐ”๋กœ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐฉ์‹"์ž…๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ, ์žฅ๊ธฐ ๋ณด๊ด€๊ณผ ์š”์•ฝ ์ฒ˜๋ฆฌ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ถ„์„ ํ…์ŠคํŠธ ํŒŒ์ผ์€ ๊ทธ๋Œ€๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  ์ƒˆ ํ…์ŠคํŠธ๊ฐ€ ์ €์žฅ๋  ๋•Œ๋งˆ๋‹ค ์•„๋ž˜ ์ธ๋ฑ์Šค ํŒŒ์ผ์„ ๊ฐ™์ด ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.

_text_index_YYYY-MM-DD.jsonl
_latest_text.json

์š”์•ฝ๋ณด๊ณ ์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ตœ์‹  ์š”์•ฝ ํŒŒ์ผ ์ •๋ณด๋ฅผ ๋ณ„๋„ ํŒŒ์ผ์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

_summary_index.jsonl
_latest_summary.json

๊ทธ๋ž˜์„œ ๋Œ€์‹œ๋ณด๋“œ๋‚˜ ์š”์•ฝ ๋กœ์ง์€ ๋งค๋ฒˆ ํด๋” ์ „์ฒด๋ฅผ ํ›‘์ง€ ์•Š๊ณ , ํ•„์š”ํ•œ ์ธ๋ฑ์Šค๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค.

์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ชฉ์  ์ด์ „ ๋ฐฉ์‹ ํ˜„์žฌ ๋ฐฉ์‹
์‹ค์‹œ๊ฐ„ ๋‚™์ƒ ๊ฐ์ง€ ์ €์žฅ๋œ ํŒŒ์ผ์„ ๋‹ค์‹œ ์ฐพ์•„ ์ฝ์Œ ์ƒ์„ฑ๋œ ํ…์ŠคํŠธ๋ฅผ ๋ฐ”๋กœ ํ•จ์ˆ˜์— ์ „๋‹ฌ
์ตœ์‹  ํ…์ŠคํŠธ ํ‘œ์‹œ ํด๋” ์ „์ฒด ํƒ์ƒ‰ _latest_text.json ์ฝ๊ธฐ
์š”์•ฝ ๋Œ€์ƒ ์ฐพ๊ธฐ ํด๋” ์ „์ฒด ํƒ์ƒ‰ ๋‚ ์งœ๋ณ„ ์ธ๋ฑ์Šค ํŒŒ์ผ ์ฝ๊ธฐ
์žฅ๊ธฐ ๋ณด๊ด€ ํ…์ŠคํŠธ ํŒŒ์ผ ์ €์žฅ ํ…์ŠคํŠธ ํŒŒ์ผ ์ €์žฅ ์œ ์ง€

๋‚™์ƒ ๊ฐ์ง€ ํ๋ฆ„

๋‚™์ƒ ๊ฐ์ง€๋Š” 2๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

1์ฐจ ๊ฐ์ง€:

  • models/fall_classifier.pkl ๋ชจ๋ธ ์‚ฌ์šฉ
  • Qwen์ด ์ƒ์„ฑํ•œ ํ…์ŠคํŠธ๋ฅผ ์ž„๋ฒ ๋”ฉ์œผ๋กœ ๋ณ€ํ™˜
  • ๋‚™์ƒ ๊ฐ€๋Šฅ์„ฑ์ด ๊ธฐ์ค€๊ฐ’ ์ด์ƒ์ด๋ฉด ์˜์‹ฌ ์ƒํ™ฉ์œผ๋กœ ํŒ๋‹จ

2์ฐจ ํŒ๋‹จ:

  • 1์ฐจ ๊ฐ์ง€์—์„œ ์˜์‹ฌ๋˜๋ฉด Claude๊ฐ€ ํ…์ŠคํŠธ๋ฅผ ๋‹ค์‹œ ์ฝ๊ณ  ํŒ๋‹จ
  • ์‹ค์ œ ๋‚™์ƒ์œผ๋กœ ํŒ๋‹จ๋˜๋ฉด ์ด๋ฉ”์ผ ์•Œ๋ฆผ ๋ฐœ์†ก

๋‚™์ƒ์ธ๋ฐ ์ •์ƒ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋จผ์ € ๊ธฐ์ค€๊ฐ’์„ ๋‚ฎ์ถฐ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

FALL_CLASSIFIER_THRESHOLD=0.45

๊ฐ’์„ ๋‚ฎ์ถ”๋ฉด ๋‚™์ƒ์„ ๋” ์ž˜ ์žก์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ •์ƒ ์ƒํ™ฉ์„ ๋‚™์ƒ์œผ๋กœ ์˜คํŒํ•  ๊ฐ€๋Šฅ์„ฑ๋„ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค. ์žฅ๊ธฐ์ ์œผ๋กœ๋Š” ์‹ค์ œ Qwen ์ถœ๋ ฅ ๋ฌธ์žฅ์„ ๋ชจ์•„์„œ fall_classifier.pkl์„ ๋‹ค์‹œ ํ•™์Šตํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

1์ฐจ ๋‚™์ƒ ๊ฐ์ง€ ๋ชจ๋ธ ์žฌํ•™์Šต

models/fall_classifier.pkl์€ 1์ฐจ ๋‚™์ƒ ๊ฐ์ง€์— ์‚ฌ์šฉํ•˜๋Š” ํ•™์Šต ์™„๋ฃŒ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค.

์ฃผ์˜ํ•  ์ ์€ .pkl ์•ˆ์— ์›๋ณธ ๋ฌธ์žฅ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ทธ๋Œ€๋กœ ๋“ค์–ด ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์›๋ณธ ๋ฌธ์žฅ๋“ค์€ detection/training_data.py์— ๋ณด๊ด€ํ•˜๊ณ , .pkl์—๋Š” ๊ทธ ๋ฌธ์žฅ๋“ค๋กœ ํ•™์Šต๋œ Logistic Regression ๋ชจ๋ธ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

์ •ํ™•๋„๋ฅผ ์˜ฌ๋ฆฌ๊ณ  ์‹ถ์„ ๋•Œ๋Š” ๋‹ค์Œ ์ˆœ์„œ๋กœ ์ž‘์—…ํ•ฉ๋‹ˆ๋‹ค.

  1. detection/training_data.py์— ์‹ค์ œ Qwen ์ถœ๋ ฅ ๋ฌธ์žฅ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋‚™์ƒ/์ฃผ์˜ ์ƒํ™ฉ์ด๋ฉด ๋ผ๋ฒจ์„ 1๋กœ ๋‘ก๋‹ˆ๋‹ค.
  3. ์ •์ƒ ์ƒํ™ฉ์ด๋ฉด ๋ผ๋ฒจ์„ 0์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.
  4. ์žฌํ•™์Šต ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  5. ์ƒˆ๋กœ ์ƒ์„ฑ๋œ models/fall_classifier.pkl๋กœ ์„œ๋ฒ„๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์žฌํ•™์Šต ๋ช…๋ น:

python -m detection.train_classifier

๊ธฐ๋ณธ ๋™์ž‘:

  • ๊ธฐ์กด models/fall_classifier.pkl์ด ์žˆ์œผ๋ฉด .bak ๋ฐฑ์—… ํŒŒ์ผ์„ ๋จผ์ € ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • detection/training_data.py์˜ TRAINING_DATA๋ฅผ ์ž„๋ฒ ๋”ฉํ•ฉ๋‹ˆ๋‹ค.
  • Logistic Regression ๋ชจ๋ธ์„ ๋‹ค์‹œ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒˆ ๋ชจ๋ธ์„ models/fall_classifier.pkl์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

๋ฐฑ์—… ์—†์ด ๋ฐ”๋กœ ๋ฎ์–ด์“ฐ๊ณ  ์‹ถ์„ ๋•Œ:

python -m detection.train_classifier --no-backup

๋‹ค๋ฅธ ์œ„์น˜์— ์ €์žฅํ•˜๊ณ  ์‹ถ์„ ๋•Œ:

python -m detection.train_classifier --output /workspace/development/generated_data/models/fall_classifier.pkl

ํ•™์Šต๋งŒ ํ…Œ์ŠคํŠธํ•˜๊ณ  ํŒŒ์ผ์€ ์ €์žฅํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด:

python -m detection.train_classifier --dry-run

์žฌํ•™์Šต ํ›„ ์„œ๋ฒ„์—์„œ ์ƒˆ ๋ชจ๋ธ์„ ์“ฐ๊ฒŒ ํ•˜๋ ค๋ฉด ์„œ๋ฒ„๋ฅผ ์žฌ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํ™•์‹คํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฉ”์ผ ์ข…๋ฅ˜

์ด๋ฉ”์ผ์€ ๋‘ ์ข…๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์น˜ ์—ญํ• 
detection/emailer.py ๋‚™์ƒ ๋ฐœ์ƒ ์‹œ ๊ธด๊ธ‰ ์•Œ๋ฆผ ์ด๋ฉ”์ผ ๋ฐœ์†ก
summary/emailer.py ์ •๊ธฐ ์š”์•ฝ๋ณด๊ณ ์„œ ์ด๋ฉ”์ผ ๋ฐœ์†ก

๋‘ ํŒŒ์ผ ๋ชจ๋‘ ๋ฐœ์‹  ๊ณ„์ •์€ SENDER_EMAIL, SENDER_PASSWORD๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜์‹ ์ž๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ JANG_EMAIL์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์ˆ˜์‹  ์ด๋ฉ”์ผ์„ ๋ฐ”๊พธ๋ฉด ๋‚™์ƒ ์•Œ๋ฆผ์€ ๋Œ€์‹œ๋ณด๋“œ ์„ค์ •์„ ์šฐ์„  ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋กœ๊ทธ

์„œ๋ฒ„์™€ ์Šค์ผ€์ค„๋Ÿฌ๋Š” Python logging์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๋กœ๊ทธ ๋ ˆ๋ฒจ:

LOG_LEVEL=INFO

๋” ์ž์„ธํžˆ ๋ณด๊ณ  ์‹ถ์„ ๋•Œ:

LOG_LEVEL=DEBUG

ํŒŒ์ผ์—๋„ ์ €์žฅํ•˜๊ณ  ์‹ถ์„ ๋•Œ:

CARENOTE_LOG_FILE=/workspace/development/generated_data/logs/carenote.log

๋กœ์ปฌ PC์—์„œ send_video.py๊ฐ€ ๋‚จ๊ธฐ๋Š” ์ „์†ก ๋กœ๊ทธ๋Š” ๋ณ„๋„ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

CARENOTE_CLIENT_LOG_FILE=logs/send_video.log

์ฒ˜์Œ ํ…Œ์ŠคํŠธํ•˜๋Š” ์ถ”์ฒœ ์ˆœ์„œ

1. RunPod ์„œ๋ฒ„ ์‹คํ–‰

uvicorn server:app --host 0.0.0.0 --port 9000

2. ์„œ๋ฒ„ ์ƒํƒœ ํ™•์ธ

curl http://127.0.0.1:9000/health

model_loaded๊ฐ€ true๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

3. ์™ธ๋ถ€ ์ฃผ์†Œ ํ™•์ธ

๋กœ์ปฌ PC ๋ธŒ๋ผ์šฐ์ €์—์„œ ์•„๋ž˜ ์ฃผ์†Œ๋ฅผ ์—ฝ๋‹ˆ๋‹ค.

https://your-runpod-id-9000.proxy.runpod.net/health

4. ๋Œ€์‹œ๋ณด๋“œ ํ™•์ธ

https://your-runpod-id-9000.proxy.runpod.net/dashboard

5. ์งง์€ ์˜์ƒ ์ง์ ‘ ์—…๋กœ๋“œ

RunPod ๋˜๋Š” ๋กœ์ปฌ PC์—์„œ ํ…Œ์ŠคํŠธ ์˜์ƒ์„ ํ•˜๋‚˜ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

curl -X POST -F "file=@test.mp4" https://your-runpod-id-9000.proxy.runpod.net/analyze-video/

6. ๋ถ„์„ ํ…์ŠคํŠธ ํ™•์ธ

ls /workspace/development/generated_data/texts

์•„๋ž˜ ํŒŒ์ผ์ด ์ƒ๊ฒผ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๋ถ„์„๊ฒฐ๊ณผ.txt
_text_index_YYYY-MM-DD.jsonl
_latest_text.json

7. ์š”์•ฝ๋ณด๊ณ ์„œ ํ™•์ธ

60๋ถ„ ์š”์•ฝ์€ ์‹œ๊ฐ„์ด ์ง€๋‚˜์•ผ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋ฐ”๋กœ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด 3๋ถ„ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ๋”ฐ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

python main_scheduler.py

์š”์•ฝ ํŒŒ์ผ ํ™•์ธ:

ls /workspace/development/generated_data/summaries

8. AgentDVR ์—ฐ๊ฒฐ

์ง์ ‘ ์—…๋กœ๋“œ ํ…Œ์ŠคํŠธ๊ฐ€ ์„ฑ๊ณตํ•œ ๋’ค AgentDVR ์ด๋ฒคํŠธ์— send_video.py๋ฅผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์ž์ฃผ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ์™€ ํ™•์ธ ๋ฐฉ๋ฒ•

/health๊ฐ€ 502๋ฅผ ๋ฐ˜ํ™˜ํ•จ

502๋Š” ๋Œ€๋ถ€๋ถ„ RunPod ํ”„๋ก์‹œ๊ฐ€ ์„œ๋ฒ„ ์•ฑ์— ์—ฐ๊ฒฐํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

ํ™•์ธํ•  ๊ฒƒ:

  • Pod๊ฐ€ Running ์ƒํƒœ์ธ์ง€
  • ์„œ๋ฒ„๋ฅผ --host 0.0.0.0 --port 9000์œผ๋กœ ์‹คํ–‰ํ–ˆ๋Š”์ง€
  • RunPod ํ”„๋ก์‹œ ์ฃผ์†Œ์˜ ํฌํŠธ๊ฐ€ 9000์ธ์ง€
  • ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰ ์ค‘์— ์—๋Ÿฌ๋กœ ์ข…๋ฃŒ๋˜์ง€ ์•Š์•˜๋Š”์ง€
  • ๋ชจ๋ธ ๋กœ๋”ฉ ์ค‘ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜๋Š”์ง€

/health๋Š” ๋˜์ง€๋งŒ model_loaded=false

FastAPI ์„œ๋ฒ„๋Š” ์ผœ์กŒ์ง€๋งŒ Qwen ๋ชจ๋ธ์ด ์•„์ง ์ค€๋น„๋˜์ง€ ์•Š์€ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

ํ™•์ธํ•  ๊ฒƒ:

  • ๋ชจ๋ธ ๊ฒฝ๋กœ CHECKPOINT_PATH๊ฐ€ ๋งž๋Š”์ง€
  • RunPod GPU ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ถฉ๋ถ„ํ•œ์ง€
  • GPU_MEMORY_UTILIZATION, MAX_MODEL_LEN ๊ฐ’์„ ๋„ˆ๋ฌด ํฌ๊ฒŒ ์žก์ง€ ์•Š์•˜๋Š”์ง€
  • ์„œ๋ฒ„ ๋กœ๊ทธ์— ๋ชจ๋ธ ๋กœ๋”ฉ ์˜ค๋ฅ˜๊ฐ€ ์—†๋Š”์ง€

์˜์ƒ ์—…๋กœ๋“œ๊ฐ€ 503 Model is not ready๋ฅผ ๋ฐ˜ํ™˜ํ•จ

๋ชจ๋ธ ๋กœ๋”ฉ์ด ๋๋‚˜๊ธฐ ์ „์— ์˜์ƒ์„ ๋ณด๋‚ธ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

/health์—์„œ model_loaded=true๊ฐ€ ๋‚˜์˜จ ๋’ค ๋‹ค์‹œ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

์˜์ƒ ์—…๋กœ๋“œ๊ฐ€ dropped๋กœ ๋‚˜์˜ด

์„œ๋ฒ„๊ฐ€ ์ด๋ฏธ ๋‹ค๋ฅธ ์˜์ƒ์„ ๋ถ„์„ ์ค‘์ด๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ ๊ตฌ์กฐ๋Š” ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์˜์ƒ๋งŒ ๋ถ„์„ํ•˜๋„๋ก ์ž ๊ธˆ์ด ๊ฑธ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „ ์˜์ƒ ๋ถ„์„์ด ๋๋‚œ ๋’ค ๋‹ค์Œ ์˜์ƒ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์š”์•ฝ๋ณด๊ณ ์„œ๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์Œ

์š”์•ฝ ๋Œ€์ƒ ์‹œ๊ฐ„ ๊ตฌ๊ฐ„์— ๋ถ„์„ ํ…์ŠคํŠธ๊ฐ€ ์—†์œผ๋ฉด ์š”์•ฝ๋ณด๊ณ ์„œ๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ™•์ธํ•  ๊ฒƒ:

  • /workspace/development/generated_data/texts์— ๋ถ„์„ ํ…์ŠคํŠธ๊ฐ€ ์žˆ๋Š”์ง€
  • _text_index_YYYY-MM-DD.jsonl ํŒŒ์ผ์ด ์žˆ๋Š”์ง€
  • ANTHROPIC_API_KEY๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๋Š”์ง€
  • ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ์‹ค์ œ๋กœ ์‹คํ–‰ ์ค‘์ธ์ง€

์ด๋ฉ”์ผ์ด ์˜ค์ง€ ์•Š์Œ

ํ™•์ธํ•  ๊ฒƒ:

  • SENDER_EMAIL์ด ๋งž๋Š”์ง€
  • SENDER_PASSWORD๊ฐ€ ์ผ๋ฐ˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์•„๋‹ˆ๋ผ ์•ฑ ๋น„๋ฐ€๋ฒˆํ˜ธ์ธ์ง€
  • JANG_EMAIL ๋˜๋Š” ๋Œ€์‹œ๋ณด๋“œ ์ˆ˜์‹  ์ด๋ฉ”์ผ์ด ๋งž๋Š”์ง€
  • Gmail ๋ณด์•ˆ ์„ค์ •์—์„œ SMTP ๋กœ๊ทธ์ธ์ด ํ—ˆ์šฉ๋˜๋Š”์ง€

AgentDVR ์ „์†ก ๋กœ๊ทธ์— ์„œ๋ฒ„ ์ค€๋น„ ์•ˆ ๋จ์ด ๋ฐ˜๋ณต๋จ

send_video.py๋Š” ์˜์ƒ์„ ๋ณด๋‚ด๊ธฐ ์ „์— /health๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์ผ ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค.

  • RunPod ์„œ๋ฒ„๊ฐ€ ์•„์ง ์ผœ์ง€์ง€ ์•Š์Œ
  • ์„œ๋ฒ„๋Š” ์ผœ์กŒ์ง€๋งŒ ๋ชจ๋ธ ๋กœ๋”ฉ์ด ๋๋‚˜์ง€ ์•Š์Œ
  • RunPod ํ”„๋ก์‹œ ์ฃผ์†Œ๊ฐ€ ํ‹€๋ฆผ
  • ํฌํŠธ๊ฐ€ 9000์ด ์•„๋‹˜
  • ์„œ๋ฒ„๊ฐ€ ์ค‘๊ฐ„์— ์—๋Ÿฌ๋กœ ์ข…๋ฃŒ๋จ

๋จผ์ € ๋ธŒ๋ผ์šฐ์ €์—์„œ ์•„๋ž˜ ์ฃผ์†Œ๋ฅผ ์ง์ ‘ ์—ด์–ด ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

https://your-runpod-id-9000.proxy.runpod.net/health

๋น ๋ฅธ ๋ช…๋ น ๋ชจ์Œ

์„œ๋ฒ„ ์‹คํ–‰:

uvicorn server:app --host 0.0.0.0 --port 9000

์„œ๋ฒ„ ์ƒํƒœ ํ™•์ธ:

curl http://127.0.0.1:9000/health

ํ…Œ์ŠคํŠธ ์˜์ƒ ์—…๋กœ๋“œ:

curl -X POST -F "file=@test.mp4" http://127.0.0.1:9000/analyze-video/

3๋ถ„ ์š”์•ฝ ์Šค์ผ€์ค„๋Ÿฌ:

python main_scheduler.py

60๋ถ„ ์š”์•ฝ ์Šค์ผ€์ค„๋Ÿฌ:

python chunked_scheduler.py

ํ…์ŠคํŠธ ํŒŒ์ผ ๋‚™์ƒ ์žฌ๊ฒ€์‚ฌ:

python fall_alert_checker.py /workspace/development/generated_data/texts/example.txt

AgentDVR ์ „์†ก ์ˆ˜๋™ ํ…Œ์ŠคํŠธ:

python send_video.py C:\path\to\test.mp4

1์ฐจ ๋‚™์ƒ ๊ฐ์ง€ ๋ชจ๋ธ ์žฌํ•™์Šต:

python -m detection.train_classifier

ํ•ต์‹ฌ ๋‚ด์šฉ

  • RunPod์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ์‹คํ–‰ํ•  ๊ฒƒ์€ server.py์ž…๋‹ˆ๋‹ค.
  • ๋กœ์ปฌ AgentDVR์—์„œ ์‹คํ–‰ํ•  ๊ฒƒ์€ send_video.py์ž…๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„๋ฅผ ์ผœ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ 60๋ถ„ ์š”์•ฝ ์Šค์ผ€์ค„๋Ÿฌ๋„ ๊ฐ™์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • 3๋ถ„ ์š”์•ฝ์„ ์“ฐ๋ ค๋ฉด main_scheduler.py๋ฅผ ๋”ฐ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์‹ค์‹œ๊ฐ„ ๋‚™์ƒ ๊ฐ์ง€๋Š” ํ…์ŠคํŠธ ๋‚ด์šฉ์„ ๋ฐ”๋กœ ์ „๋‹ฌ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ํด๋” ์ „์ฒด ํƒ์ƒ‰ ์ง€์—ฐ์„ ํ”ผํ•ฉ๋‹ˆ๋‹ค.
  • ํ…์ŠคํŠธ์™€ ์š”์•ฝ ํŒŒ์ผ์€ ์žฅ๊ธฐ ๋ณด๊ด€์„ ์œ„ํ•ด ๊ณ„์† ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • ๋Œ€์‹œ๋ณด๋“œ์™€ ์š”์•ฝ ๋กœ์ง์€ ์ตœ์‹  ์ •๋ณด ํŒŒ์ผ๊ณผ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • 1์ฐจ ๋‚™์ƒ ๊ฐ์ง€ ์ •ํ™•๋„๋ฅผ ๊ฐœ์„ ํ•˜๋ ค๋ฉด detection/training_data.py๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  python -m detection.train_classifier๋กœ .pkl์„ ๋‹ค์‹œ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

About

Anomaly detection for dementia patients

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors