Skip to content

UiJoon64/seniorMotionDetection

Repository files navigation

πŸ‘΅ SENIOR_MOTION_DETECTION πŸ‘΄

λ…Έλ ΉμΈ΅ 이상행동 감지 및 보호자 μ•Œλ¦Ό μ„œλΉ„μŠ€

πŸ‘¨β€πŸ‘¨β€πŸ‘§β€πŸ‘§ 멀버 ꡬ성

νŒ€μž₯_μ „μ˜μ€€ : 🧭 μ œμž‘ 총괄

νŒ€μ›_κΉ€λ―Όμ˜ : πŸ”Š μŒμ„± 데이터 뢄석 및 ν•™μŠ΅

νŒ€μ›_κΉ€μ§€μ•„ : πŸƒ 이미지 및 μ˜μƒ 데이터 뢄석 및 ν•™μŠ΅

νŒ€μ›_μ†μˆ˜μ§€ : πŸ“Š μ›Ή νŽ˜μ΄μ§€ μ œμž‘

νŒ€μ›_μœ€μ§€μˆ˜ : πŸƒ 이미지 및 μ˜μƒ 데이터 뢄석 및 ν•™μŠ΅

βš™ 개발 ν™˜κ²½

PYTHON 3.9.16

CUDA 11.3

<μ‚¬μš© λͺ¨λΈ, api λ“±> 이미지데이터 : YOLOv7-tiny

μ˜μƒλ°μ΄ν„° : YOLOv7, media pipe, yolov7-w6-pose

μŒμ„±λ°μ΄ν„° : webkitSpeechRecognition, BERT

둜그인 DB : Firebase

(데이터 좜처 : AI-Hub)

🌳 ν”„λ‘œμ νŠΈ κ°œμš”

65μ„Έ μ΄μƒμ˜ κ³ λ Ή 인ꡬ가 증가함에 따라, ν™€λ‘œ κ³„μ‹œλŠ” μ–΄λ₯΄μ‹  λ˜ν•œ λ§Žμ•„μ§€κ³  μžˆλ‹€.

이 ν”„λ‘œμ νŠΈλŠ” 혼자 κ³„μ‹œλŠ” μ–΄λ₯΄μ‹ μ˜ 행동 νŠΉμ„±κ³Ό λ°œμƒ μ†Œλ¦¬λ₯Ό λͺ¨λ‹ˆν„°λ§ν•˜μ—¬

μœ„ν—˜μ‚¬ν•­μ„ 예츑 및 κ°μ§€ν•˜κ³  λ³΄ν˜Έμžμ—κ²Œ μ¦‰μ‹œ μ•Œλ¦¬κΈ° μœ„ν•΄ μ œμž‘λ˜μ—ˆλ‹€.

<전체 ꡬ성 μš”μ•½> image

⭐ 이미지데이터

정확도 이슈둜 인해 μž μ • μ œμ™Έ

AI-Hubμ—μ„œ 총 80κ°€μ§€μ˜ μΌμƒμƒν™œ 라벨링 데이터λ₯Ό 담은

< μΌμƒμƒν™œ 이미지 데이터 > λ₯Ό 가져와, κ°€μ •μ—μ„œ ν”νžˆ λ°œμƒν•  수 μžˆλŠ” 17κ°€μ§€μ˜ μƒν™©λ§Œμ„ μ„ λ³„ν•˜μ˜€λ‹€.

image

이미지듀은 YOLOv7-tiny의 ν•™μŠ΅μ„ μœ„ν•΄ 이미지 크기λ₯Ό 1920x1080 μ‚¬μ΄μ¦ˆμ—μ„œ 640x360의 μ‚¬μ΄μ¦ˆλ‘œ μ‘°μ ˆν•˜μ˜€λ‹€.

