WEGO LIMO에서 카메라 기반 자율주행과 객체 인식 기능을 구현하려면 딥러닝 모델이 학습할 이미지 데이터가 필요합니다.
이번 글에서는 WEGO LIMO의 ROS2 환경에서 카메라 영상을 수집하고, 수집한 이미지를 주행 판단용 데이터와 객체 인식용 데이터로 구분하여 라벨링하는 과정을 알아보겠습니다.
본 내용은 2026년 3월 3일 이후 업데이트된 딥러닝 패키지를 기준으로 작성했습니다. 이전 버전의 패키지를 사용하고 있다면 먼저 소프트웨어를 최신 버전으로 업데이트한 뒤 진행하는 것을 권장합니다.
1. WEGO LIMO 데이터셋의 종류
WEGO LIMO에서 사용하는 이미지 데이터는 크게 2가지 목적으로 구분됩니다.
1) 주행 판단용 데이터
주행 판단용 데이터는 카메라 영상만 보고 로봇이 어느 방향으로 이동해야 하는지 학습하는 데 사용됩니다.
이미지마다 로봇이 향해야 할 목표 지점의 좌표를 지정하며, 학습된 모델은 입력 이미지에서 주행 목표 좌표를 예측합니다.
주요 활용 예시는 다음과 같습니다.
- 차선 또는 복도 중앙 주행
- 좌회전 및 우회전 방향 판단
- 장애물 회피 방향 결정
- 표지판에 따른 경로 변경
- 실내외 주행 경로 추종
2) 객체 인식용 데이터
객체 인식용 데이터는 이미지 안에 포함된 특정 대상을 찾는 데 사용됩니다.
사람, 차량, 표지판, 장애물 등의 위치를 사각형으로 표시하고 각 객체에 클래스 번호를 지정합니다. 완성된 데이터는 YOLO 객체 검출 모델 학습에 활용할 수 있습니다.
2. 데이터 수집 시스템 구성
WEGO LIMO의 데이터 수집 과정은 ROS2 노드를 기반으로 동작합니다.
전체 시스템은 다음 3가지 요소로 구성됩니다.
| 구성 요소 | 역할 |
|---|---|
| 카메라 노드 | Orbbec 카메라에서 실시간 영상을 발행합니다. |
| 이미지 저장 노드 | 카메라 영상을 수신하고 서비스 요청에 따라 이미지를 저장합니다. |
| ROS2 서비스 요청 | 주행 판단용 또는 객체 인식용 저장 방식을 선택합니다. |
카메라 영상이 정상적으로 발행되는 상태에서 이미지 저장 노드를 실행한 뒤, 별도의 터미널에서 ROS2 서비스를 호출하면 현재 프레임이 파일로 저장됩니다.
3. 카메라 센서 노드 실행
첫 번째 터미널을 열고 WEGO LIMO의 ROS2 워크스페이스로 이동합니다.
cd ~/wego_ws
source install/setup.bash
ros2 launch orbbec_camera astra_stereo_u3.launch.py

명령을 실행하면 Orbbec 카메라 노드가 시작됩니다.
카메라가 정상적으로 연결되어 있는지 확인하려면 다음 명령으로 토픽 목록을 확인할 수 있습니다.
ros2 topic list

필요한 경우 이미지 토픽의 발행 여부도 확인합니다.
ros2 topic hz /camera/color/image_raw

실제 토픽 이름은 카메라 설정이나 실행한 launch 파일에 따라 달라질 수 있습니다.
4. 이미지 저장 노드 실행
두 번째 터미널을 열고 이미지 저장 노드를 실행합니다.
cd ~/wego_ws
source install/setup.bash
ros2 run dl_ros2_application take_a_picture

이 노드는 카메라 이미지를 구독하면서 /photoshoot 서비스 요청을 기다립니다.
서비스가 정상적으로 생성되었는지는 다음 명령으로 확인할 수 있습니다.
ros2 service list


서비스 타입은 다음과 같이 확인합니다.
ros2 service type /photoshoot

