한국의 개발자들을 위한 Google for Developers 국문 블로그입니다.
TensorFlow Lite로 Android에서 실시간으로 사람의 포즈를 추적해보세요
2019년 8월 30일 금요일
<
블로그 원문은 이곳
에서 확인하실 수 있으며 블로그 번역 리뷰는 강재욱(MachineLearning GDE)님이 참여해 주셨습니다>
게시자:
Eileen Mao
와
Tanjin Prity
, 2019년 하계 Google 엔지니어링 실습 인턴
PoseNet 모델
을 사용하여 Android에서 사람의 포즈 추정을 위한
TensorFlow Lite
샘플 애플리케이션을 발표했습니다. PoseNet은 주요 인체 부위의 위치를 감지하여 이미지나 동영상으로 부터 사람의 포즈를 추정하는 비전 모델입니다. 한 예로서, 이 모델은 이미지에서 사람의 팔꿈치 및/또는 무릎 위치를 추정할 수 있습니다. 포즈 추정 모델은 이미지에 나와 있는 사람이 누군지 식별하는 것이 아니라, 주요 인체 부위의 위치만 식별합니다.
TensorFlow Lite는 디바이스의 카메라를 활용하여 사람의 주요 인체 부위를 실시간으로 감지하고 표시하는 Android 샘플 애플리케이션을 제공합니다.
소스 코드
를 확인하세요!
이 모델이 흥미로운 이유는?
그것은 포즈 추정을 통해 수많은 어플리케이션의 가능성이 열리기 때문입니다. 몇 가지만 꼽자면, 개발자가 인체 이미지를 기반으로
현실을 증강
하고,
컴퓨터 그래픽 캐릭터를 애니메이션
으로 표현하고, 스포츠 선수의
특징적인 걸음걸이를 분석
할 수 있습니다. Google I/O’19에서 TensorFlow Lite는 사용자가 PoseNet 모델을 사용하여 춤추는 방법을 배우는 데 도움이 되는 앱인
Dance Like
를 선보인 바 있습니다.
앱 개발자와 머신러닝 전문가는 이 샘플 애플리케이션을 통해 가볍게 작동하는 모바일 모델의 가능성을 더욱 수월하게 탐구할 수 있을 것입니다.
PoseNet 샘플 애플리케이션
자바로 작성된 기존의 Android 예제와는 반대로,
PoseNet 샘플 앱
은 Kotlin으로 개발되었습니다. 이 앱의 개발 목표는 누구든 최소한의 오버헤드로 PoseNet 모델을 쉽게 사용할 수 있도록 하는 것입니다. 이 샘플 앱은 모델의 입출력에 대한 전후 처리를 담당하는 PoseNet 라이브러리를 포함합니다. 아래 다이어그램은 애플리케이션, PoseNet 라이브러리, TensorFlow Lite 라이브러리 간의 워크플로를 나타낸 것입니다.
PoseNet 앱 워크플로
PoseNet 라이브러리
PoseNet 라이브러리는 처리된 카메라 이미지를 선택하고 사람의 주요 인체 부위의 위치에 관한 정보를 반환하는 인터페이스를 제공합니다. 이 기능은 처리된 RGB 비트맵에서 TensorFlow Lite 인터프리터를 실행하고
Person
객체를 반환하는 메서드인
estimateSinglePose()
에 의해 제공됩니다.
이 페이지
에서는 PoseNet의 입력과 출력을 해석하는 방법을 설명합니다.
Person
클래스는 주요 인체 부위의 위치와 그와 관련된 신뢰도 점수를 함께 포함합니다. 어떤 사람의 신뢰도 점수는 각 주요 지점의 신뢰도 점수 평균으로, 이는 그 위치에 주요 지점이 존재할 확률을 나타냅니다.
각각의
KeyPoint
는 특정
BodyPart
의
Position
과 그 주요 지점의 신뢰도 점수에 관한 정보를 가지고 있습니다. 정의된 모든 주요 지점의 목록은
여기
에서 액세스할 수 있습니다.
PoseNet 샘플 앱
PoseNet
샘플 앱
은 카메라에서 프레임을 캡쳐하고 이미지에 주요 지점을 실시간으로 오버레이하는 온디바이스 카메라 앱입니다.
이 애플리케이션은 각각의 수신 카메라 이미지에 대해 다음 단계를 수행합니다.
카메라 미리보기에서 이미지 데이터를 캡처하여 YUV_420_888에서 ARGB_888 형식으로 변환합니다.
RGB 형식의 프레임 데이터에서 픽셀을 보유할 Bitmap 객체를 만듭니다. 모델로 전달할 수 있도록 Bitmap을 모델 입력 크기에 맞게 자르고 크기를 조정합니다.
PoseNet 라이브러리에서 estimateSinglePose() 함수를 호출하여 Person
객체를 가져옵니다.
Bitmap의 크기를 화면 크기에 맞춰 다시 조정합니다. Canvas 객체에 새 Bitmap을 그립니다.
Person 객체에서 얻은 주요 지점의 위치를 사용하여 캔버스에 골격을 그립니다. 기본적으로 0.2로 설정된 임계값 이상의 신뢰도 점수를 가진 주요 지점을 표시합니다.
포즈 렌더링을 카메라 프레임과 동기화하기 위해, 포즈와 카메라에 대해 별도의 View 인스턴스를 사용하는 대신 출력 표시를 위해 단일 SurfaceView를 사용했습니다. SurfaceView는 View 캔버스에서 가져오기, 잠금 및 그리기를 통해 지연 없이 화면에 표면을 배치하는 작업을 처리합니다.
온디바이스 실행
GitHub
에서 소스 코드를 다운로드하고 실행 방법에 관한 안내는
README
를 참조하여 앱을 사용해 보실 것을 권해 드립니다.
로드맵에서
우리는 앞으로 다음을 비롯하여 이 샘플 앱에 대해 더 많은 기능을 탐구해보고자 합니다.
다중 포즈 추정
GPU delegating를 사용한 GPU 가속
NNAPI delegating를 사용한 NNAPI 가속
모델의 훈련 후 양자화로 지연 시간 감소
ResNet PoseNet 모델과 같은 추가 모델 옵션
올 여름 PoseNet 샘플 앱을 개발하는 과정은 정말 즐거운 일이었습니다! 이 앱을 통해 온디바이스 머신러닝에 더욱 쉽게 접근할 수 있기를 바랍니다. 이 앱을 사용하실 경우 #TFLite, #TensorFlow, #PoweredByTF를 사용해 우리와 공유해 주세요.
감사의 말
Tensorflow Lite 소프트웨어 엔지니어로서 우리를 이끌어준
Nupur Garg
와
Pulkit Bhuwalka
, PoseNet 모델을 만든
Tyler Zhu
, 동료 인턴인
Pavel Senchanka
, Pixel Camera 소프트웨어 엔지니어인
Clément Julliard
그리고
TensorFlow Lite
팀에 특별히 감사드립니다.
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
11월
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