-
캡스톤 디자인: 보행자와 운전자를 위한 AI 기반 스마트 펜스 개발프로젝트 2025. 1. 27. 22:30
0. 팀 구성원 및 역할
우리 프로젝트팀은 총 6명으로 팀장 1명, 하드웨어 담당 3명, 소프트웨어 담당 2명이다.
각 역할은 다음과 같다.
팀장: 프로젝트 총괄 및 일정 관리
하드웨어 담당: LED 및 음성 센서 제어 회로 설계
소프트웨어 담당 (본인): 객체 인식 프로그램 개발 및 시스템 통합본인의 역할은 소프트웨어 개발을 담당하여, Jetson Xavier에서 YOLOv4 모델을 최적화하고 실행하는 코드를 개발하고자 했다. Python3를 활용해 특정 경계선에 닿는 물체를 인식하여 True/False 결과를 출력하는 프로그램을 목표로 설계했다 .
1. 개발동기 및 목표
- 어린이 보호구역 및 노인보호구역과 같은 사회적 약자들의 보호 강책 강화
- 객체 인식을 통해 특정 구역에 접근하는 사람 또는 차를 감지하고 경고 신호를 출력하는 IoT 시스템 구현
- Jetson Xavier를 사용한 시스템 구현 -> 웹캠으로 실시간 Ai 객체 인식을 사용하고 팬스의 LED와 음성 센서를 사용해야 하므로 하드웨어 가속인 CUDA 를 사용할 수 있고, 고성능을 가진 Jetson 시리즈를 선택했다.
2. 사용 기술 및 구현 과정
사용한 기술 스택
사용기술 설명 Jetson Xavier YOLOv4 실행 및 실시간 객체 감지를 위한 GPU 기반 SoC. CUDA를 활용해 하드웨어 가속 처리 Ubuntu 20.04 안정성과 호환성이 뛰어난 Jetson Xavier 기본 OS로, YOLOv4 실행 환경 구축 OpenCV YOLOv4 객체 탐지 후 경계 상자 그리기, 이미지 전처리 및 출력 처리 담당 Python YOLOv4 및 OpenCV4연동을 위한 프로그래밍 언어 Linux
- Jetson Xavier 환경에서 Ubuntu 20.04기반으로 개발 진행 - > Ubuntu 20.04 와 22.04중에 고민했다. 일단 20.04는 오래된 버전으로 구글링 했을때 나오는 도움이 되는 개발자들의 질의응답이 많았다(Stackoverflow, github 등) 또한 호환성이 20.04버전이 더 좋다고 생각했다. 아무래도Jetson Xavier를 사용하는 것은 처음이므로 성능보다 호환성 및 예시 코드가 많은 버전을 선택했다.
OpenCV4,YoloV4(Darknet 프레임워크)
- 사전 학습된 YOLOv4 모델(DNN 모듈 기능 강화)을 사용해 객체를 인식하고,연동하여 실시간 객체 탐지 구현 -> YOLOv4 + OpenCV를 연동하여 실행하면 웹캠을 사용해 실시간 AI 객체 인식이 가능하다.
사용한 데이터셋은 기본 데이터셋에 차,사람 만 나오도록 만든 데이터셋이고, 객체 인식 경계 상자는 기본 경계 상자를 썻다. Darknet 은 다음 링크의 버전을 사용했고 (AlexeyAB https://github.com/AlexeyAB/darknet) 객체 인식 FPS 테스트를 한다. 그후 Opencv를 설치했다.
Opencv는 기본 Opencv와 Openc_contrib 두개 를 다운받았다
wget -O opencv.zip https://github.com/Itseez/opencv/archive/x.x.0.zip wget -O opencv_contrib.zip https://github.com/Itseez/opencv_contrib/archive/x.x.0.zip
contirb는 Opencv의 실험적 기능과 고급 기능이 포함된 추가 모듈이다. 만약 얼굴 인식 기능 또는 객체 전송을 쓸때를 대비 하여 같이 설치하였다. 설치할때 버전 고를떈 x.x.0의 숫자만 바꾸면 된다.
그리고 darknet 대비 Opencv 환경을 성정할때는 cmake를 사용하였다
cmake -D CMAKE_BUILD_TYPE=Release \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D WITH_CUDA=ON \ -D WITH_CUDNN=ON \ -D OPENCV_DNN_CUDA=ON \ -D CUDA_ARCH_BIN=x.x \ -D WITH_OPENGL=ON \ -D BUILD_EXAMPLES=OFF \ -D BUILD_TESTS=OFF \ -D BUILD_opencv_python3=ON \ -D OPENCV_EXTRA_MODULES_PATH=/path/to/opencv_contrib/modules \ ..
cmake시 \ 를 해야 정상적인 설정이 되므로 빠지면 안된다. 프로젝트에서 CUDA와 CUDNN을 사용하므로
WITH_CUDA, WITH_CUDNN 은 ON으로 사용한다.
그후 설정이 완료되면 Configuring done , Generating done 이 뜨고 그 위에 내가 설정한 옵션이 뜬다 만약 여기서 내가 설정했는데 정상적으로 안된경우 다시 해야한다. (실제로 겪은 오류 -> CUDA, CUDNN = ON 했지만 cmake 후 옵션을 보니 CUDA = NO
CUDNN =NO
되어 있었다)그후 make를 하여 컴파일을 진행한다 시간이 오래걸리니 해놓고 밥을 먹던가 쉬면된다.
마지막 YOLO v4 모델은 구글링 해서 가중치(weights),모델 구성 파일 (cfg), 데이터셋은 기본적인 coco.data, coco.name 사용했다. 만약을 대비하여 YOLOv4 - tiny 모델도 받아놨다 (기본 YOLOv4 모델보다 객체 인식률을 줄인대신 가벼워진 모델)
Python을 이용한 연동
- Python를 이용하여 YOLO 모델 설정 후 웹캠 입력 포트를 읽고, 선을 그린뒤 선과 겹치는지 검사 마지막으로 화면 출력 해주면 된다.
Python를 이용한 코딩은 여러 자료를 참고하여 구현했다.
YOLO v4 , Opencv를 이용해서 간단한 위치판독기 만들기 : [https://keyog.tistory.com/m/23]
OpenCV에서 YOLO 가중치 가져오기 :[https://blueberry-kyu.tistory.com/13]
프로젝트 코드 및 ReadME 파일은 GitHub 링크에 정리되어 있다.
https://github.com/xdada-bang/mygit/tree/master/Smart_pense
mygit/Smart_pense at master · xdada-bang/mygit
Contribute to xdada-bang/mygit development by creating an account on GitHub.
github.com
할일은 끝났지만 예상치도 못한 오류가 나왔다.
net = cv2.dnn.readNet(weights_path, config_path) net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA) net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA) #CUDA 사용 설정 및 Net 설정
에서 CUDA 사용 에러가 떳다
정확히는 CUDA 사용이 안되서 1~5프레임이 나왔다.
여기서 우리는 CUDA 경로 설정을 해봤고 그후엔 CUDA 경로를 찾을수 없다는 오류가 나왔다.
또 우리는 전부 삭제 후 다시 설치(Opencv4가 가장 오래걸렸다) 똑같은 CUDA 미사용이 나왔고
또또 우리는 Jetson Xavier 초기화(Jetpack을 이용한 CUDA, cuDNN 재설치) 그 후 Python3,Opencv4 및 필수 패키지를 다시 다운 받은뒤에 해본결과 이번엔 Opencv4 cmkae 설정에서 CUDA를 찾을수 없다는 것도 보았다.
구글링해서 여러 사이트(블로그,StackOverflow,Nvidia 포럼등)을 찾아 솔루션을 따라해보고 안되면 초기화 하고...
를 반복하다보니 점점 H/W가 이상해지는 것같았다. OS가 설치된 SSD를 인식하지 못하던가 CUDA, cuDNN 설치는 아예 안되었다.
결국 미봉책으로 특정 선에 가져다 되면 인식된 종류에 따라 신호 출력에서 경량화된 Yolov4-tiny를 사용하고 사용한 data 에 있는 물체만 전부 인식으로 노선을 틀었다. 하지만 이래도 FPS가 10정도라 우리가 원하는 실시간 인식 프레임에는 도달 하지못했다. 적어도 실기간 인식이라고 하면 15~30정도는 나와야 했다.
그래서 해상도를 최소한으로 줄였다. 720 -> 360 그러자 프레임이 30~40 정도로 나왔다.
프로젝트 개요 시연장면 3. 결과 및 성과
-Opencv4, YOLOv4를 사용하여 특정 객체를 90% 이상의 정확도로 구분하는데는 성공했다.
-CUDA가 비활성화 되어 CPU 기반 YOLOv4 실행으로 프레임이 5FPS 이하 였지만 최적화 후 15FPS 의 실시간 인식으로 개선했다.
- 비록 완전한 구현에는 이르지 못했지만, YOLOv4와 OpenCV를 활용한 객체 탐지와 경계선 설정 과정에 대해 학습하고 이를 기반으로 문제를 해결할 수 있는 접근 방식을 마련했다 .
4. 후기
프로젝트에는 S/W팀으로 참여했다. AI를 하는 유일한 팀원으로 선택된 이유는 팀원중에서 코딩을 제일 잘해서 이다...
그전 까지는 AI하면 ChatGPT밖에 몰랐었다.
아무래도 1년이나 늦은 후기지만 지금도 계속 생각해보면 너무 미흡한 부분이 많았다. 그 부분을 감안해서 후기를 적어본다
1. 프로젝트를 할때 가상 환경(예:아나콘다)를 썻으면 오류가 안나왔을 것같다.
-> 하드웨어 초기화에 너무 많은 시간을 사용했다. 그리고 첫번째 시도 때 안됬을때는 원래 다른팀이 사용한다고 설치한 다른 버전 호환성 문제 였던것 같다. 만약 가상 환경 설치하고 테스트를 시도했으면 시간과 공간 그리고 호환성 의존성 문제를 효과적으로 해결할수 있었을것이다..
2.Jetson Xavier를 안써도 됬을것같다.
->첫 프로젝트이자 졸업 작품이 될것이었는데 굳이 어려운 Soc , 임베디드 컴퓨터 모듈 써야됬을까? 이다.
esp32라던가 stm32라던가, 만약 꼭 써야됬으면 컴퓨터 모듈을 써야 된다면 라즈베리 파이를 쓰는게 낫다고 생각한다.
일단 Jetson Xavier는 이 프로젝트하면서 처음 들었고, 기본 세팅 및 보드 설정 보는데 1달 이상 사용 한것 같다. (아무래도 수업 받으면서 시간을 내서 짤막짤막하게 공부했다)
무엇보다 Jetson Xavier CUDA 및 TensorRT 사용 할때 프로그래밍이 너무 어려웠다.
하지만 참고할 자료가 마땅히 없었다. 아두이노 라던가 라즈베리 파이는 참고할 자료가 많은거에 대비 된다.
'프로젝트' 카테고리의 다른 글
해커톤 ESP32를 활용한 Bluetooth 통신 구현 (0) 2025.01.29