소프트웨어 개발/C

Microsoft Face API를 이용한 얼굴 세부 인식기 개발

늘근이 2016. 4. 3. 22:34

어쨌든 요기서 SDK를 다운로드 받을수 있다.

어떻게 얼굴을 인식하는 기술을 만드느냐 하는것은 박사들이 알아서 잘 할것이고 본인도 시켜주면 굉장히 잘할수있는데 기회가 나지 않기때문에 라이브러리만 가져다가 응용어플리케이션을 만든다.

 

https://www.microsoft.com/cognitive-services/en-us/face-api

 

위에다가 그냥 넣으면 사실 그게 답이지만, 문제는 여러 이미지를 때려박고 거기에서 나오는 데이터를 대량으로 처리하고 싶기때문에 그게 문제이다.

 

대강의 프로그램은 복잡하지 않다.

솔직히 그냥 홈페이지에서 각종 얼굴을 뗘다가 붙여서 수작업으로 작업할수도 있는데, 아무래도 너무 느리다. 굉장히 귀찮기 때문에 C#을 이용해서 어플리케이션을 한번 만들어 봤다.

 

 레이아웃은 아무래도 좋다.

일단 어떤 파일이 불러와졌는지 보여지는 listbox와,

listbox에서 선택한 이미지를 보여줄 image,

그리고 얼굴에대한 JSON정보를 띄워줄 textbox 2개가 위치하고있다.

 

먼저, faceAPI키를 얻은 후 다음과 같은 문장으로 전역변수를 선언해주는 편이 좋다.

 

private readonly IFaceServiceClient faceServiceClient = new FaceServiceClient("xxxxxxxxxxxxx");

 

browser를 눌렀을때 작동해야할 로직은 아래와 같다.

        private async void button_Click(object sender, RoutedEventArgs e)
        {
            var openDlg = new Microsoft.Win32.OpenFileDialog();

            openDlg.Multiselect = true;

            bool? result = openDlg.ShowDialog(this);
            if (!(bool)result) return;

            string[] filePath = openDlg.FileNames;
           
            foreach(var file in filePath)
            {
                listBox.Items.Add(file);
            }

            Title = "Detecting...";
            ArrayList faces = await getFaces(filePath);
            Title = "고락가락 얼굴 인식기";

            foreach (Face face in faces)
            {
                textAll.Text += JsonConvert.SerializeObject(face) ;
                textAll.AppendText("\r\n");
            }
           
        }

위의 코드가 무엇을 하냐 하면

1) 일단, 다이알로그를 연다. 다중선택을 가능하게 한다.

2) 다중선택으로부터 파일 이름을 받는다

3) listBox에 불러온 파일 이름을 넣는다.

4) 비동기방식으로 getFaces 라는 메서드를 호출한다.

이때, button_Click 메서드는 async방식으로 선언되어져있는것을 확인할수 있는데, C#에서 볼수 있는 비동기의 강력함이다. GUI는 프로그램이 뒤에서 뭔가 작업을 해도 돌아가고 있을수 있기 때문에, 이렇게 처리한다.

5) 다 불러오면, JsonConvert를 통해, JSON으로 변환한다.

 

다음은 대망의 getFaces()메서드이다.

        private async Task<ArrayList> getFaces(string[] filePath)
        {

            ArrayList faceList = new ArrayList();

            foreach (var file in filePath) {
                Stream imageFileStream = File.OpenRead(file);
                Face[] faces = await faceServiceClient.DetectAsync(imageFileStream, true, true, new FaceAttributeType[] { FaceAttributeType.Gender, FaceAttributeType.Age, FaceAttributeType.Smile, FaceAttributeType.Glasses });

                foreach (var face in faces)
                {
                    faceList.Add(face);
                }

            }
            return faceList;
        }

배열을 유동적으로 활용 못하기대문에 ArrayList라는 콜렉션 클래스를 써봤다. 위와같이 faceServiceClient에서 제공하는 DetectAsync메서드만 통하면 만사 오케이이다.

이제 추출한 face들을 list에 넣어 리턴한다. 다만, await으로 처리되었기 때문에 Task라는 객체로 포장해서 리턴한다.

 

나머지는 listbox에서 움직임이 확인되었을때 내보낼 거시기이다.

 

        private async void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            string filePath = listBox.SelectedItem.ToString();
            string[] curItems = { filePath };
           
            ArrayList faces = await getFaces(curItems);

            //디테일 정보
            foreach (Face face in faces) textDetail.Text = JsonConvert.SerializeObject(face);


            //이미지 설정
            Uri fileUri = new Uri(filePath);
            BitmapImage bitmapSource = new BitmapImage();

            bitmapSource.BeginInit();
            bitmapSource.CacheOption = BitmapCacheOption.None;
            bitmapSource.UriSource = fileUri;
            bitmapSource.EndInit();

            image.Source = bitmapSource;

        }

 

간단하다. 이미지설정이 주목할만한데 별건없고 그냥 파일경로에서 이미지를 설정하는 부분다.

 

위의 코드를 실행하기 위해서는 Import가 다음과 같이 필요하다.

using Microsoft.ProjectOxford.Face;
using Microsoft.ProjectOxford.Face.Contract;
using System.IO;
using System.Collections;
using Newtonsoft.Json;

 

패키지는 다음과 같은 Nuget패키지를 설치한다.

 

하나는 FaceAPI이며, 하나는 JSON으로 Serialize를 쉽게 할수있는 라이브러리인 Newtonsoft.JSON이다. 그냥 솔직히 다른거 쓰기 귀찮으니 깔도록 한다. 

 

최종모습은 다음과 같다.

 

 

 

이제 받은 결과로 데이터 분석을 시작하면 된다. 몇백개가 되었든 몇천개가 되었든 json형식으로 내려다 받고 죄다 한꺼번에 r같은데다가 올려놓고 군집분석이라든지, 예측분석을 해볼수있다.

 

일단 C#은 비주얼베이직처럼 직관적이면서도 뭔가 귀찮스럽지 않다. 비주얼 스튜디오와 연동해서 돌아가는 인텔리센스는 정말 깔끔하며 자바에서는 제공하지 않는 여러 키워들과 함께 프로그래밍 언어에 잘 녹아져 있는 트렌드.. WPF를 통해 윈도우 어플리케이션을 개발하는것은 MFC의 머리아픔으로부터의 해방이며 비주얼 베이직의 무언가 자연어를 강조하다 더 구문이 어려워지는 이상한 현상으로 부터 해방이다. 자바의 상위호환

 

 

 

 

 

 

'소프트웨어 개발 > C' 카테고리의 다른 글

(1) C++ 기본 빠르게 익히기 - 포인터  (0) 2017.08.05
C++ Visual Studio Code 에서 실행  (0) 2017.08.05
Microsoft Face API 주요부분  (0) 2016.04.03
C# 기억해두어야 할것  (0) 2016.04.03
[링크] 시샵 강좌  (0) 2016.04.03