인공지능과 컴퓨터 비전 기술
인공지능

인공지능(Artificial Intelligence, AI)은 인간의 사고 과정을 모방하여 다양한 문제를 해결하는 기술입니다. 불량품을 판별하거나 그림을 그리고 길을 찾는 등 인간의 판단과 노력이 필요한 작업을 자동화할 수 있습니다. 인공지능은 머신러닝(Machine Learning), 딥러닝(Deep Learning), 자연어 처리(NLP) 등 다양한 기술을 결합해 활용되며, 복잡한 문제를 해결하는 데 점점 더 중요한 역할을 하고 있습니다.
컴퓨터 비전
컴퓨터 비전(Computer Vision, CV)은 인공지능의 한 분야로, 컴퓨터가 이미지나 영상에서 의미 있는 정보를 이해하고 해석하는 기술입니다. 인간의 시각적 인지 능력을 모방하여 물체, 패턴, 텍스트, 색상, 움직임 등을 분석할 수 있습니다.
사람이 눈으로 이미지를 보고 이해하는 것과 달리, 컴퓨터는 이미지를 숫자로 변환해 읽고 처리합니다. 예를 들어, OpenCV와 같은 이미지 처리 라이브러리에서는 이미지를 BGR(Blue, Green, Red) 형태의 숫자 배열로 표현합니다. 각 색상은 0에서 255 사이의 값으로 나타나며, 컴퓨터는 이 값을 기반으로 흰색과 검은색 같은 색상을 구분합니다.
- 흰색 이미지는 모든 픽셀이
[255, 255, 255]로 채워진 배열로 나타납니다. - 검은색 이미지는 모든 픽셀이
[0, 0, 0]으로 채워진 배열로 표현됩니다.
# 흰색 이미지
[[[255 255 255]
[255 255 255]
...
[255 255 255]]
...
[[255 255 255]
[255 255 255]
...
[255 255 255]]]
# 검은색 이미지
[[[0 0 0]
[0 0 0]
...
[0 0 0]]
...
[[0 0 0]
[0 0 0]
...
[0 0 0]]]
이처럼, 숫자로 표현된 이미지를 기반으로 컴퓨터가 정보나 물체를 인식하고 찾을 수 있도록 만드는 것이 컴퓨터 비전 기술의 핵심입니다.
컴퓨터 비전의 종류
컴퓨터 비전 기술은 대표적으로 객체 탐지(object detection), 객체 분할(object segmentation), 이미지 분류(image classification) 등의 분야로 나뉩니다.
객체 탐지: 이미지에서 객체의 위치와 크기를 검출하는 기술객체 분할: 이미지에서 객체의 경계를 추출하여 분할하는 기술이미지 분류: 이미지를 분류하여 다른 이미지와 구분하는 기술

YOLO

YOLO는 You only look once의 줄임말로, 빠르고 정확한 비전 인식 알고리즘 중 하나입니다. 자율주행, 영상 감시, 의료 영상 분석 등 실시간 객체 탐지가 필요한 다양한 분야에서 널리 사용되고 있습니다. YOLO라는 이름을 이해하기 위해선 기존의 비전 인식 알고리즘에 대해서 간단하게 알아볼 필요가 있습니다.
YOLO가 등장하기 전, 비전 인식 알고리즘은 다음과 같은 두 단계를 거쳤습니다.
- 이미지 탐색 및 후보군 선정: 이미지에서 객체가 있을 것으로 예상되는 영역을 찾아내는 단계.
- 객체 분류: 선정된 후보군들을 분석해 객체의 종류를 분류하는 단계.
이처럼 두 단계로 이루어진 방식을 Two-stage 방식이라고 합니다. R-CNN, Fast R-CNN과 같은 알고리즘이 대표적입니다.
YOLO는 이름에서 유추할 수 있듯이, 한 번의 단계로 객체를 탐지하는 One-stage 방식의 알고리즘입니다. One-stage 방식은 이미지의 특징을 추출하여 단일 탐색 과정에서 객체의 위치와 종류를 동시에 찾아냅니다. 이러한 방식은 속도가 빠르다는 장점이 있지만, 정확도가 낮다는 단점으로 인해 초기에는 잘 사용되지 않았습니다.
그러나 YOLO의 지속적인 발전을 통해 정확도가 크게 개선되었으며, 최근 버전들에서는 속도와 정확도를 모두 만족시키는 강력한 객체 탐지 알고리즘으로 자리 잡았습니다.


