YOLO와 Darknet Framework를 이용하여 객체 감지를 구현해보자.
1. Darknet 설치 및 Compile
필자는 WSL 환경을 기준으로 실습을 진행한다. gcc, make, opencv 라이브러리 등 컴파일러, 의존성 파일을 다운로드한다.
sudo apt update
sudo apt install build-essential
sudo apt install libopencv-dev
GitHub - AlexeyAB/darknet: YOLOv4 / Scaled-YOLOv4 / YOLO - Neural Networks for Object Detection (Windows and Linux version of Da
YOLOv4 / Scaled-YOLOv4 / YOLO - Neural Networks for Object Detection (Windows and Linux version of Darknet ) - AlexeyAB/darknet
github.com
이후 YOLOv4를 지원하는 Darknet 레포지토리를 클론해온다.
git clone https://github.com/AlexeyAB/darknet
Clone 해온 Darknet 레포지토리 내부의 makefile을 실행하여 컴파일을 진행한다.
2. YOLOv4 가중치 로드 및 객체 감지
컴파일이 정상적으로 완료된 후에는 ./darknet 실행 파일이 생성된다. 객체 감지를 위해서는 학습된 가중치를 로드해야한다. 하기 코드를 이용해 YOLOv4의 Weight를 다운로드한다.
git clone https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights
이후 yolov4.cfg와 yolov4.weights를 로드하여 객체 이미지를 탐지한다. Sample 이미지는 data/ 디렉토리에서 제공된다.
./darknet detect cfg/yolov4.cfg yolov4.weights data/person.jpg
/*
"./darknet": Darknet 프레임워크의 실행 파일을 실행
"detect": 단일 이미지에 대해 객체 탐지를 수행하는 명령어
"cfg/yolov4.cfg": YOLOv4 모델의 구성 파일 경로입니다. 이 파일은 신경망의 구조를 정의
"yolov4.weights": 사전 훈련된 YOLOv4 모델의 가중치 파일
"data/eagle.jpg": 객체 탐지를 수행할 대상 이미지 파일의 경로
*/
141 conv 256 3 x 3/ 2 76 x 76 x 128 -> 38 x 38 x 256 0.852 BF
...
Total BFLOPS 128.459
avg_outputs = 1068395
/*
** conv: 컨볼루션 레이어.
** 256: 출력 채널 수.
** 3 x 3: 커널 크기.
** /2: 다운샘플링(스트라이드=2).
** 76 x 76 x 128 -> 38 x 38 x 256: 입력 텐서 크기 → 출력 텐서 크기.
** 0.852 BF: 해당 레이어의 연산량(BFLOPS, Billion Floating Point Operations).
** Total BFLOPS: 네트워크 전체의 연산량은 128.459 BFLOPS (모델이 얼마나 많은 계산을 수행하는지 나타내며, 모델의 복잡도를 의미함)
** avg_outputs: 네트워크의 평균 출력 값 수
/*
Detection layer: 139 - type = 28
Detection layer: 150 - type = 28
Detection layer: 161 - type = 28
/*
YOLOv4는 총 3개의 탐지 레이어를 사용하며, 각 탐지 레이어는 서로 다른 스케일에서 객체를 탐지함.
** 139번 레이어: 작은 객체 탐지 (76x76 feature map).
** 150번 레이어: 중간 크기 객체 탐지 (38x38 feature map).
** 161번 레이어: 큰 객체 탐지 (19x19 feature map).
*/
data/person.jpg: Predicted in 11965.228000 milli-seconds.
dog: 99%
person: 100%
horse: 98%
/*
입력 이미지 파일(data/person.jpg)에서 객체 탐지를 수행결과를 나타냄
** 탐지된 클래스와 신뢰도:
dog: 신뢰도(확률) 99%.
person: 신뢰도 100%.
horse: 신뢰도 98%.
*/
3. 영상에서의 객체인식
영상에서 객체 처리를 하고, 이를 저장하기 위해서는 OpenCV 라이브러리를 사용하여야 한다. 우선 Makefile에서 아래와 같이 OPENCV를 활성화시킨 후, Darknet을 다시 컴파일한다.
GPU=0
CUDNN=0
CUDNN_HALF=0
OPENCV=1
AVX=0
OPENMP=0
LIBSO=0
ZED_CAMERA=0
ZED_CAMERA_v2_8=0
# set GPU=1 and CUDNN=1 to speedup on GPU
# set CUDNN_HALF=1 to further speedup 3 x times (Mixed-precision on Tensor Cores) GPU: Volta, Xavier, Turing, Ampere, Ada and higher
# set AVX=1 and OPENMP=1 to speedup on CPU (if error occurs then set AVX=0)
# set ZED_CAMERA=1 to enable ZED SDK 3.0 and above
# set ZED_CAMERA_v2_8=1 to enable ZED SDK 2.X
USE_CPP=0
DEBUG=0
ARCH= -gencode arch=compute_50,code=[sm_50,compute_50] \
-gencode arch=compute_52,code=[sm_52,compute_52] \
-gencode arch=compute_61,code=[sm_61,compute_61]
OS := $(shell uname)
하기 코드는 Darknet 프레임워크에서 YOLOv4 모델을 사용해 video_street.mp4 비디오 파일을 분석하고, 객체 탐지 결과를 video_street_result.avi라는 파일로 저장하는 코드이다.
./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights -dont_show ../video_street.mp4 -i 0 -out_filename ../video_street_result.avi
/*
./darknet: Darknet 실행 파일을 실행
detector demo: Darknet의 "탐지기" 모드를 실행하며, "demo"는 비디오나 실시간 피드를 처리해서 객체 탐지 결과를 보여줌.
cfg/coco.data: 데이터 설정 파일(예: COCO 데이터셋용)로, 클래스와 경로 등을 정의
cfg/yolov4.cfg: YOLOv4 모델의 설정 파일로, 네트워크 구조를 정의
yolov4.weights: YOLOv4의 사전 학습된 가중치 파일
-dont_show: 화면에 결과 창을 표시하지 않도록 설정
../video_street.mp4: 처리할 입력 비디오 파일
-i 0: 입력 인덱스를 지정(0은 일반적으로 첫 번째 입력 소스, 예: 비디오 파일 또는 기본 카메라를 의미).
-out_filename ../video_street_result.avi: 탐지 결과가 포함된 처리된 비디오를 저장할 출력 파일 경로와 이름을 지정
*/
'이론 공부 > COMPUTER VISION' 카테고리의 다른 글
Computer Vision - YOLO(You Only Look Once) (0) | 2025.03.05 |
---|---|
Computer Vision - LAB 06. Image Classification (CNN) (0) | 2025.02.27 |
Computer Vision - Basic Knowledge of CNN (0) | 2025.02.27 |
Computer Vision - LAB 05. Image Classification (OpenCV, Keras) (0) | 2025.02.24 |
Computer Vision - Basic Knowledge of Neural Network (0) | 2025.02.18 |