Azure Custom Vision Service로 만든 ONNX 모델을 Windows 10에서 실행

개요



Azure Custom Vision Service는 누구나 이미지 인식 모델을 생성할 수 있는 손쉬운 도구입니다. DeepLearning의 세계에서 전이 학습으로 해도 스스로 실행하는 것은 상당히 번거롭지만, 적은 데이터로 번거롭게 화상 인식을 실시할 수 있는 것은 큰 장점이 아닐까요?
작성한 모델에 대해서는 이 기사 를 참조해 주세요

Azure Custom Vision Service에서 ONNX 모델 내보내기



Cusotom Vision Service에서 만든 모델을 내보냅니다. 폐렴 환자의 X 선 사진이며 바이러스 성, 세균성 폐렴의 판정을 실시합니다. Compact 모델로 작성하지 않으면 Export할 수 없으므로 Compact 모델을 선택하여 한 번 학습시킵니다.





Export를 클릭하면 다운로드하는 형식을 선택할 수 있으므로 ONNX를 선택하여 다운로드합니다.



Netron 에서 모델을 볼 수 있습니다.


normal.onnx로 저장 중입니다.

ONNX 모델을 Windows Machine Learning에서 실행하는 쉬운 방법



Azure 샘플에는 Custom Vision에서 출력되는 ONNX 모델을 사용하는 것이 있습니다.
Windows10 빌드 1803으로 먼저 업데이트해야 합니다. 그런 다음 Visual Studio 2017을 설치하고 해당 SDK를 배포합니다. 여기 를 참고해 주세요
normal.onnx를 Visual Studio의 Asset에 추가합니다. 그 경우, 매우 긴 클래스명의 래퍼 코드가 생성됩니다만, 사용하지 않기 때문에 삭제합니다.
git clone https://github.com/Azure-Samples/cognitive-services-onnx-customvision-sample

위에서 샘플을 동기화할 수 있습니다.
수정 부분은 많지 않고, 2 개소의 수정으로 동작시킬 수 있습니다
MainPage.xaml.cs를 편집합니다.
namespace SampleOnnxEvaluationApp
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class MainPage : Page
    {
        private Stopwatch _stopwatch = new Stopwatch();
        private OnnxModel _model = null;
        private string _ourOnnxFileName = "normal.onnx";<---この部分を出力されたファイル名にする。


그런 다음 CustomVision은 레이블 이름이 ONNX 모델에 내장되어 있으므로 레이블 수를 변경할 수 있습니다.
 public sealed class OnnxModelOutput
        {
            public IList<string> classLabel { get; set; }
            public IDictionary<string, float> loss { get; set; }
            public OnnxModelOutput()
            {
                this.classLabel = new List<string>();
                int _nLabels = 3;<------この部分を追加する
                // For dictionary(map) fields onnx needs the variable to be pre-allocatd such that the 
                // length is equal to the number of labels defined in the model. The names are not
                // required to match what is in the model.
                this.loss = new Dictionary<string, float>();
                for (int x = 0; x < _nLabels; ++x)<-----ラベル数をセットする
                    this.loss.Add("Label_" + x.ToString(), 0.0f);
            }

이상으로 수정할 수 있었습니다. 라고 할까 거의 아무것도 하고 있지 않은 상태입니다.
위를 빌드하고 실행하면 다음과 같습니다.



아마 이것이 가장 쉬운 방법이 아닐까 생각합니다.

좋은 웹페이지 즐겨찾기