정상적인 경우 dl_ros2_msgs/srv/PhotoShoot 타입이 표시됩니다.
5. 주행 판단용 이미지 수집
주행 판단 모델에 사용할 이미지를 저장하려면 chalkak 값을 true로 설정합니다.
cd ~/wego_ws
source install/setup.bash
ros2 service call /photoshoot dl_ros2_msgs/srv/PhotoShoot "{chalkak: true}"






주행 판단용 이미지의 기본 조건은 다음과 같습니다.
- 이미지 크기: 300 × 300
- 저장 위치:
/home/wego/wego_ws/src/dataset/dl_images - 사용 목적: 주행 목표 좌표 예측
- 라벨링 방식: 이미지 위의 목표 지점 클릭
서비스 호출이 성공하면 현재 카메라 프레임이 지정된 디렉토리에 저장됩니다.
같은 위치에서 비슷한 이미지가 반복되지 않도록 로봇의 위치, 각도, 조명, 장애물 배치 등을 조금씩 변경하면서 데이터를 수집하는 것이 좋습니다.
6. 객체 인식용 이미지 수집
YOLO 객체 검출 모델에 사용할 이미지를 저장하려면 chalkak 값을 false로 설정합니다.
cd ~/wego_ws
source install/setup.bash
ros2 service call /photoshoot dl_ros2_msgs/srv/PhotoShoot "{chalkak: false}"





객체 인식용 이미지의 기본 조건은 다음과 같습니다.
- 이미지 크기: 640 × 480
- 학습 이미지 위치:
/home/wego/wego_ws/src/dataset/yolo_images/images/train - 검증 이미지 위치:
/home/wego/wego_ws/src/dataset/yolo_images/images/val - 사용 목적: 객체 위치와 종류 검출
- 라벨링 방식: 바운딩 박스와 클래스 ID 입력
객체 인식 데이터는 학습용과 검증용을 분리해야 합니다.
일반적으로 전체 이미지의 약 80%를 학습용으로 사용하고, 나머지 20%를 검증용으로 구성할 수 있습니다. 데이터 규모와 학습 목적에 따라 70:30 또는 90:10 비율도 사용할 수 있습니다.
7. 데이터 수집 시 주의할 점
딥러닝 모델의 성능은 데이터 수량뿐 아니라 데이터 구성에 큰 영향을 받습니다.
다음 조건을 고려하여 이미지를 수집하는 것이 좋습니다.
1) 다양한 조명 조건
- 밝은 실내
- 어두운 실내
- 햇빛이 강한 환경
- 그림자가 생기는 환경
- 역광이 발생하는 환경
특정 조명에서만 이미지를 수집하면 환경이 바뀌었을 때 인식률이 크게 낮아질 수 있습니다.
2) 다양한 카메라 위치
- 객체와 가까운 거리
- 객체와 먼 거리
- 좌측 또는 우측에 치우친 위치
- 카메라가 약간 기울어진 상태
- 객체의 일부가 화면 밖으로 나간 상태
객체가 항상 화면 중앙에 있는 데이터만 사용하면 실제 주행 환경에서 객체를 놓칠 가능성이 커집니다.
3) 클래스별 데이터 균형
객체 인식 데이터에서는 특정 클래스만 지나치게 많아지지 않도록 주의해야 합니다.
예를 들어 사람 이미지가 2,000장인데 정지 표지판 이미지가 100장뿐이라면 모델이 사람 클래스에 편향될 수 있습니다.
가능하면 클래스별 이미지 수를 비슷하게 구성하고, 부족한 클래스는 추가로 촬영하는 것이 좋습니다.
4) 중복 이미지 제거
연속 촬영으로 거의 동일한 이미지가 많이 저장되면 실제 데이터 수는 많아 보여도 학습에 제공되는 정보는 제한적입니다.
촬영 위치나 각도를 변경하고, 지나치게 유사한 이미지는 학습 전에 정리하는 것이 좋습니다.
8. 주행 판단용 좌표 라벨링
주행 판단용 이미지에는 로봇이 이동해야 할 목표 지점의 좌표를 지정해야 합니다.
라벨링 기준은 다음 질문으로 정리할 수 있습니다.
“현재 카메라 화면을 기준으로 로봇이 어느 지점을 향해야 안전하고 자연스럽게 주행할 수 있는가?”
라벨링 결과는 파일명에 좌표 정보가 포함되는 방식으로 저장됩니다.
파일명 구조는 다음과 같습니다.
Normal_X_Turn_X_Y_Timestamp.jpg
각 항목의 의미는 다음과 같습니다.
Normal_X: 일반 주행 상황에서 선택한 X 좌표Turn_X: 특수 회전 상황에서 선택한 X 좌표Y: 목표 지점의 Y 좌표Timestamp: 이미지가 생성된 시간 정보
예시는 다음과 같습니다.
12_12_137_20260219145823.jpg
이 파일명은 Normal 모드의 X 좌표가 12이고, Turn 모드의 X 좌표가 12이며, Y 좌표가 137이라는 의미입니다.
9. 좌표 라벨링 도구 준비
주행 판단용 좌표 라벨링은 img_lab2 도구를 사용합니다.
운영체제에 맞는 프로그램을 준비합니다.
a. Windows용 이미지 라벨링 프로그램 :
b. Linux용 이미지 라벨링 프로그램
원격 PC의 우분투 설치 환경에서 image_labeler_linux.zip을 Downloads 폴더에 복사하고 압축을 해제합니다.
Limo에서 저장한 dataset 폴더를 압축하여 우분투에 복사합니다.


