[SK쉴더스 루키즈 24기] 모듈 프로젝트1

아굥·2025년 1월 13일
1

SK Shieldus Rookies

목록 보기
14/32

파이썬, 머신러닝/딥러닝 교육 후 팀을 이뤄서 모듈 프로젝트를 진행했다.
프로젝트 진행 도중 있었던 문제들을 끄적여두면 나중에 도움이 되지 않을까 싶어 적어본다.


1. 주제 및 기간

주제: MediaPipe Pose AI API를 활용한 침입탐지 지능형 보안 서비스 구축
기간: 2025.01.06 - 2025.01.10 (5일간)


2. 구현 과정

1) 기획 단계

기존에는 원룸 침입 영상 탐지 쪽으로 방향을 잡았으나 기획부터 개발, 테스트, 발표까지 5일 밖에 시간이 없다보니 강사님께선 우리가 이때까지 배웠던 걸 실습해보는 시간이라 생각하고 간단하게 만들라고 하셨다.
데이터셋을 살펴보면서 얘기 나누다가 얼굴 인식, 물체 인식 쪽으로 틀을 잡았다.

동작 순서

  • 1단계. 사람인가?
    Y -> 시스템 시작, 2단계로
  • 2단계. 위험한 무기(칼, 총, 망치 등)를 들고 있는가?
    Y -> 위험 메시지 출력 및 입장 불가 처리
    N -> 3단계로
  • 3단계. 등록되어 있는 사용자인가?
    Y -> 통과 (입장 가능)
    N -> 4단계로
  • 4단계. 사전에 정해진 수신호(손 동작)를 하는가?
    Y -> 통과 (입장 가능)
    N -> 위험 메시지 출력 및 입장 불가 처리

우선 캠이 켜지면 사람이 있는지, 사람이라면 위험한 무기를 들고 있는지, 위험 무기가 없다면 등록된 사용자인지, 마지막으로 정해진 수신호(손 동작)를 취하는지 판단하는 서비스를 구현하기로 정했다.

2) 개발 단계

팀원이 6명이었기 때문에 2명씩 쪼개어 사람 인식, 안면(등록된 사용자인지) 인식, 물체 인식 이렇게 3가지로 나누어 각자 구현하고, 모듈화하여 main 파일에서 해당 기능이 담긴 파일을 불러와 사용하기로 결정했다.

나는 물체 인식 파트를 맡아서 진행했다.

우선 첫 번째로 칼이나 망치, 도끼 같은 무기가 담긴 데이터셋을 찾아보았는데 저런 것들이 한 번에 담긴 데이터셋을 찾기가 힘들어서 여러 개의 데이터셋을 찾고 그걸 하나로 합치는 쪽으로 방향을 잡았다.

그냥 간단히 데이터 전처리는 실습 시간에 해보았지만 여러 데이터셋을 하나로 합치고 다듬는 건 처음이라 csv 파일에 라벨링 하는 과정에서 1차로 허둥지둥 거렸다.. 머신러닝 프로젝트는 처음이라고 봐도 무방한 정도라...

중간에 사람 인식 파트를 구현 완료한 팀원들이 찢어져 한 명은 안면 인식, 한 명은 물체 인식 파트를 도와 같이 하기로 했다. 같이 하게된 팀원이 데이터 전처리를 도와주어 어찌저찌 진전은 되었으나 두 번째로 아주 큰 문제가 발생 했다.
학습을 시켜 나온 모델로 무기를 제대로 인식하는지 테스트를 간단히 해보았다.
팀원이 이미지를 업로드하여 해당 이미지가 어떤 무기에 해당하는지 출력 시키는 웹페이지를 만들었는데.. 여기서 사람 얼굴을 올려도 Knife, Axe 이런 무기로 인식을 하는데다가 정확도도 80~90%로 나왔다.

이때가 아마 1월 7일쯤이었던 걸로 기억한다.

몇 번의 재시도 끝에 정확도가 낮게 나오기 시작하길래 실제 노트북 캠을 켜서 물체 인식이 되는지도 해보았는데 이번에도 역시 칼은 커녕 사람 얼굴만 나오는데 칼이 인식된다고 나오는 등 괴랄한 문제가 발생했다.
해당 문제로 2일이 넘도록 낑낑거리다가 결국 9일 저녁에 팀 회의를 진행하면서 물체 인식을 빼야하나, 다른 방법을 찾아야 하나 얘기를 나누었다. 팀원이 제시한 의견을 바탕으로 결국 모델을 직접 학습 시켜서 사용하는게 아닌 머신러닝/딥러닝 실습 때 나왔던 MediaPipe의 이미지 분류 모델을 사용하는 방향으로 계획을 수정하였다.

제공되는 EfficientNet-Lite0 모델을 받아와서 확인해보니 자잘한 물체(의자, 사람 등)의 이름도 다 뜨길래 탐지된 물체의 카테고리명이 'knife'인 경우만 나오도록 코드를 수정하였다.
이 역시도 완전히 정확하게 탐지하는 것은 아니였지만 어느정도 탐지는 되었기에 구현에는 성공.. 했다.

