이 가이드에서는 Electron 앱에서 WinML(Windows Machine Learning)을 사용하는 C# 네이티브 추가 기능을 만드는 방법을 보여 줍니다. WinML을 사용하면 이미지 분류, 개체 검색 등의 작업을 위해 Windows 디바이스에서 로컬로 machine learning 모델(ONNX 형식)을 실행할 수 있습니다.
필수 조건
- 개발 환경 설정 완료
- Windows 11 또는 Windows 10(버전 1809 이상)
비고
WinML은 모든 Windows 10(1809 이상) 또는 Windows 11 디바이스에서 실행됩니다. 최상의 성능을 위해 GPU 또는 NPU가 있는 디바이스를 권장하지만 API는 CPU에서도 작동합니다.
1단계: C# 네이티브 추가 기능 만들기
npx winapp node create-addon --template cs --name winMlAddon
그러면 Windows SDK 및 Windows App SDK 참조로 구성된 C# project winMlAddon/ 폴더가 만들어집니다.
추가 기능을 빌드합니다.
npm run build-winMlAddon
2단계: SqueezeNet 모델 다운로드
- AI 개발자 갤러리 설치
- 이미지 분류 샘플로 이동합니다.
- SqueezeNet 1.1 모델 다운로드
- project 루트의
.onnx폴더에models/파일 복사
비고
모델을 ONNX 모델 동물원 GitHub 리포지토리 다운로드할 수도 있습니다.
3단계: 필요한 NuGet 패키지 추가
project 루트에서 Directory.packages.props 업데이트합니다.
<PackageVersion Include="Microsoft.ML.OnnxRuntime.Extensions" Version="0.14.0" />
<PackageVersion Include="System.Drawing.Common" Version="9.0.9" />
winMlAddon/winMlAddon.csproj를 업데이트하여 패키지 참조를 추가합니다.
<PackageReference Include="Microsoft.ML.OnnxRuntime.Extensions" />
<PackageReference Include="System.Drawing.Common" />
4단계: 샘플 코드 추가
AI 개발자 갤러리는 SqueezeNet을 사용하여 이미지 분류를 위한 완전한 구현을 제공합니다. electron-winml 샘플에서 수정된 코드를 찾을 수 있습니다.
샘플에서 winMlAddon/ 폴더를 복사하거나, 샘플 코드를 사용하여 winMlAddon/addon.cs를 수동으로 업데이트합니다.
주요 구현 세부 정보
Project 루트 경로: 추가 기능을 사용하려면 JavaScript 코드가 project 루트 경로를 전달하여 ONNX 모델 및 네이티브 종속성을 찾을 수 있도록 합니다.
네이티브 종속성 미리 로드: 추가 기능에는 개발 및 프로덕션 시나리오 모두에서 작동하는 필수 DLL을 로드하는 메서드가 포함되어 있습니다.
Electron Forge 구성: 네이티브 파일의 압축을 풀도록 패키지러를 구성합니다.
module.exports = {
packagerConfig: {
asar: {
unpack: "**/*.{dll,exe,node,onnx}"
},
ignore: [
/^\/.winapp\//,
"\\.msix$",
/^\/winMlAddon\/(?!dist).+/
]
},
};
5단계: 추가 기능 빌드
npm run build-winMlAddon
6단계: 추가 기능 테스트
src/index.js 추가 기능을 열고 로드합니다.
const winMlAddon = require('../winMlAddon/dist/winMlAddon.node');
테스트 함수를 추가합니다.
const testWinML = async () => {
try {
let projectRoot = path.join(__dirname, '..');
if (projectRoot.includes('app.asar')) {
projectRoot = projectRoot.replace('app.asar', 'app.asar.unpacked');
}
const addon = await winMlAddon.Addon.createAsync(projectRoot);
console.log('Model loaded successfully!');
const imagePath = path.join(projectRoot, 'test-images', 'sample.jpg');
const predictions = await addon.classifyImage(imagePath);
console.log('Top predictions:');
predictions.slice(0, 5).forEach((pred, i) => {
console.log(`${i + 1}. ${pred.label}: ${(pred.confidence * 100).toFixed(2)}%`);
});
} catch (error) {
console.error('Error testing WinML:', error.message);
}
};
샘플 이미지가 있는 test-images/ 폴더를 만들어 테스트 이미지를 준비한 다음, 다음을 실행합니다.
npm start
7단계: 디버그 ID 업데이트
npx winapp node add-electron-debug-identity
비고
스파스 패키징된 Electron 애플리케이션에서 크래시 또는 빈 창이 발생할 수 있는 것으로 알려진 Windows 버그가 있습니다. 해결 방법은 설치 가이드 를 참조하세요.
다음 단계
- Phi Silica 추가 기능 만들기 - 디바이스 내 AI API 사용
- 배포용 패키징 - 서명된 MSIX 패키지 만들기
관련 토픽
Windows developer