선행 학습된 커스텀 오디오 분류 모델 빌드

1. 시작하기 전에

이전 Codelab에서는 오디오 분류를 위한 기본 앱을 빌드했습니다.

선행 학습된 모델에 없는 다양한 클래스의 오디오를 인식하도록 오디오 분류 모델을 맞춤설정하려면 어떻게 해야 하나요? 또는 자체 데이터를 사용하여 모델을 맞춤설정하려면 어떻게 해야 할까요?

이 Codelab에서는 선행 학습된 오디오 분류 모델을 맞춤설정하여 새 소리를 감지합니다. 자체 데이터를 사용하여 동일한 기법을 복제할 수도 있습니다.

기본 요건

이 Codelab은 머신러닝 경험이 있는 모바일 개발자를 위해 설계되었습니다. 다음을 잘 알고 있어야 합니다.

  • Kotlin과 Android 스튜디오를 사용한 Android 개발
  • 기본 Python 구문

실습 내용

  • 오디오 도메인에 대한 전이 학습 방법
  • 나만의 데이터 만드는 방법
  • Android 앱에 자체 모델을 배포하는 방법

준비물

  • 최신 버전의 Android 스튜디오 (v4.1.2 이상)
  • API 버전 23 (Android 6.0)의 Android 버전을 사용하는 실제 Android 기기
  • 샘플 코드
  • Kotlin의 Android 개발에 관한 기본 지식

2 새 데이터 세트

더 쉽게 사용할 수 있도록 이미 준비된 Birdsong 데이터 세트를 사용합니다. 모든 오디오 파일은 Xeno-canto 웹사이트에서 제공됩니다.

이 데이터 세트에는 다음 노래의 노래가 포함됩니다.

이름: House Sparrow

코드: houspa

콜롬비아 아르메니아에서 온 알레한드로 바이어 타마요가 설계한 새 집의 꽃새 이미지

[오디오]

이름: Red Crossbill(레드 크로스빌)

코드: redcro

Elaine Wilson의 Red Crossbill 새 이미지

[오디오]

이름: 흰 가슴살벌

코드: wbwwre1

저자가 모르고 있는 흰 빛의 나무숲의 이미지

[오디오]

이름: 밤나무로 장식한 안티파타

코드: chcant2

밤나무로 유명한 안트피타의 이미지

[오디오]

이름: Azara's Spinetail

코드: azaspi1

아자라의 스피니테일 새 이미지

[오디오]

이 데이터 세트는 ZIP 파일이며 그 콘텐츠는 다음과 같습니다.

  • 오디오를 녹음한 장소, 녹음된 장소, 사용 라이선스, 새 이름 등 각 오디오 파일의 모든 정보가 포함된 metadata.csv입니다.
  • 학습 및 테스트 폴더
  • 학습/테스트 폴더 안에는 각 조류 코드를 위한 폴더가 있습니다. 각 파일 안에는 해당 새에 대한 .wav 파일이 모두 있습니다.

오디오 파일은 모두 wav 형식이며 다음 사양을 따릅니다.

이 형식의 데이터를 예상하는 기본 모델을 사용하므로 이 사양은 중요합니다. 자세한 내용은 이 블로그 게시물에서 추가 정보를 확인할 수 있습니다.

전체 프로세스를 더 쉽게 하기 위해 컴퓨터에서 데이터 세트를 다운로드할 필요가 없으며 Google Colab에서 사용합니다 (이 가이드의 뒷부분 참조).

자체 데이터를 사용하려면 모든 오디오 파일을 이 형식으로 지정해야 합니다.

3. 샘플 코드 가져오기

코드 다운로드

다음 링크를 클릭하면 이 Codelab의 모든 코드를 다운로드할 수 있습니다.

또는 저장소를 클론합니다.

git clone https://github.com/googlecodelabs/odml-pathways.git

다운로드한 ZIP 파일의 압축을 해제합니다. 그러면 필요한 모든 리소스가 포함된 루트 폴더 (odml-pathways)가 압축 해제됩니다. 이 Codelab에서는 audio_classification/codelab2/android 하위 디렉터리의 소스만 필요합니다.