라벨링 프로그램을 실행한 후 Folder Path 항목에 원본 이미지가 저장된 디렉토리를 입력합니다.
예시는 다음과 같습니다.
/home/wego/wego_ws/src/dataset/dl_images
주행 판단용 라벨링 프로그램은 WEGO LIMO의 상위 제어기에서 직접 실행하는 방식이 아니라, 별도의 외부 PC에서 사용하는 것을 권장합니다.
라벨링할 이미지를 외부 PC로 복사한 뒤 작업하고, 완료된 결과를 다시 학습 환경으로 옮기면 됩니다.
10. Normal 모드와 Turn 모드
주행 판단용 라벨링에서는 하나의 이미지에 대해 2개의 주행 상황을 고려합니다.
- Normal 모드
- Turn 모드
두 모드는 각각 다른 목적을 가지고 있습니다.
1) Normal 모드
Normal 모드는 로봇이 일반적인 상황에서 주행할 때 사용할 목표 좌표를 지정하는 모드입니다.
예를 들어 다음과 같은 상황이 Normal 모드에 해당합니다.
- 직선 복도 주행
- 일반적인 커브 주행
- 장애물이 없는 기본 주행
- 일반적인 실내 이동 환경
이미지를 보면서 로봇이 자연스럽게 이동해야 할 목표 지점을 선택한 후 해당 위치를 클릭합니다.
2) Turn 모드
Turn 모드는 일반적인 주행이 아니라 특정 조건에서 다른 경로 판단이 필요한 경우 사용합니다.
예를 들어 다음과 같은 상황이 있을 수 있습니다.
- 우회전 표지판 인식
- 좌회전 표지판 인식
- 특정 분기점 진입
- 교차로에서 방향 전환
- 특정 객체 또는 조건에 따른 경로 변경
이때 Normal 모드에서 지정한 경로와는 다른 방향의 좌표를 지정할 수 있습니다.
11. Normal 모드 라벨링
Normal 모드는 직진이나 일반적인 곡선 주행처럼 기본적인 주행 상황을 라벨링할 때 사용합니다.
작업 절차는 다음과 같습니다.
- Image_labler_linux 폴더에서 라베링 프로그램을 실행합니다.
- 라벨링 프로그램에서 이미지 디렉토리를 불러옵니다.
- Normal 모드를 선택합니다.
- 현재 이미지에서 로봇이 향해야 할 목표 지점을 클릭합니다.
- 클릭한 좌표가 파일명에 반영되었는지 확인합니다.
- 다음 이미지로 이동하여 같은 작업을 반복합니다.






