Google은 흑인 공동체를 위한 인종적 평등을 추구하기 위해 노력하고 있습니다. 자세히 알아보기

TensorFlow Lite 및 Firebase로 앱에 추천 추가-Android Codelab

TensorFlow Lite 및 Firebase Codelab의 권장 사항에 오신 것을 환영합니다. 이 코드 랩에서는 TensorFlow Lite 및 Firebase를 사용하여 앱에 추천 모델을 배포하는 방법을 알아 봅니다. 이 코드 랩은이 TensorFlow Lite 예제를 기반으로합니다.

추천을 통해 앱은 기계 학습을 사용하여 각 사용자에게 가장 관련성이 높은 콘텐츠를 지능적으로 제공 할 수 있습니다. 그들은 과거의 사용자 행동을 고려하여 많은 다른 사용자의 집합 적 행동에 대해 훈련 된 모델을 사용하여 사용자가 미래에 상호 작용할 수있는 앱 콘텐츠를 제안합니다.

이 가이드에서는 Firebase Analytics로 앱 사용자로부터 데이터를 얻고 해당 데이터에서 추천을위한 머신 러닝 모델을 구축 한 다음 Android 앱에서 해당 모델을 사용하여 추론을 실행하고 추천을 얻는 방법을 보여줍니다. 특히, 사용자가 이전에 좋아했던 영화 목록을 고려할 때 사용자가 가장 볼 가능성이 높은 영화를 추천합니다.

배울 것

  • Firebase Analytics를 Android 앱에 통합하여 사용자 행동 데이터 수집
  • 해당 데이터를 Google Big Query로 내보내기
  • 데이터 사전 처리 및 TF Lite 추천 모델 학습
  • TF Lite 모델을 Firebase ML에 배포하고 앱에서 액세스합니다.
  • 사용자에게 권장 사항을 제안하는 모델을 사용하여 장치 추론에서 실행

필요한 것

  • Android Studio 버전 3.4 이상.
  • 샘플 코드.
  • Android 2.3 이상 및 Google Play 서비스 9.8 이상이 설치된 테스트 기기 또는 Google Play 서비스 9.8 이상이 설치된 에뮬레이터
  • 장치를 사용하는 경우 연결 케이블.

이 튜토리얼을 어떻게 사용 하시겠습니까?

읽어보기 그것을 읽고 연습을 완료하십시오

Android 앱 구축 경험을 어떻게 평가 하시겠습니까?

초심자 중급 능숙

명령 줄에서 GitHub 저장소를 복제합니다.

$ git clone https://github.com/FirebaseExtended/codelab-contentrecommendation-android.git

Android 스튜디오에서 codelab-recommendations-android 디렉토리 ( android_studio_folder.png ) 샘플 코드 다운로드 ( 파일 > 열기 > ... / codelab-recommendations-android / start)에서.

이제 Android Studio에서 시작 프로젝트를 열어야합니다.

새 프로젝트 만들기

  1. Firebase 콘솔로 이동합니다.
  2. 프로젝트 추가 (또는 첫 번째 프로젝트 인 경우 프로젝트 만들기 )를 선택합니다.
  3. 프로젝트 이름을 선택하거나 입력하고 계속을 클릭합니다.
  4. '이 프로젝트에 Google 애널리틱스 사용'이 사용 설정되어 있는지 확인하세요.
  5. Firebase 콘솔에서 나머지 설정 단계를 따른 다음 프로젝트 만들기 (또는 기존 Google 프로젝트를 사용하는 경우 Firebase 추가)를 클릭합니다.
  1. 새 프로젝트의 개요 화면에서 Android 아이콘을 클릭하여 설정 워크 플로를 시작합니다.
  2. 코드 랩의 패키지 이름 입력 : com.google.firebase.codelabs.recommendations
  3. 앱 등록을 선택 합니다 .

앱에 google-services.json 파일 추가