YOLOv8
YOLOv8은 속도와 정확도의 균형이 잘 맞아 다양한 환경에서 널리 사용되는 YOLO 시리즈의 대표적인 버전 중 하나입니다. PyTorch, ONNX, TensorRT 등 다양한 형식을 지원하며, SBC(Single Board Computer)와 같은 저사양 장치에서도 동작할 수 있도록 최적화된 구조를 가지고 있습니다.
최근 출시된 YOLO 버전들도 많지만, YOLOv8은 가벼운 구조와 안정성 덕분에 여전히 자율주행, 영상 감시, 드론 분석 등에서 많이 활용되고 있습니다. 다양한 형식으로 손쉽게 배포할 수 있는 유연성 또한 큰 장점입니다.
YOLOv8은 모델의 복잡도에 따라 5가지로 세부 모델을 구분합니다. 제한된 메모리와 연산 자원을 가진 소형 SBC에서는 가장 작은 복잡도인 Nano 모델을 주로 사용합니다.

데이터셋


데이터셋(Dataset)은 특정 작업을 위해 관련 데이터를 구조화하여 모은 집합으로, 텍스트, 이미지, 영상, 소리 등 다양한 형태의 데이터를 포함할 수 있습니다. 인공지능 학습에 사용되는 데이터는 AI 훈련 데이터(AI Training Data)라고도 부릅니다. 대표적인 AI 훈련 데이터셋으로는 다음과 같은 공개 데이터셋이 있습니다.
- MNIST: 손글씨 숫자 이미지 데이터셋으로, 숫자 인식 모델 학습에 주로 사용됩니다.
- ImageNet: 다양한 카테고리의 이미지 데이터셋으로, 이미지 분류 모델 학습에 활용됩니다.
- COCO: 객체 탐지 및 이미지 세그먼테이션 학습을 위한 데이터셋입니다.
인공지능 학습용 데이터셋의 조건
인공지능 학습에 사용되는 데이터셋은 다음과 같은 조건을 만족해야 합니다.
- 개발하려는 인공지능의 목적과 부합해야 함
- 저작권 등 법적 문제가 없어야 함
- 다양하고 충분한 양의 데이터를 포함해야 함
- 일관된 품질의 데이터여야 함
대부분의 경우, 위의 조건을 충족하는 데이터셋을 찾기가 어렵습니다. 이런 상황에서는 직접 데이터를 수집한 후, 정제하고 라벨링 작업을 통해 필요한 데이터셋을 생성할 수 있습니다.
커스텀 데이터셋 생성하기
공개 데이터셋 중에서 목적에 맞는 데이터가 없다면 직접 데이터를 수집하고 편집하여 커스텀 데이터셋을 만들 수 있습니다. 이번에는 9가지 도킹 표식의 객체 탐지 인공지능을 제작하기 위한 이미지 데이터셋을 생성해 보겠습니다.
이미지 수집하기
먼저, 데이터셋의 바탕이 될 이미지를 수집해야 합니다. 이미지는 목적과 대상에 따라 아래와 같은 다양한 방법으로 수집할 수 있습니다.
- 웹 스크래핑: Google, Naver 등에서 필요한 이미지를 검색하여 다운로드합니다.
- 공개 데이터셋 활용: COCO, ImageNet, Open Images 등 공개된 데이터셋에서 일부 데이터를 선별합니다.
- 직접 촬영: 카메라를 사용해 특정 환경에서 데이터를 직접 수집합니다.
실제 사용 환경과 비슷한 다양한 조건의 이미지를 확보하기 위해 직접 촬영한 이미지를 활용해 보겠습니다.
이미지 정제하기
수집한 이미지를 확인하며, 목적에 맞지 않거나 품질이 낮은 이미지를 제거합니다.
- 중복 데이터를 확인하고 삭제합니다.
- 흐리거나 왜곡된 이미지를 제외합니다.
- 다양한 조명, 배경, 크기를 포함한 데이터를 선택해 모델이 다양한 상황을 학습할 수 있도록 구성합니다.
이미지 라벨링
라벨링(Labeling)은 인공지능 모델이 학습할 수 있도록 데이터에 정보를 추가하는 과정입니다. 이미지 데이터를 라벨링 할 때는 이미지 내 객체의 위치를 경계 상자(Bounding Box)로 지정하고 라벨을 부여합니다.
직접 좌표를 작성하기에는 어렵고 번거롭기 때문에, LabelImg나 Roboflow 같은 도구를 사용하는 경우가 많습니다.
- LabelImg: 간단한 경계 상자 생성과 라벨링 작업 지원.
- Roboflow: 라벨링 작업 외에 데이터셋 관리 및 변환 기능도 제공.
라벨링 결과는 학습시킬 모델의 종류에 따라 다른 형식으로 저장됩니다. YOLOv8의 경우, 라벨링 정보는 텍스트 파일(.txt)로 저장되며, 각 파일에는 다음과 같은 구조가 포함됩니다.
0 0.5 0.5 0.3 0.4
(클래스 ID, 중심 좌표x, 중심 좌표y, 너비, 높이)
YOLOv8은 이러한 라벨링 정보가 저장된 텍스트 파일의 경로를 YAML 파일로 전달하여 모델이 학습할 수 있도록 설정합니다. 라벨링은 데이터셋의 품질을 결정짓는 중요한 단계로, 작업의 정확도가 높을수록 모델의 성능도 개선됩니다.
Roboflow로 커스텀 데이터셋 생성하기
이번에는 커스텀 데이터셋을 만들기 위해 Roboflow를 사용해 보겠습니다. Roboflow는 웹 브라우저에서 이미지 업로드, 라벨링, 데이터셋 분할, YOLO 형식 내보내기를 한 번에 진행할 수 있어 객체 탐지 데이터셋을 준비할 때 편리합니다.
1. 회원가입 및 워크스페이스 생성
작업이 편한 컴퓨터를 사용해 Roboflow에 접속합니다. 우측 상단의 버튼을 눌러 회원가입 또는 로그인을 진행합니다.