μ΄λ―Έμ§€λ§ˆλ‹€ 각 ν–‰λ™μ˜ λ°”μš΄λ”©λ°•μŠ€ μ’Œν‘œκ°€ λ“€μ–΄μžˆμ—ˆκ³ , λ°”μš΄λ”©λ°•μŠ€μ˜ μ’Œν‘œ λ˜ν•œ 이미지 크기 λΉ„μœ¨μ— 맞좰 μ •κ·œν™”μ‹œμΌœμ£Όμ—ˆλ‹€.

  • YOLOv7-tinyλ₯Ό μ„ μ •ν•œ μ΄μœ λŠ” YOLOv7-tinyκ°€ 객체 νƒμ§€μ˜ κ°€μž₯ 기본적이고 속도가 맀우 λΉ λ₯Έ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ,

    ν”„λ‘œμ νŠΈμ— ν•„μš”ν•œ μ‹€μ‹œκ°„ μ˜μƒ μ²˜λ¦¬μ— μ ν•©ν•˜λ‹€κ³  μƒκ°ν–ˆκΈ°μ— μ„ μ •ν•˜μ˜€λ‹€.


이미지 μ‚¬μ΄μ¦ˆμ™€ λ°”μš΄λ”©λ°•μŠ€ μ’Œν‘œ μ •κ·œν™”κ°€ λλ‚œ 5325개의 데이터듀은 Batch Size=4, Epoch=100으둜 YOLOv7-tinyλ₯Ό 톡해 ν•™μŠ΅μ‹œμΌœ

17κ°€μ§€μ˜ 행동 λΆ„λ₯˜ κ²°κ³Όλ₯Ό ν…μŠ€νŠΈλ‘œ μΆ”μΆœν•œλ‹€.

image

🌟 μ˜μƒλ°μ΄ν„°

이전 μ˜μƒ 데이터

AI-Hubμ—μ„œ 고령자 개인의 μ™Έν˜•κ³Ό ν–‰μœ„ νŠΉμ„±(μŠ΅κ΄€), 건강 μƒνƒœ, μƒν™œ νŒ¨ν„΄ 등을 λ‹΄κ³  μžˆλŠ”

< 이상행동 μ˜μƒ 데이터 > λ₯Ό 가져와, 일상 μƒν™œμ—μ„œ 일어날 수 μžˆλ‹€κ³  νŒλ‹¨ν•œ 낙상/일상/배회 총 3κ°€μ§€ section의 데이터λ₯Ό μ„ λ³„ν•˜μ˜€λ‹€.

이 ν”„λ‘œμ νŠΈμ—μ„œλŠ” 보톡 μž¬νƒ 곡간(μ‹€λ‚΄)μ—μ„œ μΌμ–΄λ‚˜λŠ” 이상 상황을 κ°μ§€ν•˜μ§€λ§Œ, λͺ¨λΈμ˜ ν•™μŠ΅μ„ μœ„ν•΄ 싀내와 μ‹€μ™Έ 데이터 λͺ¨λ‘ μ‚¬μš©ν•˜μ˜€λ‹€.

μ˜μƒ 데이터 쀑 낙상/일상/λ°°νšŒκ°€ μΌμ–΄λ‚˜λŠ” μˆœκ°„μΈ 2초 정도λ₯Ό ν•˜μ΄λΌμ΄νŠΈλ‘œ 가져와 μ˜μƒμ˜ μ „μ²˜λ¦¬λ₯Ό λ§ˆμ³€λ‹€.


전체적인 그림은

μ‹€μ‹œκ°„ μ˜μƒ > κ΄€μ ˆ 각도 μΆ”μΆœ > κ·Έλž˜ν”„ μ†‘μΆœ 및 이상행동 감지

image

μ΄λ•Œ κ΄€μ ˆ 각도λ₯Ό μΆ”μΆœν•΄ 이상행동을 κ°μ§€ν•˜λŠ” 방법은

낙상과 같은 μ΄μƒμžμ„Έ, 보행과 같은 동적인 μžμ„Έ, λͺ…상과 같은 정적인 μžμ„Έμ˜

κ΄€μ ˆ 각도 차이가 ν™•μ—°ν•˜κ²Œ λ“œλŸ¬λ‚¬κΈ°μ— μ‚¬μš©ν•˜κ²Œ λ˜μ—ˆλ‹€.

image

LSTM은 기쑴의 RNN을 보완해 μž₯/단기 기얡을 κ°€λŠ₯ν•˜κ²Œ μ„€κ³„ν•œ μ‹ κ²½λ§μ˜ ꡬ쑰둜 주둜 μ‹œκ³„μ—΄μ²˜λ¦¬, μžμ—°μ–΄μ²˜λ¦¬μ— μ‚¬μš©λœλ‹€.

