.NET 환경에서 C#을 활용해 YOLO 기반의 자세 감지 기능을 구현하는 방법은 매우 간단합니다. 파이썬 기반 솔루션과 비교했을 때, .NET 8 기반의 AOT(Ahead-of-Time) 컴파일을 통해 실행 파일 하나만으로도 독립적인 배포가 가능하며, 해석기 및 런타임 의존성 없이 순수하게 CPU 기반 추론 성능을 확보할 수 있습니다. 특히, 모델 가중치와 원시 추론 코드가 모두 내장된 형태로 제공되며, 파이썬 환경 설정, 버전 충돌, 수백 메가바이트 규모의 라이브러리 설치 없이도 즉시 사용이 가능합니다. 이는 현장 적용 시 유지보수 부담을 획기적으로 줄이고, 안정성, 일관성, 격리성 요구가 강한 산업용 시나리오에 적합합니다.
본 문서에서 다루는 모든 머신러닝 모델 예제 코드는 오픈소스로 공개되어 있으며, '영화초망' 공식 계정에서 'AISharp'라고 입력하면 소스코드 리포지토리 접근 링크를 확인할 수 있습니다.
- 개발 환경 구성
NuGet 패키지 매니저를 통해 다음 두 개의 라이브러리를 설치합니다:
Microsoft.ML.OnnxRuntime.ManagedYoloDotNet
이 두 패키지는 스카이아(Skia), ONNX Runtime 등 필요한 내부 네이티브 라이브러리까지 포함하고 있어 별도 설치 없이 바로 사용 가능합니다.
-
Microsoft.ML.OnnxRuntime.Managed: 크로스플랫폼 기반의 머신러닝 추론 가속기로, 파이토치, 텐서플로우/케라스, 사이킷런, 라이트그브머, 엑스트림 그레디언트 등 다양한 프레임워크에서 학습된 모델을 통합 처리할 수 있습니다. 그래프 최적화 및 하드웨어 가속 기술을 활용해 다양한 운영체제와 드라이버 환경에서도 저지연, 고처리량 추론을 실현합니다.
-
YoloDotNet: .NET 8 기반의 전통적인 온라인 인터페이스를 지원하는 전체 스택 라이브러리입니다. 객체 감지, 오브젝트 경계 박스(이상형), 분할, 분류, 자세 추정, 트래킹 기능을 한 번에 제공하며, CUDA 및 TensorRT를 통한 이중 경로 GPU 가속을 지원합니다. 이미지, 동영상, 실시간 스트리밍까지 모두 호환되며, 프레임 건너뛰기 및 시각화 커스터마이징이 가능합니다. 단일 라이브러리로 모델부터 출력 화면까지의 완전한 루프를 구현할 수 있습니다.
- 모델 준비
YOLO3~YOLO12까지의 사전 학습된 모델은 공식 문서 Ultralytics 공식 문서에서 다운로드할 수 있습니다. 모델은 다음과 같은 5가지 유형으로 분류됩니다: 객체 감지, 이미지 분할, 이미지 분류, 자세 감지, 오브젝트 경계 박스(각도 조정).
모든 모델은 기본적으로 .pt 형식으로 제공되며, C#에서 사용하기 위해서는 이를 .onnx 형식으로 변환해야 합니다. 아래는 간단한 파이썬 코드 예시입니다:
from ultralytics import YOLO
# .pt 모델 로드
model = YOLO("D:/yolo11n-pose.pt")
# ONNX 형식으로 내보내기
model.export(format="onnx")
- 코드 구현
공식 YoloDotNet 레포지토리의 demo 폴더에는 다양한 기능 구현 사례가 포함되어 있습니다. 아래는 모델 초기화 예제입니다:
// YOLO 인스턴스 생성
using var yolo = new Yolo(new YoloOptions
{
// 모델 경로 지정
OnnxModel = @"\yolo11n-pose.onnx",
// CPU 기반 추론 설정
ExecutionProvider = new CpuExecutionProvider(),
// 이미지 리사이즈 방식
ImageResize = ImageResize.Proportional, // 비율 유지 (필요 시 패딩)
// 샘플링 옵션 (성능과 정확도에 영향)
SamplingOptions = new(SKFilterMode.Nearest, SKMipmapMode.None)
});
OnnxModel 대신 OnnxModelBytes를 사용하면, 바이트 배열로 직접 모델 데이터를 로드할 수 있어, 실제 실행 파일 내부에 모델을 완전히 내장하는 것이 가능합니다.
자세 감지 기능을 구현하는 예제 코드는 다음과 같습니다. 핵심 로직은 1~2줄로 간결하게 표현됩니다:
// 이미지 로드 (Skia 사용)
using var image = SKBitmap.Decode(args?[0] ?? @"d:\tt2.png");
// 자세 감지 수행
var results = yolo.RunPoseEstimation(image, confidence: 0.25, iou: 0.7);
// 결과 시각화
image.Draw(results, _drawingOptions);
// 결과 저장
var fileName = Path.Combine(_outputFolder, "PoseEstimation.jpg");
image.Save(fileName, SKEncodedImageFormat.Jpeg, 80);
// 출력 이미지 표시
DisplayOutput(fileName);
- 배포 옵션 비교
.NET 플랫폼의 유연성 덕분에 다양한 배포 방식을 선택할 수 있습니다. 아래는 각각의 배포 결과를 비교한 표입니다. 모든 경우에서 11.2MB 규모의 소형 모델이 내장되어 있으며, 외부 모델 파일 불필요:
| 배포 방식 (모델 내장) | 파일 크기 | 파일 수 |
|---|---|---|
| 단일 파일 배포 | 47.6MB | 3 |
| 단일 파일 (압축 포함) | 45.6MB | 3 |
| AOT 배포 | 37.9MB | 3 |
| 단일 파일 (압축 + 네이티브 추출) | 31.0MB | 1 |
특히, AOT 배포 시 원본 YoloDotNet 라이브러리에서는 Dynamic 타입 사용으로 인해 컴파일 에러가 발생합니다. 해당 문제를 해결하기 위해 원본 소스를 가져와 수정 후 재빌드하면 정상 작동하도록 할 수 있습니다.
- 성능 시연
YOLO의 자세 감지 모델은 얼굴, 눈, 머리, 팔, 다리 등 여러 관절 점을 식별할 수 있습니다. 아래는 실제 결과 예시입니다 (비디오 속도 변경 없음):