워크스페이스 이름을 입력하고 Public Plan을 선택한 후 워크스페이스를 생성합니다. Public Plan에서는 데이터셋과 모델이 공개될 수 있으므로, 민감한 데이터는 업로드하지 않도록 주의해야 합니다.

최대 2명의 팀원을 초대할 수 있습니다. 분업을 위해 팀별로 하나의 워크스페이스를 생성하여 인공지능을 담당할 팀원을 초대합니다.

2. 프로젝트 생성 및 이미지 업로드
라벨링을 진행하기 위한 프로젝트를 생성합니다. 프로젝트 종류를 객체 탐지(Object Detection)로 설정하고 필요한 정보를 입력합니다.


생성한 프로젝트를 클릭하여 라벨링할 이미지를 업로드합니다. 필요하다면 유튜브 영상에서 이미지를 추출해 업로드할 수도 있습니다.
부표, 도형 등 주행 미션에 필요할 수 있는 이미지 자료가 필요할 경우 아래의 파일을 다운로드하여 사용할 수 있습니다.


3. 라벨링
이미지를 눌러 라벨링을 진행합니다. Roboflow에서는 팀원간에 작업을 분담할 수 있는 기능을 지원합니다. 라벨링 기준을 명확히 정하고 클래스 이름을 통일하여 작업 간 일관성을 유지해야 합니다.



4. 데이터셋 분할 및 다운로드
데이터셋을 train / validation / test로 나눕니다. 일반적으로 70 / 20 / 10 비율을 권장합니다. 사용 가능한 이미지가 100장 미만으로 적을 경우, Split Images Between Train/Valid/Test 옵션 대신 Add All Images to Training Set 옵션을 사용하는 것도 고려해볼 수 있습니다. 다만, 이는 권장하지 않습니다.

학습 과정에서는 이미지를 지정한 입력 크기에 맞춰 변환합니다. resize 크기를 설정한 후, Generate 버튼을 눌러 데이터셋을 생성합니다. 이미지 크기는 일반적으로 성능과 효율성의 균형을 맞춘 640x640 사이즈를 권장합니다.

완성된 데이터셋은 Download Dataset 버튼을 눌러 외부에서 사용할 수 있습니다. YOLOv8 형식으로 데이터를 다운로드하고 제공된 API 코드를 복사해 활용할 수 있습니다. 다운로드 화면 우측 상단 버튼을 누르면 코드를 복사할 수 있습니다.