패키지 이름을 추가하고 등록을 선택한 후 google-services.json 다운로드를 클릭하여 Firebase Android 구성 파일을 가져온 다음 google-services.json 파일을 프로젝트의 app 디렉토리에 복사합니다. 파일을 다운로드 한 후 콘솔에 표시된 다음 단계를 건너 뛸 수 있습니다 (빌드-안드로이드-시작 프로젝트에서 이미 완료되었습니다).

앱에 google-services 플러그인 추가

google-services 플러그인은 google-services.json 파일을 사용하여 Firebase를 사용하도록 애플리케이션을 구성합니다. 다음 줄은 프로젝트의 build.gradle 파일에 이미 추가되어 있어야합니다 (확인하려면 확인).

app / build.grade

apply plugin: 'com.google.gms.google-services'

build.grade

classpath 'com.google.gms:google-services:4.3.4'

프로젝트를 gradle 파일과 동기화

앱에서 모든 종속성을 사용할 수 있는지 확인하려면이 시점에서 프로젝트를 gradle 파일과 동기화해야합니다. Android 스튜디오 툴바에서 File> Sync Project with Gradle Files 를 선택합니다.

이제 프로젝트를 Android Studio로 가져오고 JSON 파일로 google-services 플러그인을 구성 했으므로 처음으로 앱을 실행할 준비가되었습니다. Android 장치를 연결하고 실행 ( execute.png ) Android Studio 툴바에서.

앱이 기기에서 실행되어야합니다. 이 시점에서 영화 목록, 좋아요 표시 한 영화 탭 및 권장 사항 탭이있는 탭을 표시하는 작동하는 응용 프로그램을 볼 수 있습니다. 영화 목록에서 영화를 클릭하여 좋아요 목록에 추가 할 수 있습니다. 코드 랩의 나머지 단계를 완료하면 권장 사항 탭에서 영화 권장 사항을 생성 할 수 있습니다.

이 단계에서는 앱에 Firebase Analytics를 추가하여 사용자 행동 데이터 (이 경우 사용자가 좋아하는 영화)를 기록합니다. 이 데이터는 권장 모델을 학습하기 위해 향후 단계에서 집계로 사용됩니다.

Firebase Analytics 종속성 추가

앱에 Firebase Analytics를 추가하려면 다음 종속성이 필요합니다. app / build.gradle 파일 (확인)에 이미 포함되어 있어야합니다.

app / build.grade

implementation 'com.google.firebase:firebase-analytics-ktx:17.6.0'

앱에서 Firebase Analytics 설정

LikedMoviesViewModel 에는 사용자가 좋아하는 영화를 저장하는 함수가 포함되어 있습니다. 사용자가 새 영화를 좋아할 때마다 분석 로그 이벤트를 보내 좋아하는 것을 기록하고 싶습니다.

아래 코드와 함께 onMovieLiked 함수를 추가하여 사용자가 영화에서 좋아요를 클릭 할 때 분석 이벤트를 등록합니다.

LikedMoviesViewModel.kt

import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.analytics.ktx.analytics
import com.google.firebase.analytics.ktx.logEvent
import com.google.firebase.ktx.Firebase


class LikedMoviesViewModel internal constructor (application: Application) : AndroidViewModel(application) {

    ...

    fun onMovieLiked(movie: Movie) {
        movies.setLike(movie, true)
        logAnalyticsEvent(movie.id.toString())
    }
       
}

다음 필드와 함수를 추가하여 사용자의 좋아요 목록에 영화가 추가 될 때 Analytics 이벤트를 기록합니다.

LikedMoviesViewModel.kt

import com.google.firebase.analytics.FirebaseAnalytics
import com.google.firebase.analytics.ktx.analytics
import com.google.firebase.analytics.ktx.logEvent
import com.google.firebase.ktx.Firebase


class LikedMoviesViewModel internal constructor (application: Application) : AndroidViewModel(application) {
    ...
    private val firebaseAnalytics = Firebase.analytics

    ...