이 ν”„λ‘œμ νŠΈμ—μ„œλŠ” μ‹€μ‹œκ°„ μ˜μƒμ—μ„œ κ΄€μ ˆ 각도λ₯Ό μΆ”μΆœν•΄λ‚΄ κ·Έλž˜ν”„λ‘œ λ°”λ‘œ λ³΄μ—¬μ£ΌλŠ”λ°μ— μ΄ˆμ μ„ λ‘μ—ˆκΈ°μ—, LSTM을 μ‚¬μš©ν•˜μ˜€λ‹€.

λͺ¨λΈ ν•™μŠ΅ μ‹œμ—λŠ” κΈ°μ‘΄ 375개의 데이터밖에 μ—†μ—ˆκΈ°μ—, 데이터λ₯Ό μ¦κ°•ν•˜μ—¬ 15000개의 데이터λ₯Ό ν•™μŠ΅μ‹œμΌ°λ‹€.

image

λ˜ν•œ, κ·Έλž˜ν”„λ₯Ό 그릴 λ•Œ μ΅œλŒ€ν•œ λŠκΉ€ 없이 λΆ€λ“œλŸ½κ²Œ μ†‘μΆœν•˜κΈ° μœ„ν•΄ 데이터λ₯Ό 1μ΄ˆμ— ν•œλ²ˆμ”© λ³΄μ—¬μ£ΌλŠ” 것과 같이 짧게 λŠλŠ” 것이 μ•„λ‹Œ,

3μ΄ˆμ— ν•œλ²ˆμ”© 보여주도둝 길게 λŠμ–΄λ‚΄ 쑰금 더 λΆ€λ“œλŸ½κ²Œ λ§Œλ“€μ—ˆλ‹€.

image

<YOLOv7, media pipe>

media pipeλ₯Ό μ΄μš©ν•΄μ„œ μ‹€μ‹œκ°„ μ˜μƒμ—μ„œ μžλ™μœΌλ‘œ κ΄€μ ˆκ°λ„λŸ‰μ„ μΆ”μΆœν•΄ κ·Έλž˜ν”„λ‘œ μ†‘μΆœν•˜λ € ν–ˆμœΌλ‚˜, μ‚¬λžŒμ„ μΈμ‹ν•˜λŠ” 정확도 λ©΄μ—μ„œ λ¬Έμ œκ°€ λ°œμƒν–ˆλ‹€.

λ”°λΌμ„œ YOLOv7을 ν™œμš©ν•΄ μ‚¬λžŒλ§Œ λ¨Όμ € μΈμ‹ν•œ ν›„, μ‚¬λžŒλ§Œ ν¬λ‘­ν•œ μ˜μƒμ„ media pipe에 λ„£μ–΄ κ΄€μ ˆ 각도λ₯Ό μΆ”μΆœν•˜λŠ” ν˜•μ‹μœΌλ‘œ λ°”κΎΈμ—ˆλ‹€.

image

μœ„μ™€ 같은 방식은 피사체가 크게 λ³€ν™”ν•  λ•Œ μΆ”μ •λœ 골격의 μ˜€μ°¨κ°€ 맀우 컀져 λŒ€μ²΄ κ°€λŠ₯ν•œ λ‹€λ₯Έ 방법을 μ°Ύμ•„μ•Ό ν–ˆλ‹€.

λ¨Όμ €, AI-hubμ—μ„œ κ΅¬ν•œ μ˜μƒ λ°μ΄ν„°λŠ” 2인 이상이 μ΄¬μ˜λ˜κ±°λ‚˜ 피사체가 맀우 μž‘κ³  ν•˜μ΄λΌμ΄νŠΈκ°€ 길이에 λΉ„ν•΄ 맀우 짧은 νŽΈμ΄μ—ˆκΈ°μ— μˆ˜κ°€ 적고 μ „μ²˜λ¦¬ν•˜κΈ°μ— λΆˆνŽΈν–ˆλ‹€.

λ”°λΌμ„œ 클래슀 λ³„λ‘œ μ˜μƒμ„ 직접 μ΄¬μ˜ν•˜μ˜€λ‹€.

