TensorImageUtils.bitmapToFloat32Tensor 함수 시간지연 문제 및 GPU 사용

안녕하십니까
pytorch object detection 예제를 참조하여 개발 중입니다.
Android에서 pytorch 모델을 사용하여 객체를 감지하려고합니다.
최초로 한번 모델을 불러오고 그 모델을 기반으로 객체 감지를 하고 있습니다.
실시간으로 이미지를 수신하고 이 이미지를 비트맵으로 수신하여 결과로 특정 객체를 표시합니다.

그러나 TensorImageUtils.bitmapToFloat32Tensor 함수와 mModule!!.forward(IValue.from(inputTensor)).toTuple() 에서 시간이 많이 소요되어 실제 들어오는 영상보다 3~4초 뒤에 객체 감지가 되어 싱크가 맞지않습니다.
gpu를 사용하고 있지않는 것으로 보입니다. 프로그램이 구동되는 모델은 갤럭시 탭 s7입니다.

bitmap = Bitmap.createBitmap(bmp, 0, 0, bmp.width, bmp.height, matrix, true)
var resizedBitmap = Bitmap.createScaledBitmap(bitmap,PrePostProcessor.mInputWidth,PrePostProcessor.mInputHeight,true)
inputTensor = TensorImageUtils.bitmapToFloat32Tensor(resizedBitmap,PrePostProcessor.NO_MEAN_RGB,PrePostProcessor.NO_STD_RGB)
outputTuple = mModule!!.forward(IValue.from(inputTensor)).toTuple()
outputTensor = (outputTuple as Array?)?.get(0)!!.toTensor()
output = outputTensor!!.dataAsFloatArray

시간을 단축시키는 방법이나 시간을 단축시키기 위하여 gpu를 이용하여 저 함수를 처리할 방법이 있나요?

현재 Pytorch쪽에서는 Vulkan 라이브러리를 이용해 가속화 하는 부분, NNAPI 활용해 가속화 하는 방법이 있는 것 같습니다. 튜토리얼로 정리된 내용이 있으니 참고해 보시면 좋을것 같습니다.

그리고 가속을 떠나서 속도가 많이 느려보이는데 어떤 모델을 사용 중이실까요? 가능하면 YOLO-V5와 같은 경량 모델을 활용해 보시는 것도 좋을것 같습니다.

2개의 좋아요

현재 yolo-v5 모델 사용 중입니다.

제가 말씀드린 시간이 소요되는 함수들은 모델과 관련이 없고 이미지를 처리하는 과정 혹은 계산과 관련된 함수들이지 않나요?

가속화하는 것을 파이썬에서 모델을 만드는 과정에서 해야하는건가요??
Vulkan 라이브러리나 NNAPI는 파이썬과 안드로이드 모두에서 적용해야하는것인가요?

위에 적어주신 코드는 비트맵을 생성하고 그걸 텐서로 변경한 뒤 모델 inference하고 결과까지 받아오는 내용으로 되어 있습니다.

만약에 YOLO-V5 모델을 사용중이신데 저렇게 느리다고 한다면 모델 초기화(initialize) 하는 부분이 매번(매 프레임) 호출되고 있지는 않은지 확인이 필요할 것 같네요.

가속화와 관련된 것은 모델을 기존에 학습하신 것을 변환하는 작업이 필요합니다. 파이썬에서 해주셔야 되고 학습한 모델 파일을 갖고 계시면 변환을 할 수 있습니다. (변환 후에 android에서 inference코드를 변경해야 될 수도 있습니다.) 어떤 가속을 하실 건지에 따라 다르기 때문에 자세한 내용은 document를 참고 하시면서 작업해 보셔야 할 것 같습니다.

2개의 좋아요

모델은 최초로 한번만 load하고 그 값을 변수로 가지고있고 그 변수를 호출하는 형태로 작업 중입니다.

vulkan 모델로 변환된 ptl 파일은 가지고 있는데 안드로이드에서 사용하기에는 문서도 별로 없고 꽤 복잡한 작업이 필요한 것으로 지금은 판단하고 있습니다.