나는 Rust로 GPU 가속 얼굴 크롭 도구를 Vibe‑Coded했습니다 — 그 이유는

발행: (2026년 2월 22일 오전 05:09 GMT+9)
6 분 소요
원문: Dev.to

Source: Dev.to

The Problem

  • 이미지가 타인의 서버에 업로드되는 온라인 서비스(학생 데이터에 절대 안 됨).
  • 배치 작업에서 끊기거나 결과가 일관되지 않은 데스크톱 도구.

수백 장의 이미지를 로컬에서 처리하고, 결정론적 결과를 내며, 빠르게 동작하는 무언가가 필요했습니다.

Why Rust?

Ecosystem – Rust의 크레이트 생태계는 이제 파이썬만큼 풍부합니다. GPU 연산이 필요하나요? wgpu가 있습니다. 얼굴 검출 추론? ndarrayimage 크레이트로 만들 수 있습니다. GUI? egui. CSV, Excel, Parquet, SQLite 등 배치 데이터 입력? 모두 성숙하고 잘 유지되는 크레이트가 지원합니다. 바인딩을 직접 작성하거나 자체 솔루션을 만들 필요가 거의 없었고, 필요한 빌딩 블록은 이미 존재했습니다.

Vibe coding – LLM을 코파일럿으로 사용하면서 컴파일러 오류 메시지가 강력한 무기가 됩니다. Rust는 무엇이 잘못됐는지, 어디서, 그리고 어떻게 고쳐야 하는지를 정확히 알려줍니다. Rust 컴파일러 오류를 LLM에 전달하면 한 번에 해결할 수 있는데, 이는 C에서의 세그멘테이션 오류나 동적 타입 언어에서의 런타임 패닉보다 훨씬 쉽습니다. 이 긴밀한 피드백 루프 덕분에 다른 시스템 언어보다 생산성이 크게 향상되었습니다.

The Architecture

  • Face detection: 실시간 사용에 충분히 가벼운 경량 신경망인 YuNet. 무거운 ONNX Runtime 의존성을 피하고 GPU 파이프라인을 완전히 제어하기 위해 직접 WGSL 컴퓨트 셰이더로 추론 파이프라인을 구현했습니다.
  • Compute shaders: 이미지 전처리, 얼굴 검출 추론, 후처리 강화 등 모든 작업을 담당하는 7개의 커스텀 셰이더. 가능한 한 파이프라인을 GPU에 머무르게 하여 CPU↔GPU 간의 비용이 큰 데이터 전송을 최소화합니다.
  • Enhancement pipeline: 자동 색 보정, 노출, 밝기, 대비, 채도, 샤프닝, 피부 부드럽게 하기, 적목 현상 제거, 인물 배경 흐림. 각 작업은 GPU와 CPU 경로를 모두 제공하며 자동으로 폴백됩니다.
  • Batch processing with data mapping: CSV, Excel, Parquet, SQLite 파일을 가져와 배치 명명에 활용합니다. 학생 이름과 사진 파일명을 담은 스프레드시트를 입력하면 도구가 나머지를 처리합니다.

The Hard Parts

  • VRAM Management
  • Multi‑Face Detection
  • Cross‑Platform GPU Support

What I Shipped

  • 6+ crop presets: LinkedIn, Passport, Instagram, ID Card, Avatar, Headshot, 그리고 완전 사용자 정의 차원.
  • Quality scoring: 라플라시안‑분산 샤프니스 분석을 통해 각 크롭을 Low, Medium, High 품질로 구분합니다.
  • Native GUI built with egui – 실시간 미리보기, undo/redo, 처리 이력.
  • CLI mode for scripting and automation.
  • 4 export formats with configurable quality settings.
  • MIT 라이선스 및 완전 오픈 소스.
  • 코드베이스는 약 97 %가 Rust.

What I Learned

  1. Write the GPU path first – CPU 중심으로 설계하고 나중에 GPU를 끼워 넣으면 데이터 흐름이 어색해지고 불필요한 복사가 발생합니다. GPU를 염두에 두고 시작하고 필요할 때 CPU 폴백을 추가하세요.
  2. Batch processing exposes every edge case – 10장의 이미지에서 잘 동작하던 도구가 1,000장에서는 새로운 실패 원인을 드러냅니다. 단일 이미지 모드에서는 보이지 않던 메모리 누수가 대규모에서는 치명적인 문제가 됩니다.
  3. Deterministic output matters – ID 사진과 같은 공식 문서를 처리할 때 동일 입력에서 약간이라도 다른 크롭이 나오면 안 됩니다. GPU와 CPU 경로 모두에서 부동소수점 재현성을 확보하려면 상당한 노력이 필요했습니다.

Try It Yourself

  • GitHub:
  • Website:
0 조회
Back to Blog

관련 글

더 보기 »

터미널 UI: BubbleTea (Go) vs Ratatui (Rust)

BubbleTea Go vs. Ratatui Rust – 간단 비교 오늘날 터미널 사용자 인터페이스(TUI)를 만들기 위한 두 가지 강력한 옵션은 BubbleTea Go와 Ratatui Rust입니다. 이것은…