최종 이미지에서 일부 인물이 인식되지 않은 이유는 사용된 모델 크기 때문입니다. 더 큰 모델인 yolo11x-pose(224MB)로 교체하면 주요 인물 모두 정확히 감지됩니다.
-
yolo11n-pose(11.2MB):
-
yolo11x-pose(224MB):
- 마무리
C#의 AOT 컴파일과 ONNX Runtime 기술을 결합하면, YOLO11 자세 감지 모델과 모든 종속성까지 31MB의 단일 실행 파일로 압축할 수 있습니다. 현장 배포 시 파이썬 환경이나 추가 라이브러리 설치 없이도 즉시 작동하며, 배포 및 유지보수 리스크를 크게 줄이고, 시스템의 안정성과 일관성을 확보할 수 있습니다. 이로써 인공지능 기술을 손끝에 담는 ‘포켓 가능한’ 솔루션을 현실화했습니다.
본 사례 및 보다 풍부한 머신러닝 모델 예제 코드는 모두 오픈소스로 공개되어 있으며, '영화초망' 공식 계정에서 'AISharp'라고 입력하면 리포지토리에 접근할 수 있습니다.
참고: 본 프로젝트에서는 공식
YoloDotNet라이브러리를 수정 및 최소화하여 재컴파일한 버전을 사용하고 있으며, 기본master브랜치는 .NET 10 기준입니다. .NET 10이 설치되지 않은 환경에서는master_NET8브랜치를 사용하시기 바랍니다.