본문 바로가기
Project/낙상

[낙상 감지 프로젝트] 2025년 2월 22일 (토) _프로젝트 완성

by 바다의 공간 2025. 2. 22.

 

[낙상 감지 프로젝트] 2025년 2월 15일 (토)

 

[낙상 감지 프로젝트] 2025년 2월 15일 (토)

https://so-fast.tistory.com/entry/%EB%82%99%EC%83%81-%EA%B0%90%EC%A7%80-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-2024%EB%85%84-12%EC%9B%94-31%EC%9D%BC%ED%99%94 [낙상 감지 프로젝트] 2024년 12월 31일(화)지난 회의..https://so-fast.tistory.com/ent

so-fast.tistory.com

 


지난 미팅 리뷰

 

1. 시각화를 통해서 중심좌표가 어디로 표시가 되어있는지 확인한다.

2. 낙상임에도 불구하고 낙상이라고 감지하지 못하는(정상판별) 클래스를 재확인해본다

3. 조건에 맞게 임계값 재수정

 


✔️ 현재 코드와 바운딩박스를 보니 아래와 같았다.

     	   # 위험 상태가 일정 시간 지속되면 낙상 처리
            if danger_frame_count < danger_frame_threshold:
                # 상태 판별
                if speed <= danger_speed_threshold:  # 정상
                    state = "Normal"
                    color = (0, 255, 0)  # 초록색
                    danger_frame_count = 0  # 위험 상태 프레임 초기화
                elif speed > danger_speed_threshold:  # 위험
                    state = "Danger"
                    color = (255, 0, 0)  # 파란색
                    danger_frame_count += 1  # 위험 상태 프레임 카운트
                    
            elif danger_frame_count >= danger_frame_threshold and speed < move_speed_threshold:
                state = "Fall"
                color = (0, 0, 255)  # 빨간색

 

정상(초록색)과 위험(파란색)은 보이는데, 낙상(빨간색)까지 넘어간적이 없었던 부분이 가장 해결해야할 과제라고 생각을 하고 우선순위로 풀어보려고 한다.

 

일단 논리적으로 볼때는 1번째 if문에서 danger_speed_threshold(=10)이 danger_frame_count이 10까지 올라가야되는데 

안올라가는이유에 대해서 생각해보았다.

 

그건 elif에서 카운트가 계속 누적되지 않는것같아서 중간에 print문을 넣어서 몇까지 올라가는지 확인해보았다.

또한 Normal에서 위험상태 프레임 초기화가 되니 3까지 올라가지 않는다고 판단을 하여 주석처리로 삭제했다.

 

            # # 위험 상태가 일정 시간 지속되면 낙상 처리
            if danger_frame_count < danger_frame_threshold:
                # 상태 판별
                if speed <= danger_speed_threshold:  # 정상
                    state = "Normal"
                    color = (0, 255, 0)  # 초록색
                    #danger_frame_count = 0  # 위험 상태 프레임 초기화
                elif speed > danger_speed_threshold:  # 위험
                    state = "Danger"
                    color = (255, 0, 0)  # 파란색
                    danger_frame_count += 1  # 위험 상태 프레임 카운트
                print(f"**********************************: {danger_frame_count}")

 

 

확인해보니 0,1,2,3까지 찍히고 3은 단 1번만 찍힌것을 확인했다.

1번만 찍힌것은 결국 Fall상태를 유지하지 못한다는 이야기다.

 

이 결과를 근거로 우리는 아래와같은 결론을 내었다.

1. danger_speed_threshold 값이 너무 높다.

그래서 danger_speed_threshold값을 3으로 대폭 낮췄다.

 

 

실행결과 1,2,3 프레임이 원하는대로 잘 처리가 된 것을 확인해보았고 

 

✔️ 영상으로 시각화로 확인해보았다.

output_yolo_pose_0.02.mp4
4.61MB

 

여태껏 단 한번도 보지 못했던 빨강색 바운딩박스가 보였다.


            elif danger_frame_count >= danger_frame_threshold:
                if speed < move_speed_threshold:
                    state = "Fall"
                    color = (0, 0, 255)  # 빨간색

 

이제는 Danger(위험)에서 Fall(낙상)조건으로 만족하지 못했을때 (즉, 낙상으로 의심되는 상황이후 정상적인 움직임을 다시 시작하였을 때), 다시 '정상'과 '위험'을 감지하는 if문으로 돌아가는 재귀하는 코드를 추가해보려 한다.

 

✔️ '위험' 이후 정상적인 움직임을 다시 시작했을때

✔️  '정상'과 ' 위험'을 감지하는 if문으로 돌아가는 코드 추가 

            # 위험 상태가 일정 시간 지속되면 낙상 처리
            if danger_frame_count < danger_frame_threshold:
                # 상태 판별
                if speed <= danger_speed_threshold:  # 정상
                    state = "Normal"
                    color = (0, 255, 0)  # 초록
                elif speed > danger_speed_threshold:  # 위험
                    state = "Danger"
                    color = (255, 0, 0)  # 파란색
                    danger_frame_count += 1  # 위험 상태 프레임 카운트

            elif danger_frame_count >= danger_frame_threshold:
                if speed < move_speed_threshold:
                    state = "Fall"
                    color = (0, 0, 255)  # 빨간색
                elif speed >= move_speed_threshold:
                    danger_frame_count = 0

 

이렇게 danger_frame_count를 0으로 만들어주어서 'danger_frame_count < danger_frame_threshold' 이 조건을 다시 충족하게 만들어 주었다.

Normal -> Danger - >Nomal
output_yolo_pose_3.mp4
4.77MB

 

 

여기서 danger_frame_count를 찍어보니 Nomal임에도 불구하고 0으로 초기화가 되지않았다. 

그래서 threshold값을 조금 조절해보려고 한다.

move_speed_threshold 0.002 danger_frame_count 초기화 안됨
move_speed_threshold 0.015 danger_frame_count 초기화 안됨
move_speed_threshold 0.018 danger_frame_count 초기화 됨

 

 

여기서보면 3 - > 0 -> 1로 Fall로 빠지지 않고 다시 Normal상태로 유지되는것을 확인할 수 있다.

 

KakaoTalk_20250222_213941756.mp4
2.31MB

쓰레숄드값이 0.018인 mp4.

 

Danger을 잡은 뒤 다시 일정 속도이상의 움직임이 있으니 다시 Nomal로 넘어간 것을 볼 수 있고
'danger_frame_count'값 또한 정상적인 움직임으로 파악하여 다시 '0'으로 변경되는것을 볼 수 있다.


🎊 마지막으로 기존 테스트 하던 영상으로 최종 확인을 해보았다.


 

🎊최종확인작품🎊

 

🎊최종확인작품🎊