Google Colab
Google Colab은 Google에서 서비스중인 무료 Jupyter 기반 가상 개발 환경으로, Google 계정만 있으면 누구나 이용할 수 있습니다. 무료 계정에서도 딥러닝 모델 훈련이나 데이터 분석을 위한 GPU 및 TPU를 제한적으로 사용할 수 있으며, 사전 설치된 라이브러리 덕분에 별도의 환경 설정 없이 작업을 시작할 수 있습니다.
또한, Google Drive와 쉽게 연결되어 데이터와 코드를 간편하게 저장하고 공유할 수 있습니다. 대용량 데이터를 저장하거나 여러 장치에서 동일한 파일에 접근할 때 특히 유용합니다.
다만, 무료 계정에서는 GPU/TPU 사용 가능 여부와 사용 시간이 상황에 따라 달라지며, 유휴 상태나 사용량 제한으로 런타임이 종료될 수 있습니다. 이를 방지하려면 작업 중간에 자주 저장하거나 Google Drive를 활용해 데이터를 백업하는 것이 좋습니다.
Google Colab으로 모델 훈련하기
모델 평가하기
사람들이 학습 과정에서 잘못된 것을 새롭게 공부하고, 헷갈리는 부분을 복습하며 보완하는 것처럼, 인공지능도 여러 번 학습을 반복하며 성능을 개선해 나갑니다. 이를 위해 인공지능의 성능을 평가하고 개선이 필요한 부분을 파악하는 과정이 필요합니다.
인공지능은 그 목적과 기능이 다양해 절대적인 평가 기준이 없으며, 보편적으로 사용되는 몇 가지 평가 방법이 존재합니다. 대표적으로 mAP(Mean Average Precision)와 Loss에 대해 알아보겠습니다.
mAP(Mean Average Precision)
mAP는 각 클래스에 대한 AP(Average Precision)를 계산해 평균을 낸 값입니다.
AP(Average Precision)는 모델의 정밀도(Precision)와 재현율(Recall)을 기반으로 계산된 지표로, 특정 클래스에 대한 탐지 성능을 측정합니다. mAP는 AP를 모든 클래스에 대한 평균을 구해 모델이 전체적으로 얼마나 정확히 탐지하고 분류하는지 나타냅니다. 즉, mAP 값이 클수록 모델의 탐지 성능이 우수하다고 판단할 수 있습니다.
Colab의 학습 과정에서 TensorBoard를 사용하면 실시간으로 mAP 그래프를 확인할 수 있습니다.
Loss
훈련 과정에서는 Loss도 중요한 지표로 사용됩니다.
Loss는 모델의 예측값과 실제값 간의 차이를 수학적으로 표현한 값으로, 값이 작을수록 예측이 더 정확함을 의미합니다. 훈련이 잘 진행된다면 Loss 값은 점차 감소하게 됩니다.
하지만, 훈련 데이터에 대해 과도하게 반복 학습할 경우, 훈련 데이터(train)의 Loss는 줄어들지만 검증 데이터(validation)의 Loss는 늘어나는 과적합(Overfitting) 현상이 발생할 수 있습니다. 과적합된 모델은 수치상으로는 성능이 좋아 보이지만, 실제 사용 환경에서는 객체를 제대로 탐지하지 못할 가능성이 큽니다.
TensorBoard를 통해 mAP와 Loss 그래프를 실시간으로 확인하며, 검증 성능이 더 이상 개선되지 않거나 검증 데이터의 Loss가 다시 증가하는 시점에서 훈련을 중지하는 것이 좋습니다.
과적합의 해결 방법
과적합을 방지하거나 해결하기 위해 다음과 같은 방법을 시도할 수 있습니다.
- 데이터 증강 : 다양한 데이터 변형(회전, 밝기 조정 등)을 통해 데이터 다양성을 확보합니다.
- 훈련 데이터 확장 : 추가적인 데이터를 수집하거나, 기존 데이터를 가공하여 학습에 활용합니다.
- 적절한 학습 중지 : TensorBoard를 활용해 최적의 성능을 보이는 시점에서 훈련을 중단합니다.
mAP와 Loss는 인공지능 모델의 성능을 평가하는 대표적인 지표로, 훈련 과정에서 매우 중요한 역할을 합니다. 하지만, 지표만으로는 실제 사용 환경에서의 성능을 완벽히 평가하기 어렵기 때문에, 훈련된 모델을 다양한 상황에서 테스트하고 결과를 직접 검토하는 것이 중요합니다.
RKNN
RKNN은 Rockchip Neural Network의 약자로, 중국의 SoC(System-on-Chip) 제조사인 Rockchip에서 제공하는 AI 추론 프레임워크와 도구들을 말합니다. Rockchip이 만든 NPU(Neural Processing Unit)를 활용해 훈련된 딥러닝 모델을 변환하고 실행하기 위해 사용합니다.