audio_classification/codelab2/android 저장소의 android 하위 디렉터리에는 두 디렉터리가 포함됩니다.

  • android_studio_folder.pngstarter: 이 Codelab에서 빌드하는 시작 코드입니다.
  • android_studio_folder.png최종: 완료된 샘플 앱의 완성된 코드입니다.

시작 앱 가져오기

먼저 시작 앱을 Android 스튜디오로 가져옵니다.

  1. Android 스튜디오를 열고 Import Project (Gradle, Eclipse ADT 등)를 선택합니다.
  2. 이전에 다운로드한 소스 코드에서 starter 폴더 (audio_classification/codelab2/android/starter)를 엽니다.

7c0f27882a2698ac.png

앱에서 모든 종속 항목을 사용할 수 있도록 하려면 가져오기 프로세스가 완료되었을 때 프로젝트를 Gradle 파일과 동기화해야 합니다.

  1. Android 스튜디오 툴바에서 Sync Project with Gradle Files ( b451ab2d04d835f9.png)를 선택합니다.

4. 시작 앱 이해

이 앱은 오디오 분류를 위한 첫 Codelab에서 빌드한 것과 동일합니다. 오디오 분류를 위한 기본 앱 만들기

코드에 관해 더 잘 이해하려면 계속하기 전에 이 Codelab을 실행하는 것이 좋습니다.

모든 코드는 MainActivity에 있으며, 가능한 한 단순하게 유지합니다.

요약하면 코드는 다음 작업을 처리합니다.

  • 모델 로드
val classifier = AudioClassifier.createFromFile(this, modelPath)
  • 오디오 레코더 만들기 및 녹음 시작
val tensor = classifier.createInputTensorAudio()

val format = classifier.requiredTensorAudioFormat
val recorderSpecs = "Number Of Channels: ${format.channels}\n" +
       "Sample Rate: ${format.sampleRate}"
recorderSpecsTextView.text = recorderSpecs

val record = classifier.createAudioRecord()
record.startRecording()
  • 추론을 실행할 타이머 스레드 만들기 scheduleAtFixedRate 메서드의 매개변수는 실행 시작 대기 시간과 후속 작업 실행 사이의 시간입니다. 아래 코드는 1밀리초 후 시작되며 500밀리초마다 다시 실행됩니다.
Timer().scheduleAtFixedRate(1, 500) {
...
}
  • 캡처된 오디오에서 추론 실행
val numberOfSamples = tensor.load(record)
val output = classifier.classify(tensor)
  • 점수가 낮은 경우 분류 필터링
val filteredModelOutput = output[0].categories.filter {
   it.score > probabilityThreshold
}
  • 화면에 결과 표시
val outputStr = filteredModelOutput.map { "${it.label} -> ${it.score} " }
   .joinToString(separator = "\n")

runOnUiThread {
   textView.text = outputStr
}

이제 앱을 실행하고 그대로 사용할 수 있지만 더 일반적인 선행 학습된 모델을 사용하고 있습니다.

5 Model Maker를 사용하여 커스텀 오디오 분류 모델 학습

이전 단계에서는 선행 학습된 모델을 사용하여 오디오 이벤트를 분류하는 앱을 다운로드했습니다. 하지만 모델을 관심 있는 오디오 이벤트에 맞춰 맞춤설정하거나 더 전문화된 버전으로 만들어야 하는 경우도 있습니다.

앞서 언급했듯이 새 소리의 모델을 전문화합니다. Xeno-canto 웹사이트에서 선별한 새들의 오디오가 포함된 데이터 세트입니다.

Colaboratory

다음은 Google Colab으로 이동하여 커스텀 모델을 학습시켜 보겠습니다.

커스텀 모델을 학습시키는 데 약 30분이 소요됩니다.

이 단계를 건너뛰려면 Colab에서 학습시킨 모델을 제공된 데이터 세트로 다운로드하고 다음 단계로 진행하세요.

6. Android 앱에 맞춤 TFLite 모델 추가

자체 오디오 분류 모델을 학습시키고 로컬로 저장했으므로 Android 앱의 애셋 폴더에 배치해야 합니다.