낙상에 λŒ€ν•œ ꡬ뢄을 μ΅œμš°μ„ μ μΈ λͺ©ν‘œλ‘œ λ‘μ—ˆκΈ°μ— 낙상, 낙상과 κ°€μž₯ λΉ„μŠ·ν•œ 행동 μœ ν˜•μΈ λˆ•κΈ°, λ°°νšŒμ™€ 같은 일상적인 행동 총 3κ°€μ§€λ‘œ κ΅¬λΆ„ν•˜μ˜€λ‹€.

각 ν΄λž˜μŠ€μ— λŒ€ν•œ μ˜μƒμ„ 40개 μ •λ„λ‘œ ν™•λ³΄ν•˜μ˜€κ³  각 μ˜μƒμ€ μ•½ 3~4초 길이, 피사체 전체가 λ³΄μ΄λŠ” κ°λ„λ‘œ 행동이 μ΄λ£¨μ–΄μ§€λŠ” μ—¬λŸ¬ 경우의 수λ₯Ό μž¬ν˜„ν•˜μ—¬ μ΄¬μ˜ν•˜μ˜€λ‹€.

μ΄¬μ˜ν•œ μ˜μƒμ€ yolov7-w6-pose.pt λͺ¨λΈμ„ ν™œμš©ν•˜μ—¬ 골격의 μœ„μΉ˜λ₯Ό μΆ”μ •, μΆ”μ •ν•œ 2차원 μ’Œν‘œλ₯Ό λ°”νƒ•μœΌλ‘œ 각도λ₯Ό κ³„μ‚°ν•˜μ˜€λ‹€. (https://github.com/WongKinYiu/yolov7)

(가끔씩 μœ λ¦¬μ°½μ— λΉ„μΉœ λͺ¨μŠ΅λ„ 골격을 μΆ”μ •ν•΄λ‚΄λŠ”λ°, ν•œ ν”„λ ˆμž„μ— λŒ€ν•œ λͺ¨λΈμ˜ 좜λ ₯값이 2λ°°κ°€ λœλ‹€. κ°€μž₯ 신뒰도가 높은 κ°’ 골격을 μΆ”μΆœν•΄λ‚΄λ©΄ μ—¬λŸ¬ 피사체가 μžˆμ–΄λ„ λͺ©ν‘œ 피사체에 λŒ€ν•œ κ°’λ§Œ κ°€μ Έμ˜¬ 수 μžˆμ—ˆλ‹€.)

pose-estimate.pyλŠ” 디렉토리에 ν¬ν•¨λœ 전체 μ˜μƒμ— λŒ€ν•΄ ν•΄λ‹Ή 과정을 μˆ˜ν–‰ν•˜κ³  ν”„λ ˆμž„ λ‹¨μœ„λ‘œ 각 κ΄€μ ˆκ°λ„λ₯Ό κΈ°λ‘ν•˜μ—¬ csv파일둜 μƒμ„±ν•œλ‹€.

골격 μΆ”μ •μ˜ 정확도λ₯Ό ν™•μΈν•˜κΈ° μœ„ν•΄ 골격이 κ·Έλ €μ§„ μ˜μƒμ„ 같은 디렉토리에 μ €μž₯λ˜λ„λ‘ ν•˜μ˜€μ§€λ§Œ μΆ”μΆœ 과정에 μƒλ‹Ήν•œ μ‹œκ°„μ΄ μΆ”κ°€ λ˜κΈ°μ— λ³€ν™˜ν•΄μ•Όν•  μ˜μƒμ΄ μΆ”κ°€λ˜μ–΄μ•Ό ν•œλ‹€λ©΄ 이 과정은 μƒλž΅λ˜λ”μ•Ό ν•œλ‹€. (μ•½ 120개 μ˜μƒ λ³€ν™˜μ— 5μ‹œκ°„ 정도 μ†Œμš”)

이제 μ‹œκ°„λ³„ κ΄€μ ˆκ°λ„ λ³€ν™” 데이터λ₯Ό μ „μ²˜λ¦¬ ν•΄μ€€λ‹€.

Untitled

ν•˜μ§€λ§Œ 촬영된 μ˜μƒμ€ λˆ•λŠ” ν–‰μœ„λ‚˜ 낙상 μ „ν›„μ˜ λŒ€κΈ° λ™μž‘κΉŒμ§€ ν¬ν•¨ν•˜κΈ°μ— λͺ¨λ‘ 같은 라벨링을 ν•˜λ©΄ 정확도에 영ν–₯을 미치게 λœλ‹€.

이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ κ΅¬κ°„λ³„λ‘œ ν‘œμ€€νŽΈμ°¨λ₯Ό κ³„μ‚°ν•˜μ—¬ 4κ°€μ§€ κ΄€μ ˆ λͺ¨λ‘ λ³€ν™”κ°€ 크게 μ—†λŠ” ꡬ간은 νƒ€κ²Ÿμ΄ μ•„λ‹ˆλΌκ³  νŒμ •, μ œμ™Έν•˜μ—¬ ν•˜μ΄λΌμ΄νŠΈλ§Œ μΆ”μΆœν•œλ‹€.

Untitled (1)

μœ„μ™€ 같이 κ΅¬κ°„λ³„λ‘œ ν‘œμ€€ 편차λ₯Ό μΆ”μΆœν•œ λ‹€μŒ,

ν‘œμ€€ νŽΈμ°¨κ°€ μž„κ³„κ°’ μ΄ν•˜μΈ 뢀뢄에 λŒ€ν•΄ ν•„ν„°λ§ν•˜λ©΄ λ‹€μŒκ³Ό 같이 ν–‰μ˜ κ°œμˆ˜κ°€ 쀄어든, ν•˜μ΄λΌμ΄νŠΈλ§Œ μΆ”μΆœν•΄λ‚Ό 수 μžˆλ‹€.

download (2)

download (3)

μœ„μ™€ 같이 ν•˜μ΄λΌμ΄νŠΈλ§Œ μΆ”μΆœλœ 것을 확인이 κ°€λŠ₯ν•˜λ‹€.

또, μ΅œμ’… λͺ¨λ‹ˆν„°λ§ ν”„λ‘œκ·Έλž¨μ€ 1μ΄ˆμ— 10νšŒμ”© λ™μž‘μ„ μΆ”μ •ν•  κ²ƒμ΄λ―€λ‘œ 30fps둜 촬영된 ν›ˆλ ¨ 데이터도 average pooling을 μ‚¬μš©ν•˜μ—¬ 10fps둜 λ§žμΆ°μ€€λ‹€.

Untitled (2)

μ΄λ ‡κ²Œ μ „μ²˜λ¦¬κ°€ λλ‚œ 데이터 μ‚¬μš©ν•˜μ—¬ 원핫 인코딩을 μ‚¬μš©ν•œ νƒ€κ²Ÿ 데이터와 ν•¨κ»˜ ν›ˆλ ¨ λ°μ΄ν„°μ…‹μœΌλ‘œ λ§Œλ“ λ‹€.

길이가 5인 μ‹œκ³„μ—΄ 데이터이기에 lstm측을 μ‚¬μš©ν•œ λͺ¨λΈμ„ μ‚¬μš©ν•˜λŠ”λ°, 정확도 ν–₯상을 μœ„ν•΄μ„œ dropout, batch normalization측을 ν™œμš©ν•΄λ³΄μ•˜κ³ ,

μ‹€ν—˜μ μœΌλ‘œλ‚˜ μ΄λ‘ μ μœΌλ‘œλ‚˜ batch normalizationμΈ΅ λ§Œμ„ μ‚¬μš©ν•˜λŠ” 것이 μ„±λŠ₯이 μ’‹μ•„μ„œ BN측만 μ‚¬μš©ν•˜μ˜€λ‹€(Batch Normalized Recurrent Neural Networks,2015).

μœ„ 과정은 λͺ¨λ‘ preprocessing_sequential_datas.ipynbμ—μ„œ μ²˜λ¦¬ν•˜μ˜€λ‹€.

yolov7+mediapipe μ—μ„œ yolov7 pose estimation λͺ¨λΈλ‘œ λ³€ν™˜ν•΄μ„œ κ΄€μ ˆκ°λ„λ³€ν™” μΆ”μ΄λ‘œ 정확도λ₯Ό λΉ„κ΅ν•΄λ³΄λ‹ˆ 상당 λΆ€λΆ„ κ°œμ„ μ΄ 이루어진 것을 확인할 수 μžˆμ—ˆλ‹€.

Untitled (3)

[쒌 : yolov7+mediapipe, 우 : yolov7-pose-estimation]

✨ μŒμ„±λ°μ΄ν„°

AI-Hubμ—μ„œ "λΆˆμ΄μ•Ό!", " λ„μ™€μ£Όμ„Έμš”.."와 같은 μœ„κΈ‰μƒν™© λ°œμƒμ— λ”°λ₯Έ λ‹€μ–‘ν•œ 상황과 ν™˜κ²½λ³„ μŒμ„± 및 음ν–₯을 ν¬ν•¨ν•œ 데이터λ₯Ό

μ‹€μ‹œκ°„ μ˜μƒμ—μ„œ μŒμ„±μ„ μΆ”μΆœν•΄λ‚΄ κ·Έλž˜ν”„ μ•„λž˜μ— λ³΄μ—¬μ£ΌλŠ”λ° ν™œμš©ν•˜κΈ° μœ„ν•΄ κ°€μ Έμ™”λ‹€.

μš°μ„  μŒμ„±μΈμ‹ API둜 크둬 λΈŒλΌμš°μ €λ₯Ό μ‚¬μš©ν•΄ μ‰½κ²Œ κ΅¬ν˜„ κ°€λŠ₯ν•œ webkitSpeechRecognition을 톡해

μŒμ„±μ„ λ¬Έμ„œλ‘œ λ³€ν™˜ν•΄μ€€λ‹€.

이후 ν…μŠ€νŠΈ λ°μ΄ν„°λ‘œ 사전 ν›ˆλ ¨λœ 높은 μ„±λŠ₯을 κ°€μ§„ μ–Έμ–΄ λͺ¨λΈμΈ BERT λͺ¨λΈμ„ 톡해

λ¬Έμ„œλ‘œ λ³€ν™˜λœ μŒμ„±μ˜ 상황을 인식해 μœ„ν—˜ μƒν™©μœΌλ‘œ μΈμ‹λ˜λ©΄ λ³΄ν˜Έμžμ—κ²Œ μ•Œλ¦°λ‹€.

μ΄λ•Œ μ‚¬μš©λœ ν›ˆλ ¨ λ°μ΄ν„°λŠ” 19474개이며, Batch SizeλŠ” 32둜 총 15번 ν›ˆλ ¨μ‹œμΌ°λ‹€.

image

πŸ’« μ›Ή μ„œλΉ„μŠ€ κ΅¬ν˜„

μœ„ μ‚¬μš©ν•œ 이미지 데이터, μ˜μƒ 데이터, μŒμ„± 데이터λ₯Ό λͺ¨λ‘ λͺ¨μ•„ ν•œ νŽ˜μ΄μ§€μ— 보여주기 μœ„ν•΄

파이썬 기반의 μ›Ή ν”„λ ˆμž„μ›Œν¬μΈ Flaskλ₯Ό μ‚¬μš©ν•΄ μ›Ή μ„œλΉ„μŠ€λ₯Ό λ§Œλ“€μ—ˆλ‹€.

둜그인 νŽ˜μ΄μ§€μ˜ 경우 firebase μ„œλ²„μ™€ μ—°λ™ν•˜μ—¬ νšŒμ› 정보λ₯Ό κ΄€λ¦¬ν•˜μ˜€λ‹€.

🀩 ν”„λ‘œμ νŠΈ κ²°κ³Ό 및 μ‹€ν–‰

μ‹€ν–‰ νŒŒμΌμ„ 생성할 λ•Œ dockerλ₯Ό μ‚¬μš©ν•˜μ§€μ•Šκ³  pyinstaller 라이브러리λ₯Ό μ‚¬μš©ν•˜μ˜€λ‹€.

pyinstaller --onefile --add-data="templates;templates" --add-data="static;static" --add-data="models;models" --add-data="utils;utils" --add-data="latest_sequential_model.h5;." --add-data="yolov7-w6-pose.pt;." --hidden-import=seaborn --hidden-import=scipy.signal --hidden-import=matplotlib --hidden-import=matplotlib.pyplot --hidden-import=matplotlib.backends.backend_agg --hidden-import=yaml webcam_with_another_checking_skeleton_makingexe.py

Untitled (4)

Untitled (5)

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors