이미지 인식우리의 뇌를 생각하면 시각적으로 인식하는 일은 쉬워 보인다. 보통 사람이라면 사자와 재규어를 구별할 줄 알고 표지판을 읽을 수 있으며 다른 사람의 얼굴 또한 어렵지 않게 인식할 수 있다. 그러나 이는 이미지를 인식하는 뇌의 능력이 놀라울 정도로 뛰어나기 때문에 가능한 것이지 이와 같은 일을 컴퓨터를 통해 해결하는 것은 매우 어려운 문제다. 지난 수 년간 기계학습 분야는 이미지 인식에 대해 엄청난 진전을 이루어 냈다. 특히 딥 러닝 기법의 하나인 convolutional neural network를 통해 혁신적인 성과를 거두었는데, 일부 분야에서는 사람의 인식 능력에 버금가거나 더 나은 결과를 보여주기도 했다. 연구자들은 학계에서 시작된 컴퓨터 비전 프로젝트인 ImageNet에서 자신들의 작업을 검증해왔고, 그들의 연구는 QuocNet, AlexNet, Inception (GoogLeNet), BN-Inception-v2와 같은 최신식 모델을 만들어냈다. 구글 내부 연구자와 외부 연구자 모두 이러한 모델을 설명하는 자료를 발표해 왔지만 자료가 널리 배포되고 있지는 않다. 그래서 TensorFlow는 구글이 개발한 이미지 인식의 가장 최신 모델인 Inception-v3를 활용하는 코드를 공개한다. Inception-v3는 ImageNet의 Large Visual Recognition Challenge에서 2012년 데이터를 사용하여 훈련된 모델이다. 모든 이미지를 "얼룩말", "달마시안", "식기세척기"와 같은 1000 classes로 분류하는 것이 컴퓨터 비전의 표준 작업이다. 다음의 예는 AlexNet이 몇 가지 사진을 분류한 결과이다: 모델의 성능을 비교할 때는 "top-5 error rate"를 측정한다. 이는 모델이 가장 높은 확률로 예측한 5가지 예측이 정답이 아닌 빈도를 검토하는 것이다. 2012년 검증 데이터 세트에서 나타난 각 모델의 top-5 error rate는 AlexNet이 15.3%, BN-Inception-v2이 6.66%였고 Inception-v3는 3.46%를 달성했다.
본 튜토리얼은 Inception-v3를 사용하는 방법을 알려줄 것이다. 먼저 Python이나 C++로 본 모델을 사용해서 이미지를 1000 classes로 분류하는 방법을 배운다. 그리고 이 모델을 통해 다른 이미지 인식 문제에서 다시 활용될 수 있는 고수준의 특징을 추출하는 방법 또한 논의할 것이다. 커뮤니티에서 이 모델을 어떤 모습으로 활용할지 기대되는 바이다. Python API로 사용하기프로그램이 처음 실행될 때 PIP 패키지에서 TensorFlow를 설치하고 터미널을 TensorFlow의 root 디렉토리로 설정한 후에 다음 명령어를 실행한다.
위 명령어는 다운로드 받았던 판다 곰의 사진을 분류한다. 만약 모델이 올바르게 작동한다면, 다음과 같은 내용이 출력된다:
다른 JPEG 이미지를 추가하려면
C++ API로 사용하기C++의 프로덕션 환경에서도 Inception-v3 모델을 사용할 수 있다. 모델을 정의하는 GraphDef를 담고 있는 아카이브를 다운로드 받는 방법은 아래와 같다: (단, TensorFlow repository의 root 디렉토리에서 실행한다)
다음으로 그래프를 불러오고 실행할 수 있는 코드를 담고 있는 C++ 바이너리를 컴파일 해야 한다. 만약 the instructions to download the source installation of TensorFlow에 나와 있는 지시사항을 자신의 플랫폼에 맞게 이행했다면, 터미널에서 다음과 같은 명령어를 실행하여 예제를 빌드할 수 있다:
위 명령어가 입력되면 실행 가능한 바이너리 파일이 생성될 것이다. 파일을 실행하는 명령어는 다음과 같다:
위 명령어는 프레임워크가 함께 전달되는 기본(default) 예제 이미지를 사용하며 아래와 유사한 내용이 출력된다:
기본 제공 이미지인 Admiral Grace Hopper 사진을 사용한 결과이다. 0.6이라는 높은 점수로 모델의 네트워크가 군복을 입고 있는 여성을 올바르게 인식하고 있음을 확인할 수 있다. 다음으로 --image= 인자를 추가하여 본인이 갖고 있는 이미지로 테스트해 볼 수 있다. 예를 들면 다음과 같다:
커맨드 라인 플래그(command line flags)는 파일을 불러온 위치와 입력된 이미지의 속성을 조정하는 기능을 한다. 모델은 정사각형 299x299 사이즈의 RGB 이미지를 취급하기 때문에 이를 이러한 값들이 마술처럼 신기해 보일 수 있는데, 이는 모델을 만든 원작자가 훈련용 입력 이미지로서 사용하고 싶은 것으로서 정의했던 내용일 뿐이다. 만일 사용자가 스스로 훈련시킨 그래프가 있다면, 자신의 훈련 프로세스에 적합하도록 사용자가 원하는 값으로 조정하면 된다. 이러한 값들이 [
가장 먼저 실행하거나 불러올 모델을 설정하기 위해
그 다음에 실행할 소형 모델(small model)의 노드를 생성한다. 이는 픽셀 값을 불러오고, 변경하고, 스케일링하는 데 사용되며 메인 모델(main model)의 입력값으로 쓰일 것이다. 첫 번째로 만든 노드는
그리고 나서 계속해서 노드를 추가하여, 파일 데이터를 이미지로 해독하고, 정수 값을 실수 값으로 바꾸고(scaling), 값의 크기를 변경하고(resizing), 마지막으로 픽셀값을 빼고 나누는 연산 과정을 거친다.
코드 마지막 줄에 변수
b에 담긴 모델 정의를 갖게 된다.
그 다음으로 이러한 작업은 지금까지 설명한 것은 C++에서 작은 TensorFlow 그래프를 그리는 간단한 예제이다. 그러나 미리 훈련된 Inception 모델에서는 파일에서 훨씬 더 큰 정의를 불러와야 하는데, 이때는
이미지를 불러오는 코드를 검토해봤다면 코드의 많은 부분이 익숙할 것이다.
그리고 나서
마지막으로
메인 그래프를 불러온다.
입력된 이미지를 불러오고, 사이즈를 조정(resize)하고 처리한다.
입력된 이미지를 사용하여, 불러온 그래프를 구현한다(Here we run the loaded graph with the image as an input).
테스트 목적으로 우리가 예상하는 결과를 얻도록 점검할 수 있다.
마지막으로 우리가 찾은 레이블을 출력한다.
여기서 오류 처리는 TensorFlow의 지금까지 대상을 인식하는 것에 대해 설명했지만, 다른 모든 영역에서도 사용자가 발견하거나 스스로 훈련시킨 다른 모델을 사용하여 이와 유사한 코드를 활용할 수 있다. 이 예제로 인해서 사용자들이 TensorFlow를 자신의 프로젝트에 사용하는 데 도움이 되길 바란다.
더 많은 학습을 위한 자료신경망(neural network)에 대해 전반적으로 알고 싶다면, Michael Nielsen의 free online book이 훌륭한 자료가 될 것이다. convolutional neural network에 한해서는 Chris Olah의 nice blog posts와 Michael Nielsen의 great chapter을 참조하면 된다. convolutional neural network을 사용하는 방법을 더 알고 싶다면 TensorFlow의 deep convolutional networks tutorial로 건너뛰거나 상대적으로 더 평이한 ML beginner 혹은 ML expert MNIST 입문자 튜토리얼로 시작해도 된다. 마지막으로 이 영역에 대한 연구에 박차를 가하고 싶다면, 이 튜토리얼이 참조한 모든 문서들의 최근 연구를 읽어보면 된다. |