3) 발생했던 문제들

내가 맡았던 물체 인식 파트 구현 중 나타났던 오류만 작성하겠다.

데이터셋 문제

모델 테스트 중, 칼 이미지를 올렸는데 handgun이라고 인식하거나 망치 이미지를 업로드했는데 knife라고 인식하는 등의 문제가 발생

다운받은 데이터셋 내부에 drill, hammer, wrench, axe, baseball bat, handgun, knife 등 여러 무기 이미지가 있었는데 어떤 건 1만장이 넘게 있는 반면 어떤 건 200, 300장 밖에 없었다. 각 이미지의 개수가 다르다보니 정확도 감소 문제가 발생한 것이었다.

위와 같이 데이터가 너무 적거나 많은 경우에는 해당 요소 자체를 제거하는 것이 효과적이고 노이즈가 적은 학습을 할 수 있다고 하여 결국 knife, handgun만 남겨두고 나머지는 삭제 후, 두 이미지의 개수를 동일하게 맞추는 쪽으로 데이터셋을 수정하여 모델을 재학습하였다.

Metadata 문제

모델 로드 시 'ValueError: Object detection models require TFLite Model Metadata but none was found' 오류 발생

말 그대로 메타데이터를 찾을 수 없다는 오류이다. 분명 .tflist 파일도 있었고 해당 파일 내부에 메타데이터를 추가하는 코드를 입력했는데도 이 문제가 해결되지 않고 아예 다른 오류가 나는 등 계속해서 문제가 발생했다.

이 문제로 며칠을 끙끙 앓다가 모델 정확도 문제와 겹쳐 결국 위에서 작성했듯이 MediaPipe에서 제공하는 모델을 사용하는 것으로 수정하였다.


3. 소감

1) 힘들었던, 아쉬웠던 점

짧은 기간동안 인공지능에 대해 배우고 바로 프로젝트를 시작한거라 너무 부족했던 점이 많았다. 데이터 전처리 하는 것부터 버둥거렸으니..
노트북 CPU나 메모리를 많이 잡아 먹었는지 노트북이 아예 멈춰서 껐다가 킨 적도 있었다.

그리고 각자 로컬 환경에서 작업을 하다보니 동일한 코드를 실행해도 누구는 오류가 발생하고 누구는 제대로 실행되는 등 호환성 문제도 자잘자잘하게 있었다.
특히 마지막 시연 영상을 찍을 무렵에는 main.py을 실행했는데 윈도우를 쓰는 팀원들만 물체 인식 파일을 import하자 실행이 안되는 문제가 발생하여 리눅스를 쓰던 다른 팀원과 맥을 쓰는 나 이렇게 둘이서 시연 영상을 찍기도 했다.
팀 프로젝트 시에 모두가 같은 개발환경을 세팅하는 것이 좋을 것 같다고 뼈저리게 느꼈던 시간이 아니었나 싶다.

마지막으로 데이터셋의 중요성을 느꼈다.
우리가 만들었던 모델의 정확도 문제가 데이터셋 때문이 아닐까? 라고 팀원들이 얘기했었는데 이 부분이 맞는 것 같다.
모델이 좋은 성능을 내기 위해선 그만큼 데이터의 정확성, 다양성이 뒷받침되어야 한다고 생각된다.
데이터가 다양한 패턴을 포함하고 있고, 정확해야 모델이 학습을 통해 다양한 상황에서도 안정적으로 동작될 것이기 때문이다.
적절한 데이터셋을 구축하고 전처리 하는 과정도 중요하다라는 걸 다시 한번 깨달았고, 앞으로는 데이터셋 수집 과정에서도 많은 신경을 써야겠다는 생각이 들었다.

2) 느낀 점

제일 크게 느꼈던 건 '인공지능 공부 열심히 해야겠다' 라는 것.
프로젝트 하는 5일 간 구글과 gpt를 얼마나 애용했는지..
나 빼고 다들 잘하고 있는 것 같아보여서 약간 눈치도 보였다. 너무 짐덩이가 아닐까 싶어서.
그래서 더더욱 이것저것 해보려고 노력 했었다.

메타데이터 오류 + 모델 정확도 문제를 끝내 해결하지 못하고 다른 방법을 사용했던 점이 아직까지도 많이 아쉽다.
며칠 간 여러 방법을 다 써봤는데도 해결을 못하고 있던 상태였기에 기간 내에 완성 하려면 다른 방법을 택하는 것이 맞는 선택이었으니 어쩔 수 없긴 했지만.. 그래도 아직까지 아쉬운 마음이 드는건 어쩔 수 없는 것 같다.

모든 팀원들이 열심히 해주었기 때문에 중간중간 문제도 많았지만 무사히 프로젝트를 끝낼 수 있었던 것 같다. 과연 이 글을 읽을 사람이 있을진 모르겠지만 6조 짱짱..ㅎㅎ

2월 말에 진행될 모듈 프로젝트2를 대비하기 위해 다시 열심히 머신러닝 공부해야 겠다.

profile
열심히 살아보아요

0개의 댓글