    /**
     * Logs an event in Firebase Analytics that is used in aggregate to train the recommendations
     * model.
     */
    private fun logAnalyticsEvent(id: String) {
        firebaseAnalytics.logEvent(FirebaseAnalytics.Event.SELECT_ITEM) {
            param(FirebaseAnalytics.Param.ITEM_ID, id)
        }
    }

이 단계에서는 앱에서 Analytics 이벤트를 생성하고 해당 이벤트가 Firebase 콘솔로 전송되고 있는지 확인합니다.

Analytics 디버그 로깅 활성화

Firebase Analytics는 사용자 배터리 수명을 최대화하도록 설계되었으며 기기에서 이벤트를 일괄 처리하고 가끔 Firebase에 전송합니다. 디버깅을 위해 셸에서 다음 명령을 실행하여 실시간으로 기록되는 이벤트를보기 위해이 동작을 비활성화 할 수 있습니다.

단말기

adb shell setprop debug.firebase.analytics.app com.google.firebase.codelabs.recommendations

Analytics 이벤트가 생성되었는지 확인

  1. Android 스튜디오에서 Logcat 창을 열어 앱의 로깅을 검사합니다.
  2. Logcat 필터를 "Logging event"문자열로 설정합니다.
  3. 앱에서 영화를 좋아할 때마다 "select_item"Analytics 이벤트가 발생하는지 확인하십시오.

이제 Firebase Analytics를 앱에 성공적으로 통합했습니다. 사용자가 앱을 사용하고 영화를 좋아하면 좋아하는 항목이 집계되어 기록됩니다. 이 코드 랩의 나머지 부분에서이 집계 데이터를 사용하여 권장 사항 모델을 학습 할 것입니다. 다음은 Logcat에서 본 것과 동일한 Analytics 이벤트가 Firebase 콘솔로 스트리밍되는 것을 확인하는 선택적 단계입니다. 다음 페이지로 건너 뛰어도됩니다.

선택 사항 : Firebase 콘솔에서 애널리틱스 이벤트 확인

  1. Firebase 콘솔로 이동합니다.
  2. Analytics에서 DebugView 를 선택합니다.
  3. Android Studio에서 Run 을 선택하여 앱을 시작하고 좋아요 목록에 영화를 추가합니다.
  4. Firebase 콘솔의 DebugView에서 앱에 영화를 추가 할 때 이러한 이벤트가 기록되고 있는지 확인합니다.

Big Query는 많은 양의 데이터를 검사하고 처리 할 수있는 Google Cloud 제품입니다. 이 단계에서는 앱에서 생성 된 애널리틱스 데이터를 자동으로 Big Query로 내보내도록 Firebase 콘솔 프로젝트를 Big Query에 연결합니다.

Big Query 내보내기 사용

  1. Firebase 콘솔로 이동합니다.
  2. 프로젝트 개요 옆에있는 설정 톱니 바퀴 아이콘을 선택한 다음 프로젝트 설정 을 선택합니다.
  3. 통합 탭을 선택합니다.
  4. BigQuery 블록 내에서 링크 (또는 관리 )를 선택합니다.
  5. Firebase와 BigQuery 연결 정보 단계에서 다음 을 선택합니다.
  6. 통합 구성 섹션에서 스위치를 클릭하여 Google 애널리틱스 데이터 전송을 활성화 하고 BigQuery에 연결을 선택합니다.

이제 Firebase 콘솔 프로젝트가 Firebase Analytics 이벤트 데이터를 Big Query에 자동으로 전송하도록 설정했습니다. 추가 상호 작용없이 자동으로 발생하지만 BigQuery에서 분석 데이터 세트를 만드는 첫 번째 내보내기는 24 시간 동안 발생하지 않을 수 있습니다. 데이터 세트가 생성 된 후 Firebase는 지속적으로 새 애널리틱스 이벤트를 Big Query로 일중 테이블로 내보내고 이벤트 테이블에서 지난 날의 이벤트를 그룹화합니다.

추천 모델을 학습하려면 많은 데이터가 필요합니다. 대량의 데이터를 생성하는 앱이 아직 없기 때문에 다음 단계에서는이 가이드의 나머지 부분에서 사용할 샘플 데이터 세트를 BigQuery로 가져옵니다.

이제 Firebase 콘솔을 연결하여 BigQuery로 내 보내면 앱 분석 이벤트 데이터가 잠시 후 BigQuery 콘솔에 자동으로 표시됩니다. 이 가이드의 목적을위한 몇 가지 초기 데이터를 얻기 위해이 단계에서는 기존 샘플 데이터 세트를 BigQuery 콘솔로 가져와 추천 모델 학습에 사용합니다.

BigQuery로 샘플 데이터 세트 가져 오기

