한국의 개발자들을 위한 Google for Developers 국문 블로그입니다.
vFlat의 책 스캔에서 TFLite GPU 델리게이트를 사용한 실시간 추론 방법
2019년 9월 23일 월요일
게스트 게시자: 박근우, 김무궁, 한은성
<블로그 원문은
이곳
에서 확인하실 수 있으며 블로그 번역 리뷰는
박해선(MachineLearning GDE)
님이 참여해 주셨습니다>
vFlat의 조감도
다운로드해 사용할 수 있는 모바일 스캐닝 앱이 많이 있지만, 대부분의 앱은 평평한 문서를 디지털화하는 데 초점을 맞추고 있어 책을 펼쳤을 때처럼 굴곡진 페이지는 올바로 스캔하지 못할 때가 많습니다. 텍스트가 인쇄된 곡면 페이지를 스캔할 때, 책이나 출판물의 제본을 아예 뜯어내어 스캔하거나 그냥 있는 그대로의 이미지를 스캔한 후 불편하나마 카메라에서 캡처한 굴곡진 텍스트 이미지를 읽어내는 방법 중에서 선택해야 할 것입니다.
그게 바로 VoyagerX에서 이 문제를 딥러닝으로 해결하기 위해
vFlat
Android 앱을 개발한 이유입니다. vFlat 앱은 사용자가 곡면 페이지에 대해 걱정할 필요 없이 책을 쉽사리 스캔할 수 있도록 하는 것이 목표입니다. 또한 책 페이지의 경계를 자동으로 결정함으로써 사용자의 수동 입력을 줄이고자 합니다.
왼쪽: 일반 모바일 카메라로 캡처한 책의 곡면 페이지 이미지. 오른쪽: vFlat을 사용하여 같은 이미지를 스캔한 버전
사용자가 OCR(광학 문자 인식)을 통해 책 페이지를 찍은 사진에서 텍스트를 추출할 때 이 앱을 사용하면 편리합니다.
위의
‘왼쪽’ 이미지
에서 텍스트를 추출할 때, OCR은 일부 단어와 텍스트 줄이 너무 굴곡져 있기 때문에 올바로 인식하지 못합니다. 하지만 똑같은 OCR 기술을
'오른쪽' 이미지
에 적용하면 훨씬 더 높은 인식 성공률을 보이면서 오류가 거의 없는 텍스트를 추출할 수 있습니다.
vFlat 앱 내에서 이미지 B에 대한 OCR 결과
vFlat 앱의 구축 방법
우리는 곡면의 책 페이지를 평탄하게 하는 딥 러닝 모델을 개발했으며, 최상의 사용자 환경을 제공하기 위해 이 모델을 모바일에서 실행하기로 결정했습니다. vFlat 앱 내부에는 사용자가 평탄해진 책 페이지를 실시간으로 볼 수 있는 '실시간 미리보기' 기능이 있습니다(20FPS 이상). 사용자가 이 앱을 사용하는 것만으로 스캔한 페이지를 실시간으로 평탄한 이미지로 미리 볼 수 있다면 각도와 프레임을 조정한 후 사진을 찍을 수 있을 것입니다.
vFlat의 실시간 미리보기 기능
우리는 모바일 앱에서 실시간 추론을 달성하기 위해 훈련한 모델을 최적화하고 하드웨어 가속의 이점을 활용했습니다. 처음부터 스스로 OpenGL을 사용해 추론 모듈을 구현할 생각이었으므로, GLSL(OpenGL Shading Language)로 모델의 계층을 구현할 준비를 하고 있었습니다.
다행히도, 우리는 TensorFlow Lite의 GPU 지원 기능을 발견해 이를 사용해보기로 했습니다(이 글을 작성하던 당시에
‘tensorflow-lite-gpu’
패키지 버전이 ‘org.tensorflow:tensorflow-lite-gpu:0.0.0-nightly’로 업데이트되었음). 우리는 이 모델의 라이트 버전을 내놓기 위해 가중치 수와 복잡한 연산(ops)을 줄이고 하드웨어 가속을 위해 TFLite GPU 델리게이트(delegate)를 활용했습니다.
GPU는 CPU보다 컴퓨팅 성능이 우수하고 대량의 병렬 작업 부하를 처리할 수 있기 때문에 심층신경망이 매우 잘 맞습니다. 하지만 모바일 GPU를 사용하는 게 간단한 일은 아니며, 바로 이 지점에서 TFLite GPU 델리게이트가 필요합니다.
TFLite GPU 델리게이트는 모바일 GPU를 위한 신경망 그래프를 최적화하고 비동기식으로 실행되는 컴퓨트 셰이더(compute shader)를 생성하고 컴파일합니다. TFLite GPU 델리게이트 덕분에 자체 하드웨어 가속 추론 모듈을 구현할 필요가 없어져 수개월의 개발 시간을 절약했습니다.
TFLite GPU 델리게이트를 사용한 덕분에 시간과 에너지를 아꼈지만, 자체 모델을 TFLite 모델로 변환하고 이를 TFLite GPU 델리게이트와 통합하는 문제에 부딪혔습니다. GPU 델리게이트의 시험용 버전은 주로 MobileNet에 사용되는
연산만 지원
하고 우리가 만든 모델의 일부 연산은 지원하지 않았습니다.
모델의 성능을 저하시키지 않고 GPU 델리게이트를 활용하기 위해, 우리는 전체적인 네트워크 구조는 그대로 똑같이 유지하면서도 일부 연산을 바꾸어야 했습니다. 우리는 변환 과정 중에 어려움을 겪었습니다. 그 시점에는 아직 소스 코드가 공개되지 않았으므로 우리가 만난 오류의 원인을 정확히 짚어내기 힘들었습니다. (TFLite GPU 델리게이트를 위한 코드는 현재
GitHub
에 공개되어 있음)
예를 들어 TFLite GPU 델리게이트는 LeakyReLU 연산을 지원하지 않으므로, 우리는 그 대신에 지원되는 PReLU 연산을 다음과 같은 방식으로 활용해야 했습니다.
변경 전:
> tf.keras.layers.LeakyReLU(alpha=0.3)
변경 후:
> tf.keras.layers.PReLU(alpha_initializer=Constant(0.3), shared_axes=[1, 2], trainable=False)
하지만 PReLU 연산의 파라미터를 모든 축에 공유하여(shared_axes=[1,2,3]) 파라미터를 1개로 줄이려 할 때 예기치 않은 동작이 발생했습니다. 이 코드는 CPU 모드에서는 훌륭하게 작동했지만, GPU 델리게이트는 ‘Linear alpha shape does not match the number of input channels’(선형적인 알파의 크기가 입력 채널 수와 일치하지 않음)라는 오류 메시지와 함께 실패했습니다. 이런 이유 때문에 결국은 축 1과 2만 파라미터를 공유했습니다.
우리가 겪은 또 다른 문제는 네트워크의 Lambda 층에서 입력 데이터를 -1과 1 사이로 정규화할 때 발생했습니다.
> tf.keras.layers.Lambda(lambda x : (x / 127.5) — 1.0)
TFLite 컨버터
로 변환한 Lambda 층의 시각화
이 코드는 GPU 델리게이트에서 작동할 것처럼 보이지만, 실제로 실행해보면 경고 없이 CPU로 대체됩니다. 일반적으로 이런 문제가 발생할 때 TFLite는 'Failed to apply delegate. Only the first M ops will run on the GPU, and the remaining N on the CPU'(델리게이트를 적용하지 못했습니다. 처음 M개의 연산만 GPU에서 실행되고 나머지 N개의 연산=은 CPU에서 실행됩니다.)와 같은 경고 메시지를 표시합니다. 따라서 Lambda 계층을 사용할 때는 주의를 기울여 항상 실제 추론 시간을 측정한 후에 처리해야 합니다.
결론
다양한 Android 기기에 구현한 vFlat 모델의 CPU 추론 시간 대비 GPU 평균 추론 시간
지금까지 여러 가지 장애물이 있었지만, 우리는 TFLite GPU 델리게이트를 사용해 모델의 추론 시간을 절반 이상 단축했습니다. 마침내 평탄한 페이지가 실시간으로 표시되는 '실시간 미리보기' 기능을 사용자에게 제공할 수 있었습니다.
TFLite GPU 델리게이트 사용이 훌륭한 선택이었음을 자신있게 말씀드릴 수 있으며, 휴대기기에 훈련한 모델을 배포하려는 개발자는 TFLite GPU 델리게이트를 사용해보실 것을 적극 추천합니다.
자세히 알아보고 직접 사용해보려면
TensorFlow Lite GPU 델리게이트
를 읽어보세요.
Contents
ML/Tensorflow
Android
Flutter
Web/Chrome
Cloud
Google Play
Community
Game
Firebase
검색
Tag
인디게임페스티벌
정책 세미나
창구프로그램
AdMob
AI
Android
Android 12
Android 12L
Android 13
Android 14
Android Assistant
Android Auto
Android Games
Android Jetpack
Android Machine Learning
Android Privacy
Android Studio
Android TV
Android Wear
App Bundle
bootcamp
Business
Chrome
Cloud
Community
compose
Firebase
Flutter
Foldables
Game
gdg
GDSC
google
Google Developer Student Clubs
Google Play
Google Play Games
Interview
Jetpack
Jetpack Compose
kotlin
Large Screens
Library
ma
Material Design
Material You
ML/Tensorflow
mobile games
Now in Android
PC
Play Console
Policy
priva
wa
wear
Wearables
Web
Web/Chrome
Weeklyupdates
WorkManager
Archive
2024
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2023
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2022
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2021
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2020
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2019
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2018
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2017
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2016
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2015
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2014
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2013
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2012
12월
11월
10월
9월
8월
7월
6월
5월
3월
2월
1월
2011
12월
11월
Feed