티스토리 뷰
📌 지난 회의 회고
✔️ 학인된 것
1) 실제 안드로이드 기기에서 mediapipe 테스트
: 프로그램을 1시간 이상 켜둔 결과 발열에 큰 이상은 없었음
: 좀 더 검증이 필요하겠지만 메모리 이슈만 생기지 않는다면 오래 켜놓아도 큰 문제는 없을 것
: mediapipe가 가상 환경과 달리 실제 환경에서는 빠르게 사람을 트래킹하는 것이 확인
2) 낙상 판별 근거
: 움직임의 변화 속도 -> 빠르게 속도가 변화한다면 그만큼 낙상 할/했을 확률이 높을 것
: 포즈 변화 분석 -> 포즈 인식 모듈 개발 필요
: 무게 중심 -> 인체 분절 기반으로 중심을 알아내는 방식
✔️ 의논한 것
- 낙상 판별 알고리즘 초안
: 4가지 케이스로 나누어 판별, 침대를 위험 지역과 안전 지역으로 나누어 무게 중심이 안전 지역이면 ①
위험 지역이면 ②
②에서 포즈를 인식하여 굴러 떨어질 위험이 있는 포즈라면 ③
③에서 속도 변화를 관찰하여 빠르게 움직이거나 아예 침대 밖이라면 낙상으로 간주하여 ④
✔️ 해야할 것
1️⃣ 병상 영역 검출 By OpenCV
🔎 전처리
: 배경과 병상 분리, 필요한 정보 강조
→ 가우시안 블러(이미지의 노이즈를 줄이는 기법)
→ 색상 공간 변환
→ 이진화
→ 엣지 감지(Canny 엣지 검출)
💁🏻♀️ 그레이 스케일(흑백)으로 전환?
💡 그레이 스케일을 적용하면 input의 차원↓ + 연산 효율성↑ + 비교적 노이즈에 둔감
그래서 컬러 정보가 중요한 작업이 아니면 보통 명암 정보에 관심이 있기때문에 그레이 스케일로 변환을 함!
🔎 영역검출
: 병상 영역을 검출하는 알고리즘 적용 → 병상 패턴, 색상(흰색) 또는 형태(직사각형) 검출 → 컨투어 검출, 객체 탐지 알고리즘
📋 참고 중인 파이썬 코드
import cv2
import numpy as np
def clahe(img, clip_limit=2.0, grid_size=(8,8)): # 영상의 대비를 향상시키기 위한 이미지 프로세싱
clahe = cv2.createCLAHE(clipLimit=clip_limit, tileGridSize=grid_size)
return clahe.apply(img)
cap = cv2.VideoCapture(1) # 웹캠에서 프레임 캡쳐 (무한 루프)
while True:
ret, src = cap.read()
if not ret:
print("Failed to capture frame")
break
# HSV thresholding to get rid of as much background as possible
# 가능한 한 많은 배경을 제거하기 위한 HSV(그 중에서도 blue) 임계값 설정 (전처리)
hsv = cv2.cvtColor(src.copy(), cv2.COLOR_BGR2HSV) # 입력 이미지를 HSV 색상 공간으로 변환
lower_blue = np.array([0, 0, 120])
upper_blue = np.array([180, 38, 255])
mask = cv2.inRange(hsv, lower_blue, upper_blue)
result = cv2.bitwise_and(src, src, mask=mask)
b, g, r = cv2.split(result)
g = clahe(g, 5, (3, 3))
# Adaptive Thresholding to isolate the bed
# 침대를 격리하기 위한 Adaptive Thresholding
img_blur = cv2.blur(g, (9, 9))
img_th = cv2.adaptiveThreshold(img_blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 51, 2) # 가우시안 필터 기반으로 적응형 임계값(Adaptive Thresholding)을 설정
contours, _ = cv2.findContours(img_th, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) # 이진 이미지에서 객체의 컨투어(윤곽선)를 검출
# Filter the rectangle by choosing only the big ones
# and choose the brightest rectangle as the bed
# 큰 직사각형만 선택하여 직사각형 필터링
# 그리고 가장 밝은 직사각형을 침대로 선택
max_brightness = 0
canvas = src.copy()
brightest_rectangle = None
for cnt in contours:
rect = cv2.boundingRect(cnt)
x, y, w, h = rect
if w*h > 40000:
mask = np.zeros(src.shape, np.uint8)
mask[y:y+h, x:x+w] = src[y:y+h, x:x+w]
brightness = np.sum(mask)
if brightness > max_brightness:
brightest_rectangle = rect
max_brightness = brightness
if brightest_rectangle:
x, y, w, h = brightest_rectangle
cv2.rectangle(canvas, (x, y), (x+w, y+h), (0, 255, 0), 1)
cv2.imshow("canvas", canvas) # 원본 영상 위에 선택된 침대의 위치를 사각형으로 표시
# Exit loop when "ESC" key is pressed
# "ESC" 키를 누르면 루프 종료
key = cv2.waitKey(1)
if key == 27:
break
cap.release()
cv2.destroyAllWindows()
'프로젝트 > 링크사업 산학과제 (2023)' 카테고리의 다른 글
낙상 판별 알고리즘 (0) | 2023.08.10 |
---|---|
Pose Landmark Detection 테스트 (0) | 2023.07.27 |
오픈소스 pose estimation 라이브러리 (0) | 2023.07.13 |
회의 전 생각해 볼 이슈 (0) | 2023.06.29 |