  1. Google 클라우드 콘솔에서 BigQuery 대시 보드로 이동합니다.
  2. 메뉴에서 프로젝트 이름을 선택하십시오.
  3. BigQuery 왼쪽 탐색 메뉴 하단에서 프로젝트 이름을 선택하여 세부 정보를 확인하세요.
  4. 데이터 세트 만들기를 선택하여 데이터 세트 만들기 패널을 엽니 다.
  5. 데이터 세트 ID로 'firebase_recommendations_dataset'를 입력하고 데이터 세트 만들기를 선택합니다.
  6. 새 데이터 세트는 프로젝트 이름 아래의 왼쪽 메뉴에 표시됩니다. 클릭하세요.
  7. 테이블 생성 패널을 엽니 다 테이블 만들기를 선택합니다.
  8. 테이블 만들기에서 'Google Cloud Storage' 선택합니다.
  9. GCS 버킷에서 파일 선택 입력란에 'gs : //firebase-recommendations/recommendations-test/formatted_data_filtered.txt'를 입력합니다.
  10. 파일 형식 드롭 다운에서 'JSONL'을 선택합니다.
  11. 테이블 이름으로 'recommendations_table'을 입력합니다.
  12. 스키마> 자동 감지> 스키마 및 입력 매개 변수 아래의 체크 박스를 선택합니다.
  13. 테이블 만들기를 선택 합니다.

샘플 데이터 세트 살펴보기

이 시점에서 선택적으로 스키마를 탐색하고이 데이터 세트를 미리 볼 수 있습니다.

  1. 왼쪽 메뉴에서 firebase-recommendations-dataset 를 선택하여 포함 된 테이블을 확장합니다.
  2. 권장 사항 테이블을 선택하여 테이블 스키마를보십시오.
  3. 이 테이블에 포함 된 실제 Analytics 이벤트 데이터를 보려면 미리보기 를 선택하십시오.

서비스 계정 자격 증명 만들기

이제 다음 단계에서 BigQuery 데이터에 액세스하고로드하기 위해 Colab 환경에서 사용할 수있는 Google Cloud 콘솔 프로젝트에서 서비스 계정 사용자 인증 정보를 만듭니다.

  1. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인하세요.
  2. BigQuery 및 BigQuery Storage API API를 사용 설정합니다. < 여기를 클릭 >
  3. 서비스 계정 키 만들기 페이지로 이동합니다.
  4. 서비스 계정 목록에서 새 서비스 계정을 선택 합니다 .
  5. 서비스 계정 이름 필드에 이름을 입력합니다.
  6. 역할 목록에서 프로젝트 > 소유자를 선택하십시오.
  7. 만들기를 클릭합니다. 컴퓨터에 다운로드 한 키가 포함 된 JSON 파일입니다.

다음 단계에서는 Google Colab을 사용하여이 데이터를 사전 처리하고 권장 모델을 학습합니다.

이 단계에서는 Colab 노트북을 사용하여 다음 단계를 수행합니다.

