사물인터넷 졸업프로젝트

[사물인터넷 캡스톤디자인] 폭력감지 CCTV 프로젝트 일지 ③

부농쿼카 2023. 5. 23. 16:55
728x90

프로젝트 개요

어린이집 폭력감지 CCTV로, yolov7을 사용하여, 교사가 아이를 학대할 경우 부모님 핸드폰으로 해당 폭력 영상을 전송하여, 어린이집 학대 사건이 일어났을 경우 증거인멸을 하지 못하게 하며, 빠른 시일 내에 부모님이 아이가 학대받는지 아닌지 알 수 있도록 하기 위해 이번 프로젝트를 진행하게 되었습니다. 거꾸로 어린이집 교사 입장에서는 아이가 작은 생채기가 생겨도 교사의 학대에 의한 것이 아닌, 아이의 실수에 의해 상처가 났다는 등 억울한 일이 생기지 않도록 도와줄 수 있습니다.

 

프로젝트 현위치

저는 Yolov7의 pre-trained된 pose-estimation을 활용하여 keypoint값을 추출한 후, 해당 값을 LSTM에 학습시켜 폭력 감지 하는 딥러닝 파트를 담당하여 진행하고 있습니다. 현재 keypoint값을 추출하였고, LSTM 초기 학습은 성공하였습니다.

 

오늘의 이슈

LSTM에서 예상치 못한 일이 생겼다. loss값이 아예 nan으로 떠서 학습이 전혀 진행되지 않았다. 이전에 학습시킬때는 그래도 loss값이 있었는데 이번에 학습시켜보니 nan으로 나오는게 이상해서 열심히 서칭해본 결과 총 세 가지 이유 중 하나였다.

① 알맞지 않은 optimizer or loss function

② 원하는 output과 맞지 않는 outputsize

③ 학습 데이터 내 0 혹은 None이 있는경우

 

내 경우에는 과거엔 학습이 잘 되던 것이 이번에 새롭게 데이터를 만든 후 학습이 안되는 것이기 때문에, ③번의 이유로 인해 non이 나온다고 생각했다. 데이터 preprocessing 부분을 다시 보니, 데이터를 받은 후, (50,31,22840)사이즈의 numpy 배열을 후처리로 (22840, 50,31)로 억지로 맞추다 보니 데이터 손실이 많이 일어나서 학습이 제대로 이루어지지 않았다고 판단했다.

 

기존 데이터 처리 코드

paths = "..."
numpy_paths = list(os.listdir(paths))
x_train = np.load("...")
for path in numpy_paths:
        array = os.path.join(paths,path)
        x = np.load(array, allow_pickle=True)
        # print(x.shape)
    # try:
        "저장한 numpy배열 열어서 training data 만들기"
        array = os.path.join(paths,path)
        x = np.load(array)
        x_train = np.dstack([x,x_train])
        print(x_train.shape)

기존에 np.dstack을 통해 데이터 후처리를 진행했다면, 이번엔 아예 numpy를 리스트에 append하여 저장한 후, append 된 리스트를 np.stack으로 받아 데이터 손실이 없으면서도 원하는 대로 전체 데이터가 쌓이도록 코드를 변경해주었다. 그랬더니, loss값이 출력되기 시작했다.

for path in numpy_paths:
        array = os.path.join(paths,path)
        x = np.load(array, allow_pickle=True)
        x_train.append(x)
x_data = np.stack(x_train)
print(x_data.shape)

 

 

해결해야 할 문제

물론, 새로운 문제가 생겼다.

이건 또 뭔데,,,

loss값이 나왔지만, 가지고 있는 모델에 overfitting되어 loss값이 너무 낮고 accuracy가 말도 안되게 높게 나왔다.

test 결과는 다음과 같다.

나빠...

다음 프로젝트 일지에서는 overfitting이 일어나는 원인에 대해 정확히 알아본 후, overfitting을 해결하는 방안에 대해 작성하도록 하자.

728x90