PyTorch, ONNX, TensorFlow 등 다양한 프레임워크의 모델을 변환할 수 있다는 장점이 있지만, 지원되는 연산자가 한정적이기 때문에 변환하려는 모델이 RKNN에서 지원하는 연산자로 구성되었는지 확인해야 합니다. 또한, 효율적인 추론을 위해 일반적인 모델과 다른 구조를 권장하기 때문에 직접 훈련한 YOLOv8 모델을 사용하기 위해선 별도의 변환 과정이 필요합니다.
RKNN 모델 변환
의존성 설치하기
RKNN 형태의 모델로 변환하기 위해 Ubuntu PC에 rknn-toolkit2와 필요한 의존성 패키지를 설치합니다.
rknn-toolkit2설치하기
cd ~
git clone https://github.com/airockchip/rknn-toolkit2.git --depth=1
rknn_converter설치하기
cd ~
git clone https://github.com/mechasolution/rknn_converter.git --depth=1
- 파이썬 venv 생성 및 활성화하기
cd ~/rknn_converter
python3 -m venv rknn_env
source ~/rknn_converter/rknn_env/bin/activate
- 의존성 설치하기
sudo apt install python3-dev python3-pip gcc python3-opencv python3-numpy -y
pip3 install -r ~/rknn-toolkit2/rknn-toolkit2/packages/x86_64/requirements_cp312-2.3.2.txt
pip3 install ~/rknn-toolkit2/rknn-toolkit2/packages/x86_64/rknn_toolkit2-2.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
pip3 install torch==2.4.0 torchvision==0.19.0 onnx==1.18.0
모델 변환하기
학습한 모델을 사용하기 위해선 pt > onnx > rknn 순으로 모델을 변환해야 합니다. 모델을 변환하기 위해선 보다 복잡한 과정을 거쳐야 하지만 현재 환경에서 쉽게 사용할 수 있도록 자동화 스크립트를 작성해 두었습니다. 스크립트를 다운받고 실행해 보겠습니다.
스크립트를 다운받은 후 Colab에서 학습이 완료된 pt 형식의 모델을 Ubuntu PC에 다운로드합니다. 홈 폴더의 rknn_converter 폴더 안에 모델 파일을 옮겨둡니다.
#!/bin/bash
MODEL="best.pt" # <<< 수정합니다
# ---------- pt → onnx ----------
....
convert.sh 파일 상단의 설정을 편집한 후 실행하여 pt 모델을 rknn 모델로 변환합니다. best.pt 라는 이름의 파일로 다운받았다면 추가적인 수정 없이 실행해도 괜찮습니다.
cd ~/rknn_converter
sh convert.sh
deactivate
변환이 완료되었다면 기존의 모델 파일과 동일한 이름의 rknn 형식의 모델 파일이 새로 생성됩니다. 이 파일을 SBC의 mechaship_yolov8 패키지의 model 폴더 안에 복사해서 사용하면 됩니다.
RKNN 모델 실행
설정 파일 수정하기
mechaship_yolov8의 param 폴더 안에는 인공 지능 동작과 관련된 설정 파일이 포함되어 있습니다. 설정 파일은 coco 기본 예제를 실행하도록 설정되어 있으니, 새로운 모델을 복사해 두었다면 실행하기 전에 설정 파일을 수정해 새로운 모델을 실행하도록 수정해야 합니다.
/detect_node:
ros__parameters:
image_topic: "/image_raw/compressed"
model_params:
rknn_model: "yolov8.rknn" # <<< 수정합니다
label: "labels.txt"
img_size: 640
conf: 0.5 # Confidence threshold
iou: 0.8 # IOU threshold
fps: 10 # fps limit
enable: True
객체 탐지 모델의 class가 변경되었다면 labels.txt의 내용도 수정해야 합니다. class가 몇 개 없다면 직접 파일을 수정해도 괜찮지만, class의 종류가 많다면 직접 수정하기 번거로울 수 있습니다. 이럴 때는 모델 학습 과정 중 Drive에 다운로드한 라벨링 데이터에서 data.yaml 파일의 내용을 조금 편집하여 사용하면 편합니다.
실행하기
설정 파일을 수정했다면 코드를 다시 빌드한 후 실행합니다. Rockchip NPU를 활용할 수 있도록 PC가 아닌 로봇에서 실행합니다.
# 로봇에서 실행합니다.
cb
ros2 launch mechaship_bringup mechaship_bringup.launch.py
# 새로운 터미널 창을 열고 로봇에서 실행합니다.
ros2 launch mechaship_yolov8 detect.launch.py
실행 결과 확인하기
객체 인식이 잘 동작하는지 확인하기 위해 Ubuntu PC에서 시각화합니다. 객체 탐지 모델의 class가 변경되었다면 이전에 수정한 내용을 Ubuntu PC에서도 동일하게 진행해야 합니다. 로봇과 PC 모두 동일한 labels.txt 파일을 갖고 있어야 합니다.
아래 코드를 실행하면 이미지와 객체 인식 결과를 확인할 수 있습니다.
# Ubuntu PC에서 실행합니다.
cb
ros2 launch mechaship_yolov8 visualize.launch.py