하늘높이의 프로그래밍 이야기

최근 업무와는 관련이 없지만... 부서에서 MS가 얼굴 나이 인식 앱을 내놓았다는...이야기가 있었다.

관련기사

http://www.theregister.co.uk/2015/05/01/microsoft_facial_recognition_age_estimation_metadata_harvesting/

http://factoll.tistory.com/1147


사실 개인적으로는 작년에 안드로이드 셋탑에서 얼굴 인식 관련 프로젝트도 했었고....
유료이긴 했지만...[갤럭시 시리즈에 들어간 SDK] 그런 분야에 뛰어난 SDK도 실컷 구경을 하고..
그것들의 성능의 뛰어남에... 두손 두발 들었기에...(그쪽은 역시 전공 전문가가...)

개발을 하려면 OpenCV로 시작해서...나름 알고리즘을 배워야지... 라고 생각하며...
컴퓨터 비전 좀 더 깊게 파보는 것은 어떨까? 생각하고 있던차라... 

MS가 비전에서 뭘 하겠어? OpenCV가 있는데... 라고 생각하며 별 관심이 없었다...

얼굴 인식해서 나이를 인식하는 것은...2011년의 KTH의 푸딩 얼굴 인식 앱도 되던 기능이며....
MS같은 대형 소프트웨어 회사가 해야 할 일은 아니지 않은가?

아니 얼굴 인식해서 그룹화하던것은 구글 피카사나... 어도비나...(최근에 좋아하는 라이트룸도 지원) 애플의 iPhoto들은 예전부터 하던 일이며... 성능이 어떻게 보면 괜찮은데... 어떻게 보면 또 굉장히 허접함을 알고 있어서...
(그냥 도움을 주는 정도?)

MS도 뭐하나 사진 관리 앱 만들었나 보네.... 하고 생각하며 말았는데..

저녁에 생각나서 다시 한번 찾아보니...생각 외로 다른 프로젝트더라.
최근 유행하는 나이 앱은 Project Oxford라는 프로젝트의 산물인데...

http://www.projectoxford.ai/

Project Oxford라는 놈이 SDK를 지원하는 프로젝트라는 점...

오옷 SDK?  재미 있는 것은 서드파티 서드파티 외치는 MS 가 먼일이래? 이것봐라...SDK라면 이야기가 살짝 달라진다.
(물론 어떤 서드파티 회사 몇 개는 죽어 나겠지만...)

현재.. SDK로 이 기능들을 제공하는 것은 별로 없다.(물론 유료는 많지만...이래 저래 정확도가 떨어지는 부분이 있는 것들이라... 믿을 만한지는 살짝 살짝 고민..)

구글 안드로이드 SDK의 얼굴 인식 수준은 사진에 얼굴이 있다 없다 혹은 어느 부분에 얼굴이 있다 이고..
화면 잠금을 푸는 얼굴 확인(
Recongnation) SDK는 제공하지 않는다.

이미지에 문자가 있으면.. 글자를 인식해서 텍스트 검색화 하는 것을 만들려고 생각하고 있었는데...
한글 OCR은 공개된 알고리즘도 적을 뿐더러... 비전으로 글자를 인식하려면... 공이 꽤나 들어가야 한다.

그런데 그것을 제공하겠다고? 시간 날 때 한번 더 자세히 살펴 봐야겠네...

간단히 보니 SDK는 총 3개이다.

Face , Speech, Vision

그 중 Face와 Vision이 조금 관심이 간다.
(Speech는 한국어도 없고.... 구글도 적당히 쓸만하다. 영어 데모를 봐서는 구글보다 괜찮은 점도 보이긴 하지만..)

기반도 .Net이라 맘에 든다. 안드로이드의 사상과 구글을 좋아하긴 하지만...안드로이드 개발을 해보면...
안드로이드의 SDK라는 것이 비주얼 스튜디오로 윈도우 소프트웨어를 개발하던.... 내 맘에는 별로 들진 않는다.
(그리고 다양한 제조사 별로 모두 특성이 다른 파편화 현상 역시 굉장히 싫어함)

그러나 실버라이트 C# .Net 개발 이후로 웹이건 PC 소프트웨어건 MS를 잘 쓰지 않은 것은 사실인데...
(솔루션 회사들은 쓰겠지만... 내가 지금 솔루션과 관계 없는 일을 하니...어쨋든 쓸 일이 별로 없다.)


어쨋든 http://www.projectoxford.ai/demo 를 보면...

Face Detection/Verification 사진이 많은 DB를 구별하는데... 도움이 될 것 같고...
아까도 말했지만 Speech에 해당하는 STT와 TTS는 패스....

Vision Feature Analysis는... 사진의 요소를 찾아준다 재미 있는 것은 성인 이미지인지도.. 점수로...
(물론. 가지고 있는 성인 이미지를 넣었더니... 아니라고 나오긴 한다. -.-)