  1. Colab 노트북으로 BigQuery 데이터 가져 오기
  2. 모델 학습을 위해 데이터를 전처리합니다.
  3. 분석 데이터에 대한 추천 모델 교육
  4. 모델을 TF 라이트 모델로 내보내기
  5. 앱에서 사용할 수 있도록 모델을 Firebase 콘솔에 배포합니다.

Colab 학습 노트북을 시작하기 전에 먼저 Firebase 모델 관리 API를 사용 설정하여 Colab이 학습 된 모델을 Firebase 콘솔에 배포 할 수 있도록합니다.

Firebase 모델 관리 API 사용

ML 모델을 저장할 버킷 생성

Firebase 콘솔에서 저장소로 이동하여 시작하기를 클릭합니다. fbbea78f0eb3dc9f.png

대화를 따라 버킷을 설정하십시오.

19517c0d6d2aa14d.png

Firebase ML API 사용

Google Cloud Console의 Firebase ML API 페이지로 이동하여 사용을 클릭합니다.

Colab 노트북을 사용하여 모델 학습 및 배포

다음 링크를 사용하여 colab 노트북을 열고 단계를 완료합니다. Colab 노트북에서 단계를 완료하면 앱에 동기화 할 수있는 TF lite 모델 파일이 Firebase 콘솔에 배포됩니다.

Colab에서 열기

이 단계에서는 Firebase Machine Learning에서 방금 학습 한 모델을 다운로드하도록 앱을 수정합니다.

Firebase ML 종속성 추가

앱에서 Firebase 머신 러닝 모델을 사용하려면 다음 종속성이 필요합니다. 이미 추가되어 있어야합니다 (확인).

app / build.grade

implementation 'com.google.firebase:firebase-ml-model-interpreter:22.0.4'

Firebase Model Manager API로 모델 다운로드

아래 코드를 RecommendationClient.kt 에 복사하여 모델 다운로드가 발생하는 조건을 설정하고 원격 모델을 앱에 동기화하는 다운로드 작업을 생성하십시오.

RecommendationClient.kt

    private fun downloadModel(modelName: String) {
        val remoteModel = FirebaseCustomRemoteModel.Builder(modelName).build()
        val firebaseModelManager = FirebaseModelManager.getInstance()
        firebaseModelManager
            .isModelDownloaded(remoteModel)
            .continueWithTask { task ->
                // Create update condition if model is already downloaded, otherwise create download
                // condition.
                val conditions = if (task.result != null && task.result == true) {
                    FirebaseModelDownloadConditions.Builder()
                        .requireWifi()
                        .build() // Update condition that requires wifi.
                } else {
                    FirebaseModelDownloadConditions.Builder().build(); // Download condition.
                }
                firebaseModelManager.download(remoteModel, conditions)
            }
            .addOnSuccessListener {
                firebaseModelManager.getLatestModelFile(remoteModel)
                    .addOnCompleteListener {
                        val model = it.result
                        if (model == null) {
                            showToast(context, "Failed to get model file.")
                        } else {
                            showToast(context, "Downloaded remote model")
                            GlobalScope.launch { initializeInterpreter(model) }
                        }
                    }
            }
            .addOnFailureListener {
                showToast(context, "Model download failed for recommendations, please check your connection.")
            }
    }



Tensorflow Lite 런타임을 사용하면 앱에서 모델을 사용하여 권장 사항을 생성 할 수 있습니다. 이전 단계에서 다운로드 한 모델 파일로 TFlite 인터프리터를 초기화했습니다. 이 단계에서는 먼저 추론 단계에서 모델에 동반 할 사전과 레이블을로드 한 다음 모델에 대한 입력을 생성하는 전처리를 추가하고 추론에서 결과를 추출 할 후 처리를 추가합니다. .

사전 및 레이블로드

추천 모델별로 추천 후보를 생성하는 데 사용되는 라벨은 res / assets 폴더의 sorted_movie_vocab.json 파일에 나열됩니다. 이러한 후보를로드하려면 다음 코드를 복사하십시오.

RecommendationClient.kt

    /** Load recommendation candidate list.  */
    private suspend fun loadCandidateList() {
        return withContext(Dispatchers.IO) {
            val collection = MovieRepository.getInstance(context).getContent()
            for (item in collection) {
                candidates[item.id] = item
            }
            Log.v(TAG, "Candidate list loaded.")
        }
    }

전처리 구현

전처리 단계에서는 모델이 기대하는 것과 일치하도록 입력 데이터의 형식을 변경합니다. 여기에서 이미 많은 사용자 좋아요를 생성하지 않은 경우 자리 표시 자 값으로 입력 길이를 채 웁니다. 아래 코드를 복사하십시오.

RecommendationClient.kt

