안녕하세요. 이번에는 딥러닝 비전 모델인 YOLO(You Only Look Once) 학습을 위한 커스텀 데이터셋 라벨링 툴을 직접 개발하여 공유합니다.
기존에도 다양한 라벨링 툴(LabelImg 등)이 존재하지만, C# WPF를 활용해 **직관적인 UI**와 **가벼운 단일 실행 파일** 형태로 동작하면서, **Roboflow 형태의 YOLOv8 데이터셋 Export**까지 한 번에 처리할 수 있는 툴이 필요하여 직접 제작하게 되었습니다.

---
🛠 기술 스택 (Tech Stack)
* **언어 & 프레임워크**: C#, .NET 10.0
* **UI**: WPF (Windows Presentation Foundation)
* **아키텍처**: MVVM (Model-View-ViewModel) 디자인 패턴
* **직렬화**: `Systehttp://m.Text.Json`을 활용한 프로젝트 저장/불러오기
---
✨ 주요 기능 (Key Features)
1. 직관적인 폴더 기반 작업 환경
* **폴더 불러오기**: 로컬 디렉토리에 있는 이미지 파일(`.jpg`, `.png`, `.bmp` 등)을 한 번에 불러와 좌측 리스트에 구성합니다.
* 마우스 클릭만으로 빠르게 이미지를 탐색하며 작업을 진행할 수 있습니다.
2. 강력한 바운딩 박스(Bounding Box) 라벨링
* 캔버스 위에서 마우스 드래그를 통해 직관적으로 바운딩 박스를 생성할 수 있습니다.
* WPF의 Behavior(`CanvasDrawBoxBehavior`)를 직접 구현하여 MVVM 패턴을 위반하지 않으면서 부드러운 드로잉 경험을 제공합니다.
* 클래스(Class) 추가 및 선택, 개별 박스 삭제 및 전체 삭제를 지원합니다.
3. 작업 실행 취소 (Undo - Ctrl+Z) 지원
* 바운딩 박스를 실수로 추가하거나 삭제했을 때, 혹은 전체 삭제를 눌렀을 때를 대비해 **Undo(실행 취소)** 기능을 구현했습니다.
* `Command 패턴`을 응용하여 액션 스택에 기록을 남기도록 설계되었습니다.
4. Dataset Split 지정
* 이미지마다 **Train, Valid, Test** 용도를 드롭다운으로 쉽게 지정할 수 있습니다.
* 이를 통해 Export 시 각 폴더로 이미지가 알맞게 분배됩니다.
5. 프로젝트 저장 및 불러오기 기능
* 중간에 작업을 중단해야 할 경우, `.yproj.json` 확장자의 프로젝트 파일로 작업 상태를 저장하고 나중에 다시 불러올 수 있습니다. (`Systemhttp://m.Text.Json` 기반)
6. YOLO Dataset Export (Roboflow 호환)
* 라벨링된 결과를 **Roboflow 스타일의 YOLOv8 포맷**으로 즉시 추출합니다.
* Train, Val, Test 폴더 구조로 이미지와 `.txt` 라벨 파일이 나뉘며, `data.yaml` 파일까지 자동으로 생성되어 바로 모델 학습에 투입할 수 있습니다.
---
💻 개발 요약 및 아키텍처
이 프로젝트는 WPF 애플리케이션 개발의 표준이라 할 수 있는 **MVVM (Model-View-ViewModel)** 패턴을 엄격하게 적용하여 개발되었습니다.
* **View와 로직의 분리**: `MainWindow.xaml`에는 순수하게 UI 요소와 바인딩만 존재하며, 모든 비즈니스 로직(박스 관리, Export, 파일 I/O)은 `MainViewModel`에서 처리됩니다.
* **단일 실행 파일 배포 (Single File Deploy)**: .NET의 `.csproj` 옵션 중 `<PublishSingleFile>true</PublishSingleFile>`과 `<IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract>`를 적용했습니다. 사용자는 **런타임 설치나 번거로운 설정 없이 150MB 남짓의 `.exe` 파일 하나만 실행**하면 즉시 프로그램을 사용할 수 있습니다.
---
📥 다운로드 및 사용법
아래 첨부된 `YoloLabelerMvvm.exe` 파일을 다운로드하신 후 바로 실행하시면 됩니다. (별도의 설치 과정이 필요 없는 포터블 형태입니다.)
1. `이미지 폴더 불러오기` 버튼을 눌러 라벨링할 이미지가 있는 폴더를 선택합니다.
2. 우측에서 새로운 **클래스(Class)**를 추가합니다. (예: `car`, `person` 등)
3. 중앙 이미지 화면에서 마우스 드래그로 객체를 감싸는 **바운딩 박스**를 그립니다.
4. 필요시 `Dataset Split` 콤보박스에서 Train/Val/Test를 지정합니다.
5. 작업 완료 후 `저장`을 눌러 프로젝트를 저장하거나, 하단의 `YOLO Dataset Export` 버튼을 눌러 학습용 데이터셋으로 추출합니다.
https://drive.google.com/file/d/19UHhP-NvZ4Le-cVSap4Jd41hQ0FseXGx/view?usp=sharing
---
YOLO 모델 학습을 위해 가볍고 빠른 데스크톱 전용 라벨링 툴이 필요하셨던 분들께 유용하게 쓰이길 바랍니다! 기능 추가 제안이나 버그 리포트는 언제든 환영입니다. 😊
'C#' 카테고리의 다른 글
| [WPF/C#] Tesseract & PaddleOCR 기반 지능형 OCR 테스트 툴 개발 및 릴리즈 🚀 (0) | 2026.04.29 |
|---|