개미들을 위한 퀀트 자동 매매 프로그램 개발자 블로그입니다. 프로그래밍과 퀀트 투자를 합니다.

방구석퀀트

네이버카페 : 방구석 퀀트 놀러오세요^^ https://cafe.naver.com/conerquant 가입해 주세요.

2018년 8월 21일 화요일

TensorFlowSharp - 02. TensorFlow 모델 사용하기(Winform 앱)

1. 기본 함수 사용하기(콘솔 앱)
2. TensorFlow 모델 사용하기(Winform 앱)
3-1. 내가 만든 TensorFlow slim 모델 사용( InceptionV1 ckpt to pb convertion )
3-2. 내가 만든 TensorFlow slim 모델 사용( InceptionV1 Preprocessing in TensorFlowSharp)

TensorFlowSharp에서 제공하고 있는 ExmapleInceptionInference 예제를 통해서 C#에서 TensorFlow 모델을 이용해 사진을 분류하는 Winform 앱을 만들어 보도록 하겠습니다.

ExmapleInceptionInference 예제 소스 코드 위치
https://github.com/migueldeicaza/TensorFlowSharp/tree/master/Examples/ExampleInceptionInference

Visual Studio 셋팅


Visual Studio를 실행하고 새 프로젝트에서 [Visual C#]-[Windows Forms 앱] 을 선택하고, 프로젝트 이름은 'UsingTensorflow'라고 입력합니다. NuGet에서 TensorFlowSharp을 다시 설치합니다. 매번 프로젝트를 새로 생성할 때 마다 새로 설치해야 합니다. (설치 방법은 이 글을 참고 : http://euhyeji.blogspot.com/2018/08/tensorflowsharp01.html )   

UI 디자인


Form에 그림을 파일 입력으로 받아서 Tensorflow 모델에 inference 시키고 그 결과를 표시하는 앱을 만들어 보겠습니다. 디자인은 아래처럼 하겠습니다.

위 UI 디자인을 어떻게 하는지는 본 글에서 다루지는 않습니다.(원하신다면 다른 방법으로 설명을 해보겠습니다만... 조만간 GitHub에 소스코드는 올리도록 하겠습니다.) 

ExmapleInceptionInference 예제


ExmapleInceptionInference 예제는 ImageNet Inception 모델을 이용해 사진을 분류하는 예제 입니다. 이 예제의 로직 순서는 아래와 같고, 제가 만든 프로그램에서는 Inference라는 함수안에 다 구현하겠습니다.

- 미리 학습된 모델의 직렬화 표현(pb)을 그래프로 로드.

ModelFiles 함수 
이 함수는 모델이 저장되어 있는 폴더 경로를 지정해주면 이미 지정해 놓은 모델(Inception)과 라벨 목록 파일을 각각 modelFile/labelFile에 할당해 줍니다. 만약 위 해당 파일이 없다면 url에 지정된 링크에서 다운로드를 받습니다. 


이 함수를 이용해서 아래와 같이 그래프에 모델을 로드합니다.
- 그래프에서 작업을 수행하는 세션을 만듭니다.
using (var session = new TFSession(graph))

- 세션 실행에 입력으로 제공하기 위해 이미지 파일을 Tensor로 변환합니다.
var tensor = CreateTensorFromImageFile(filename);
CreateTensorFromImageFile 함수는 입력된 이미지 파일을 Tensor로 변환 시킵니다. 이 함수 안에 ConstructGraphToNormalizeImage 함수가 있는데 이 예제에서는 Inception 모델에서 사용하던 이미지 전처리 방식을 그대로 구현한 함수입니다. 만약 Inception 모델이 아닌 다른 모델로 Inference 시키고 싶다면 이 ConstructGraphToNormalizeImage 함수의 내용을 모델 생성시 사용하던 전처리 방법대로 구현해 주어야 합니다.
- 세션을 실행해 가장 높은 확률의 레이블을 출력합니다.

실행 화면

ImageNet 학습에 사용되지 않은 사진을 입력으로 넣어봤습니다. 90퍼센트의 확률로 wolf spider라고 예측하고 있네요. 

이상 TensorFlowSharp에서 기본으로 제공하고 있는 예제를 Winform에 구현해 동작이 잘 되는 것을 확인 했습니다. 다음 글에서는 TensorFlow slim을 이용해 만든 모델을 사용하는 방법에 대해 알아 보겠습니다. 

다음 글 전에 아래 내용을 미리 실습해 놓으시기 바랍니다.


댓글 11개:

  1. 혹시 소스코드를 볼 수 있을까요ㅠㅠ 저는 텐서플로를 사용하면 윈폼이 아예 생성자체가 안되서....ㅠㅠ

    답글삭제
  2. 코드공유좀 해주실수 있나요?...
    사진으로 캡쳐를하셔서 다 일일이 따라쳐야하네요.;;

    답글삭제
  3. 윈폼은 걍 만드는 건데요...

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using TensorFlow;

    namespace TensorflowTest
    {
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
    using (var session = new TFSession())
    {
    var graph = session.Graph;

    var a = graph.Const(2);
    var b = graph.Const(3);
    richTextBox1.Text += "a=2 b=3" + Environment.NewLine;

    // Add two constants
    var addingResults = session.GetRunner().Run(graph.Add(a, b));
    var addingResultValue = addingResults.GetValue();
    richTextBox1.Text += $"a+b={addingResultValue}" + Environment.NewLine;

    // Multiply two constants
    var multiplyResults = session.GetRunner().Run(graph.Mul(a, b));
    var multiplyResultValue = multiplyResults.GetValue();
    richTextBox1.Text += $"a+b={multiplyResultValue}" + Environment.NewLine;
    }
    }
    }
    }

    답글삭제
  4. if(result.NumDims != 2 || rshape[0] != 1)
    조건문 안에 코드가 생략되어있는데
    혹시 내부 코드를 알 수 있을까요?

    답글삭제
    답글
    1. https://github.com/migueldeicaza/TensorFlowSharp/tree/master/Examples/ExampleInceptionInference
      여기에 소스코드 다 있어요~

      삭제
    2. https://github.com/euhyeji/TensorFlowSharpinWinForm
      여기에도 소스 코드 있어요

      삭제
  5. 모델은 어떻게 만드나요?

    답글삭제
    답글
    1. https://euhyeji.blogspot.com/search/label/Tensorflow%201.9?&max-results=10
      여기에 나오는 Slim 이라는 라이브러리를 통해서 모델 만들었어요.

      삭제
  6. 혹시 깃허브에 올리셨나요?

    답글삭제
  7. 두번째랑 세번쨰 결과값을 어떻게 읽어오나요?

    답글삭제
    답글
    1. 아 해결되었습니다 감사합니다.

      삭제

가장 많이 본 글