꿈이 너무 많은 한 대학생의 공간

5. Tensorflow Lite 로 숫자 인식하기 본문

튜토리얼 번역/손글씨 숫자 분류기 만들기

5. Tensorflow Lite 로 숫자 인식하기

청울울청 2020. 4. 22. 10:08

우리의 Tensorflow Lite 인터프리터의 준비가 완료되었고, 이제 입력값인 숫자 이미지를 인식하는 코드를 작성해 봅시다.

우리는 다음과 같은 것이 필요합니다:

 

- 입력값을 먼저 처리하는 것: Bitmap 개체를 입력값으로 들어온 이미지의 모든 픽셀 값을 포함하는 ByteBuffer 개체로 변환합니다. 우리는 Kotlin의 float 배열보다 더 빠른 ByteBuffer를 사용할 것입니다.

- 숫자 인식 시작

- 출력값 처리: 가능성을 포함한 배열을 사람이 읽을 수 있는 문자열로 변환

 

이제 코드를 작성해 봅시다.

 

1. DigitClassifier.kt 코드 내의 다음과 같은 내용을 찾아봅시다.

private fun classify(bitmap: Bitmap): String {
	...
}

입력값인 Bitmap 개체를 모델에게 주기 위해 ByteBuffer 개체로 변환하는 코드를 작성합니다.

조기 처리: 입력값으로 들어온 이미지를 모델이 입력받을 수 있는 형태로 변환
val resizedImage = Bitmap.createScaledBitmap(
	bitmap,
    inputImageWidth,
    inputImageHeight,
    true
)

val byteBuffer = convertBitmapToByteBuffer(resizedImage)

그리고 처리된 이미지를 이용해 숫자 인식을 시켜봅시다.

// 모델의 출력값을 포함할 배열을 정의합니다.
val output = Array(1) { FLoatArray(OUTPUT_CLASSES_COUNT) }

// 입력값과 함께 숫자 인식을 실행합니다.
interpreter?.run(byteBuffer, output)

그러면 가장 큰 가능성을 가진 숫자로 인식하고, 예측된 결과와 그에 대한 확신성을 사람이 읽을 수 있는 문자열로 반환합니다. 코드 블럭 앞부분의 return 부분을 다시 작성합니다.

// 조기 처리: 가장 큰 가능성을 가진 숫자를 찾고 사람이 읽을 수 있는 문자열로 변환
val result = output[0]
val maxIndex = result.indices.maxBy { result[it] } ?: -1
val resultString = "Predicion Result: %d\nConfidence: %2f".format(maxIndex, result[maxIndex])

return resultString

- 모델의 숫자인식 처리는 높은 성능을 요구하는 계산 처리이므로 우리는 UI thread를 피해 background thread 에서 실행해야 합니다. 

- 그 thread는 안전하지 않기에 Tensorflow Lite 인터프리터의 모든 호출을 인터프리터 전용 thread 를 통해 사용할 것입니다.

 

본 강의는 구글의 Codelab 강의 중 "Build a handwritten digit classifier app with Tensorflow Lite" 강의를 

번역할 것이며, 제가 직접 번역하였기에 오역과 의역이 있음을 알립니다.

Comments