    /** Given a list of selected items, preprocess to get tflite input.  */
    @Synchronized
    private suspend fun preprocess(selectedMovies: List<Movie>): IntArray {
        return withContext(Dispatchers.Default) {
            val inputContext = IntArray(config.inputLength)
            for (i in 0 until config.inputLength) {
                if (i < selectedMovies.size) {
                    val (id) = selectedMovies[i]
                    inputContext[i] = id
                } else {
                    // Padding input.
                    inputContext[i] = config.pad
                }
            }
            inputContext
        }
    }


인터프리터를 실행하여 추천 생성

여기서는 이전 단계에서 다운로드 한 모델을 사용하여 사전 처리 된 입력에 대한 추론을 실행합니다. 모델의 입력 및 출력 유형을 설정하고 추론을 실행하여 영화 추천을 생성합니다. 다음 코드를 앱에 복사합니다.

RecommendationClient.kt

    /** Given a list of selected items, and returns the recommendation results.  */
    @Synchronized
    suspend fun recommend(selectedMovies: List<Movie>): List<Result> {
        return withContext(Dispatchers.Default) {
            val inputs = arrayOf<Any>(preprocess(selectedMovies))

            // Run inference.
            val outputIds = IntArray(config.outputLength)
            val confidences = FloatArray(config.outputLength)
            val outputs: MutableMap<Int, Any> = HashMap()
            outputs[config.outputIdsIndex] = outputIds
            outputs[config.outputScoresIndex] = confidences
            tflite?.let {
                it.runForMultipleInputsOutputs(inputs, outputs)
                postprocess(outputIds, confidences, selectedMovies)
            } ?: run {
                Log.e(TAG, "No tflite interpreter loaded")
                emptyList()
            }
        }
    }



후 처리 구현

마지막으로이 단계에서는 모델의 출력을 후 처리하여 신뢰도가 가장 높은 결과를 선택하고 포함 된 값 (사용자가 이미 좋아 한 영화)을 제거합니다. 다음 코드를 앱에 복사합니다.

RecommendationClient.kt

    /** Postprocess to gets results from tflite inference.  */
    @Synchronized
    private suspend fun postprocess(
        outputIds: IntArray, confidences: FloatArray, selectedMovies: List<Movie>
    ): List<Result> {
        return withContext(Dispatchers.Default) {
            val results = ArrayList<Result>()

            // Add recommendation results. Filter null or contained items.
            for (i in outputIds.indices) {
                if (results.size >= config.topK) {
                    Log.v(TAG, String.format("Selected top K: %d. Ignore the rest.", config.topK))
                    break
                }
                val id = outputIds[i]
                val item = candidates[id]
                if (item == null) {
                    Log.v(TAG, String.format("Inference output[%d]. Id: %s is null", i, id))
                    continue
                }
                if (selectedMovies.contains(item)) {
                    Log.v(TAG, String.format("Inference output[%d]. Id: %s is contained", i, id))
                    continue
                }
                val result = Result(
                    id, item,
                    confidences[i]
                )
                results.add(result)
                Log.v(TAG, String.format("Inference output[%d]. Result: %s", i, result))
            }
            results
        }
    }


앱을 테스트하세요!

앱을 다시 실행하십시오. 몇 개의 영화를 선택하면 자동으로 새 모델을 다운로드하고 추천을 생성하기 시작합니다!

TensorFlow Lite 및 Firebase를 사용하여 앱에 추천 기능을 구축했습니다. 이 코드 랩에 표시된 기술과 파이프 라인은 일반화 할 수 있으며 다른 유형의 권장 사항을 제공하는 데에도 사용할 수 있습니다.

우리가 다룬 내용

  • Firebase ML
  • Firebase Analytics
  • 분석 이벤트를 BigQuery로 내보내기
  • 분석 이벤트 전처리
  • 학습 추천 TensorFlow 모델
  • 모델 내보내기 및 Firebase 콘솔에 배포
  • 앱에서 영화 추천 제공

다음 단계

  • 앱에서 Firebase ML 권장 사항을 구현합니다.

더 알아보기

질문이있다?

문제보고