예를 들어 목표 좌표가 X=12, Y=137이라면 다음과 같은 파일명으로 저장될 수 있습니다.
12_12_137_20260219145823.jpg
Normal 모드만 적용된 단계에서는 Normal X와 Turn X가 동일한 값으로 기록될 수 있습니다.
12. Turn 모드 라벨링
Turn 모드는 우회전 표지판, 좌회전 구간 또는 특정 조건에서 강제 방향 전환이 필요한 경우 사용합니다.
Normal 모드 작업을 완료한 이미지를 다시 불러온 뒤 Turn 모드로 전환합니다.
작업 절차는 다음과 같습니다.
- Normal 모드 라벨링이 끝난 이미지를 불러옵니다.
- 라벨링 프로그램을 Turn 모드로 변경합니다.
- 회전 상황에서 로봇이 향해야 할 목표 지점을 클릭합니다.
- 파일명의 두 번째 X 좌표가 변경되었는지 확인합니다.
- 결과 이미지를 저장합니다.


Turn 모드에서는 회전이나 특수 상황이 발생했을 때 로봇이 이동해야 할 목표 위치를 클릭합니다.
예를 들어 Normal 모드에서는 X 좌표가 12였지만 우회전해야 하는 상황에서는 X 좌표를 200으로 지정할 수 있습니다.
이 경우 기존 파일명이 다음과 같았다면
12_12_137_20260219145823.jpg
Turn 모드 라벨링 이후 다음과 같이 변경됩니다.
12_200_137_20260219145823.jpg
여기에서 첫 번째 X 값인 12는 Normal 모드 좌표이고 두 번째 X 값인 200은 Turn 모드 좌표입니다.
Y 값인 137은 목표 지점의 세로 위치를 나타냅니다.
완료된 이미지는 일반적으로 images_labeled 디렉토리에 저장됩니다.
저장된 폴더를 limo 로봇의 dataset에 복사합니다.

13. 주행 좌표 라벨링 기준
좌표를 지정할 때 이미지마다 기준이 달라지면 모델이 일관된 주행 규칙을 학습하기 어렵습니다.
다음 기준을 정해두고 작업하는 것이 좋습니다.
- 직진 구간에서는 주행 가능한 영역의 중앙을 선택합니다.
- 곡선에서는 현재 위치가 아니라 곡선 진행 방향의 앞쪽을 선택합니다.
- 장애물이 있는 경우 장애물 바로 옆보다 충분한 회피 여유가 있는 지점을 선택합니다.
- 교차로나 회전 구간에서는 차량이 실제로 진입해야 할 방향을 선택합니다.
- 동일한 환경에서는 최대한 비슷한 기준으로 좌표를 지정합니다.
- 이미지 가장자리처럼 로봇이 급격히 회전해야 하는 좌표는 꼭 필요한 경우에만 사용합니다.
여러 사람이 라벨링한다면 작업 전에 좌표 선택 기준을 문서로 정리해야 합니다.
14. 객체 인식용 데이터셋 구조
YOLO 학습에 사용하려면 이미지 파일과 라벨 파일의 디렉토리 구조를 일정하게 구성해야 합니다.
권장 구조는 다음과 같습니다.
yolo_images/
├── images/
│ ├── train/
│ └── val/
└── labels/
├── train/
└── val/
각 디렉토리의 역할은 다음과 같습니다.
images/train: 모델 학습에 사용할 이미지images/val: 모델 검증에 사용할 이미지labels/train: 학습 이미지에 대응하는 라벨 파일labels/val: 검증 이미지에 대응하는 라벨 파일
이미지와 라벨 파일은 확장자를 제외한 파일명이 같아야 합니다.
예시는 다음과 같습니다.
images/train/limo_001.jpg
labels/train/limo_001.txt
일부 패키지나 기존 프로젝트에서는 label이라는 단수 디렉토리를 사용할 수 있지만, 일반적인 YOLO 프로젝트에서는 labels 구조가 널리 사용됩니다. 실제 학습 설정 파일에서 지정한 경로와 디렉토리 이름이 일치하는지 반드시 확인해야 합니다.
15. YOLO 라벨링 노드 실행
객체 인식용 바운딩 박스를 생성하려면 다음 명령으로 라벨링 노드를 실행합니다.
cd ~/wego_ws
source install/setup.bash
ros2 run dl_ros2_application yolo_labeler
라벨링 프로그램이 실행되면 이미지 디렉토리와 클래스 정보를 입력합니다.
학습용 이미지 경로 예시는 다음과 같습니다.
/home/wego/wego_ws/src/dataset/yolo_images/images/train
검증 이미지도 라벨링해야 한다면 train 작업을 완료한 뒤 val 디렉토리를 별도로 불러와 동일한 방식으로 진행합니다.
/home/wego/wego_ws/src/dl_ros2_application/dl_ros2_application/yolo_labeler.py 소스의 수정 위치는 아래와 같습니다. train/val 중에 하나를 주석 처리하고 실행하시기 바랍니다.