Optical Character는 이미지에서 원문을 찾아준다. 한글 지원 오동작이 있긴 하지만... 서비스 용이 아닌 데이터 용으로는 충분해 보인다.

Vision Thumbnail 이건 페이스북이... 사진을 공유하면... 적당한 위치로 잘라주듯이 섬네일을 알아서 잘라주는 기능인 것 같아(예를 들면 인물 중심)

뭐 어쨌든 당분간 재미있는 장난감이 생겼으니... 틈틈히 개인 시간에 한번 보긴 해야겠다. 쓸데가 있는 녀석인지 아닌지... 그런데 환경은 Window 8.1에 비주얼 스튜디오 2013이라고? 쩝... 윈도우부터 깔아야겠네.. 이런 X....




   1: /// <summary>
   2:    /// FFMPEG을 이용해서 프레임을 추출함
   3:    /// FFMPEGManager Class 1.0
   4:    /// Program by kunmin00
   5:    /// </summary>
   6:    public class FFMpegManager
   7:    {
   8:        const int IMG_COUNT = 60;
   9:  
  10:        /// <summary>
  11:        /// FFMPEG 을 이용해서 프레임 추출하기 kunmin00
  12:        /// </summary>
  13:        /// <param name="mediaFileInfo"></param>
  14:        /// <returns></returns>
  15:        public static Boolean GrapImageFromMediafile(MediaFile mediaFileInfo)
  16:        {
  17:  
  18:            TimeSpan duration = mediaFileInfo.DurationTime;
  19:  
  20:            LogHelper.LogMessage("[FFMPEG 이미지 추출 시작] " + mediaFileInfo.FilePath);
  21:  
  22:            Process myProcess = new Process();
  23:            FileInfo mediafileinfo = new FileInfo(mediaFileInfo.FilePath);
  24:            string mediafilename = mediafileinfo.Name.Replace(mediafileinfo.Extension, "");
  25:  
  26:            string LogPath = Application.StartupPath +"\\Temp";
  27:  
  28:            GlobalFunction.Current_Mainform.ChangeProgressBar(0, IMG_COUNT);
  29:            //디렉토리 체크
  30:            if (!Directory.Exists(LogPath))
  31:            {
  32:                LogHelper.LogMessage("[템프 폴더 생성]");
  33:                Directory.CreateDirectory(LogPath);
  34:            }
  35:  
  36:            try
  37:            {
  38:                for (int i = 0; i < IMG_COUNT; i++)
  39:                {
  40:                    myProcess.StartInfo.UseShellExecute = false;
  41:                    // You can start any process, HelloWorld is a do-nothing example.
  42:                    myProcess.StartInfo.FileName = "FFMPEG\\ffmpeg.exe";
  43:                    TimeSpan time = TimeSpan.FromSeconds((duration.TotalSeconds / IMG_COUNT) * i + 1);
  44:                    myProcess.StartInfo.Arguments = "-ss " + GetTimeStringFromTimeSpan(time) + " -vframes 1 -i \"" + mediaFileInfo.FilePath + "\" -y -f image2 " + ".\\Temp\\" + mediafilename + "_" + time.TotalSeconds.ToString() + ".png" + " -threads 4 -an";
  45:                    myProcess.StartInfo.CreateNoWindow = true;
  46:                    myProcess.StartInfo.RedirectStandardOutput = false;
  47:                    myProcess.Start();
  48:  
  49:                    GlobalFunction.Current_Mainform.ChangeProgressBar((i+1) * 100 / IMG_COUNT, IMG_COUNT);
  50:                    LogHelper.LogMessage("[" + (i+1) + "번째 이미지 추출] " + mediafilename + "_" + time.TotalSeconds.ToString() + ".png");
  51:  
  52:                    myProcess.WaitForExit();
  53:  
  54:                    Thread.Sleep(1);
  55:             
  56:                }
  57:  
  58:                LogHelper.LogMessage("[FFMPEG 이미지 추출 종료] " + mediaFileInfo.FilePath);
  59:  
  60:                myProcess.Close();
  61:                myProcess = null;
  62:            }
  63:            catch (Exception ex)
  64:            {
  65:                ExceptionHelper.ShowException(ex);
  66:                return false;
  67:            }
  68:  
  69:            return true;
  70:        }
  71:  
  72:        public static String GetTimeStringFromTimeSpan(TimeSpan duration)
  73:        {
  74:            return duration.Hours.ToString("00") + ":" + duration.Minutes.ToString("00") + ":" + duration.Seconds.ToString("00");
  75:        }
  76:  
  77:    }

'Application Tech > C#,VB.NET' 카테고리의 다른 글

MS의 Project Oxford  (0) 2015.05.07