첫 번째 단계는 다운로드한 모델을 이전 단계의 앱 애셋 폴더로 옮기는 것입니다.

  1. Android 스튜디오의 Android 프로젝트 뷰에서 애셋 폴더를 마우스 오른쪽 버튼으로 클릭합니다.

7cca2c22ed8cf4c8.png

  1. 옵션 목록이 포함된 팝업이 표시됩니다. 파일 시스템 중 하나에서 폴더를 엽니다. 운영체제에 맞는 플랫폼을 찾아 선택합니다. Mac에서는 Finder에서 보기가 Windows에서는 탐색기에서 열기, Ubuntu에서는 표시에 표시가 됩니다.

95e0eca881d35f6b.png

  1. 다운로드한 모델을 폴더에 복사합니다.

이 과정을 완료하면 Android 스튜디오로 돌아가면 애셋 폴더 내에 파일이 표시됩니다.

52bda66abe201fe5.png

7 기본 앱에서 새 모델 로드

기본 앱은 이미 선행 학습된 모델을 사용하고 있습니다. 방금 학습한 지도로 교체합니다.

  1. TODO 1: 새 모델을 assets 폴더에 추가한 후 로드하려면 modelPath 변수의 값을 변경합니다.
var modelPath = "my_birds_model.tflite"

새 모델에는 2개의 출력 (헤드)이 있습니다.

  • 사용한 기본 모델의 더 일반적인 원본 출력(이 경우 YAMNet)입니다.
  • 훈련에 사용한 새에만 해당하는 보조 출력입니다.

이렇게 해야 합니다. YAMNet이 Silence와 같이 공통적인 여러 클래스를 잘 인식하기 때문입니다. 이렇게 하면 데이터 세트에 추가하지 않은 다른 모든 클래스에 대해 걱정할 필요가 없습니다.

이제 YAMNet 분류에서 조류 클래스의 점수가 높은 경우 다른 출력에서 새가 무엇인지 살펴볼 것입니다.

37ce1c14e9e2d1b0.png

  1. TODO 2: 읽기의 첫 번째 분류에서 '새' 소리라고 확실하게 인지합니다. 다음과 같이 필터링을 변경하여 새가 아닌 항목을 모두 필터링합니다.
val filteredModelOuput = output[0].categories.filter {
   it.label.contains("Bird") && it.score > .3
}
  1. TODO 3: 모델의 기본 헤드에서 오디오에 새 가능성이 있는 새를 감지하면 두 번째 헤드에 있는 새를 가져옵니다.
if (filteredModelOutput.isNotEmpty()) {
   Log.i("Yamnet", "bird sound detected!")
   filteredModelOutput = output[1].categories.filter {
       it.score > probabilityThreshold
   }
}

이제 모두 완료되었습니다. 방금 학습한 모델을 사용하도록 모델을 변경하는 것은 간단합니다.

다음 단계는 테스트입니다.

8 새 모델로 앱 테스트

오디오 분류 모델을 앱에 통합했으므로 테스트해 보겠습니다.

  1. Android 기기를 연결하고 Android 스튜디오 툴바에서 Run ( execute.png)을 클릭합니다.

앱이 새의 소리를 정확하게 예측할 수 있어야 합니다. 더 쉽게 테스트하려면 컴퓨터에서 (이전 단계에서의) 오디오 중 하나를 재생하면 휴대전화에서 해당 오디오를 감지할 수 있습니다. 완료되면 새 이름과 이름이 표시될 확률이 화면에 표시됩니다.

bec397de3c8aaf32.png

9. 축하합니다

이 Codelab에서는 Model Maker를 사용하여 나만의 오디오 분류 모델을 만들고 TensorFlow Lite를 사용하여 모바일 앱에 배포하는 방법을 배웠습니다. TFLite에 관해 자세히 알아보려면 다른 TFLite 샘플을 살펴보세요.

학습한 내용

  • 자체 데이터 세트 준비 방법
  • Model Maker를 사용한 오디오 분류를 위한 전이 학습 방법
  • Android 앱에서 모델을 사용하는 방법

다음 단계

  • 자체 데이터로 시도
  • 빌드한 결과물 공유

자세히 알아보기

질문이 있으신가요?

문제 신고