16. 객체 클래스 설정
라벨링을 시작하기 전에 인식할 객체의 클래스명을 입력합니다.
클래스는 공백을 기준으로 구분합니다.
예를 들어 사람, 정지 표지판, 차량을 인식하려면 다음과 같이 입력할 수 있습니다.
person stop_sign car
입력 순서에 따라 클래스 ID가 결정됩니다.
0 Speed_up
1 Slow_down
2 Turn_right
3 Crosswalk
4 Red_light
5 Green_light
6 Yellow_light
7 Crossing_gate
클래스 순서는 학습이 끝날 때까지 변경하면 안 됩니다.
기존 데이터에 새로운 클래스를 추가하는 경우에도 기존 클래스의 순서를 유지하고 마지막에 새 클래스를 추가하는 방식이 안전합니다.
예시는 다음과 같습니다.
Speed_up Slow_down Turn_right Crosswalk Red_light Green_light Yellow_light Crossing_gate traffic_cone
이 경우 traffic_cone의 클래스 ID는 7이 됩니다.
yolo_labeler를 실행합니다.














17. 바운딩 박스 라벨링 방법
YOLO 라벨링 프로그램에서는 마우스와 키보드를 사용하여 객체의 영역과 클래스를 지정합니다.
| 조작 | 기능 |
|---|---|
| 마우스 왼쪽 버튼 드래그 | 객체 영역에 바운딩 박스를 생성합니다. |
| 숫자 키 0~9 | 현재 박스의 클래스 번호를 선택합니다. |
| S | 현재 라벨을 YOLO 형식으로 저장합니다. |
| D | 마지막으로 만든 바운딩 박스를 삭제합니다. |
| N | 다음 이미지로 이동합니다. |
| P | 이전 이미지로 이동합니다. |
라벨링 순서는 다음과 같이 진행할 수 있습니다.
- 이미지에서 객체를 찾습니다.
- 객체 전체가 포함되도록 마우스로 박스를 그립니다.
- 해당 객체의 클래스 번호를 선택합니다.
- 이미지 안의 모든 객체에 대해 같은 작업을 반복합니다.
S키를 눌러 라벨 파일을 저장합니다.N키를 눌러 다음 이미지로 이동합니다.
클래스 ID는 0부터 9까지 숫자 키로 선택할 수 있으므로 기본 프로그램에서는 최대 10개 클래스를 직접 선택할 수 있습니다.
10개를 초과하는 클래스가 필요한 경우에는 라벨링 프로그램의 입력 처리 방식을 수정하거나 다른 YOLO 라벨링 도구를 사용하는 방안을 검토해야 합니다.
18. YOLO 라벨 파일 형식
YOLO 라벨 파일은 이미지와 같은 이름의 .txt 파일로 저장됩니다.
파일의 각 행은 하나의 객체를 의미합니다.
형식은 다음과 같습니다.
class_id x_center y_center width height
예시는 다음과 같습니다.
0 0.512500 0.483333 0.250000 0.400000
1 0.218750 0.325000 0.125000 0.183333
각 좌표는 픽셀 값이 아니라 이미지 크기를 기준으로 0에서 1 사이로 정규화된 값입니다.
각 항목의 의미는 다음과 같습니다.
class_id: 객체의 클래스 번호x_center: 바운딩 박스 중심의 X 좌표y_center: 바운딩 박스 중심의 Y 좌표width: 바운딩 박스 너비height: 바운딩 박스 높이
한 이미지에 객체가 여러 개 있다면 라벨 파일에도 여러 줄이 생성됩니다.
이미지에 학습 대상 객체가 없다면 빈 라벨 파일을 생성하거나 해당 이미지를 별도로 관리할 수 있습니다. 사용 중인 YOLO 학습 코드가 빈 라벨 파일을 어떻게 처리하는지 확인해야 합니다.
19. 바운딩 박스를 정확하게 그리는 방법
라벨 품질은 객체 검출 성능에 직접적인 영향을 줍니다.
다음 원칙을 지키는 것이 좋습니다.
- 객체의 보이는 영역을 최대한 정확하게 포함합니다.
- 객체 주변의 불필요한 배경은 최소화합니다.
- 화면 밖으로 일부가 잘린 객체도 보이는 부분을 기준으로 라벨링합니다.
- 매우 작거나 식별이 불가능한 객체는 정해진 기준에 따라 제외합니다.
- 서로 겹친 객체도 각각 개별 박스로 지정합니다.
- 이미지마다 클래스 판단 기준을 동일하게 유지합니다.
- 박스가 객체보다 지나치게 크거나 작지 않은지 확인합니다.
예를 들어 사람을 라벨링할 때 얼굴만 선택하는 방식과 몸 전체를 선택하는 방식을 혼용하면 모델이 일관된 특징을 학습하기 어렵습니다.
20. 라벨링 완료 후 점검 항목
학습을 시작하기 전에 데이터셋을 한 번 더 검사해야 합니다.
1) 파일 개수 확인
이미지 수와 라벨 파일 수가 일치하는지 확인합니다.
find ~/wego_ws/src/dataset/yolo_images/images/train -type f | wc -l
find ~/wego_ws/src/dataset/yolo_images/labels/train -type f | wc -l
2) 파일명 확인
이미지와 라벨의 기본 파일명이 같은지 확인합니다.
sample_001.jpg
sample_001.txt
3) 클래스 번호 확인
라벨 파일에 존재하는 클래스 번호가 정의한 클래스 범위를 벗어나지 않는지 확인합니다.
클래스가 3개라면 정상적인 클래스 ID는 0, 1, 2입니다.
4) 좌표 범위 확인
YOLO 좌표값은 원칙적으로 0 이상 1 이하의 값이어야 합니다.
음수 값이나 1보다 큰 값이 존재하면 라벨링 또는 변환 과정에 문제가 있을 수 있습니다.
5) 손상된 이미지 확인
열리지 않거나 크기가 0인 이미지는 학습 오류의 원인이 될 수 있습니다.
find ~/wego_ws/src/dataset -type f -size 0
21. 데이터 백업과 버전 관리
라벨링 작업은 많은 시간이 필요하기 때문에 원본 이미지와 라벨 결과를 별도로 백업하는 것이 좋습니다.
권장 관리 방식은 다음과 같습니다.
- 원본 이미지는 수정하지 않고 별도 보관합니다.
- 라벨링 전 데이터와 라벨링 후 데이터를 구분합니다.
- 클래스 순서를 텍스트 파일에 기록합니다.
- 데이터셋 변경 날짜와 변경 내용을 기록합니다.
- 학습에 사용한 데이터셋 버전을 모델 파일명에 포함합니다.
- 중요한 데이터는 외장 저장 장치나 서버에 추가 백업합니다.
예를 들어 다음과 같이 버전을 구분할 수 있습니다.
limo_dataset_v1
limo_dataset_v2
limo_dataset_20260303
클래스 정보도 별도의 파일로 보관하면 이후 학습과 추론 과정에서 혼동을 줄일 수 있습니다.
0: Speed_up
1: Slow_down
2: Turn_right
3: Crosswalk
4: Red_light
5: Green_light
6: Yellow_light
7: Crossing_gate