문서)
https://docs.google.com/presentation/d/1IsY-A7oAAbMqX_si5tccmtJEbp0hjHNCQhIj0gf2XtY/edit?usp=sharing
Ncnn Mobilenet_V1 (https://github.com/nanamare/ncnn_mobilenet)
텐서 플로우는 구글의 머신러닝 프레임 워크이며, 텐서 플로우 라이트는 임베디드, 모바일 같은 플랫폼에서 사용하기 위해 최적화 되어 있는 구글에서 제공하는 라이브러리 입니다. NCNN
은 모바일 플랫폼에 최적화 된 고성능 신경망 추론 컴퓨팅 프레임 워크입니다. 특이하게도 "NCNN은 휴대 전화 CPU의 모든 알려진 오픈 소스 프레임 워크보다 빠르게 실행됩니다"라고 써져 있어 궁금하기도 하고 NCNN에 관심이 있어, 포스팅을 진행하게 되었습니다. (더 궁금하신 분들은 홈페이지 참조를 부탁드립니다.)
이 포스팅에서는 Mobilenet_V1_224이라는 동일한 모델을 동일한 핸드폰에서 추론(Classification)시켜 결과를 비교할 예정입니다. (제가 모바일 개발자인 만큼
속도 위주로 포스팅 할 예정입니다.)
Mobile Specification
Mate 10
Camera Resolution 1280 x 720 HD
Model
Mobilenet_V1_1.0_224 (https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet_v1.md)
1. 텐서 플로우 프레임 워크만을 이용해 추론
1 - 1
https://github.com/tensorflow/tensorflow/tree/r1.7/tensorflow/examples/android 에서 프로젝트를 다운 받습니다.
1 - 2
asset 폴더 아래 모델과 라벨 파일을 바꿔줍니다.
1 - 3
input, output 노드 네임만 바꿔주고, 인풋 이미지 사이즈를 맞춰 주시면 됩니다, 추가적으로 아웃풋 포맷 확인해 주시구요(Mobilenet이니 [1][1001]배열로 떨어지겠죠!) :) (노드 네임은 slim api중 그래프 구조를 읽는 함수를 사용하면 간단하게 알 수 있습니다.)
1 - 4
빌드 해보깅
20개식 5번 평균 낸 결과의 평균은 266.75 ms이 나왔습니다.
2. 텐서 플로우 라이트를 이용한 추론
1 - 1
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/toco/g3doc/cmdline_examples.md 처럼 toco를 사용하여 기존의 freeze_model.pb 를 -> optimized_model.pb -> optimized_model.tflite로 만들어 주셔도 되고 귀찮다면, https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/lite/g3doc/models.md 여기서 모델 파일을 제공해주기 때문에 다운 받으셔도 무방합니다.
1 - 2
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/lite/examples 를 다운 받아 실행 해보면 Asset 폴더 아래 SSD Detection mobilenet v1, Mobilenet_v1, Mobilenet_quantization_v1 등이 생겨있습니다. 우리가 확인하고 싶은것은 Mobilenet_v1 입니다. (다른 모델을 원하시면 모델 다운받는 빌드 스크립트 수정 필요)
1 - 3
TF-lite는 .tflite 파일 안에 input, output node 네임이 명시 되어 있기 때문에 따로 바꿔줄 것은 없습니다. (위와 마찬가지로 input 이미지 사이즈, 결과 format는 확인해주세요.)
1 - 4
빌드 해보기
20개식 5번 평균 낸 결과의 평균은 134.24 ms가 나왔습니다 꽤나 빠르군요!! (참고로 quantization(UINT8) 버전은 평균 80ms 아래의 속도를 가졌습니다.)
3. NCNN 사용해서 추론 하기
(NCNN을 사용한 모바일넷 추론은 제 깃허브로 따로 링크 올려드리겠습니다.) 대략적인 큰 틀만 말씀드리겠습니다.
1 - 1
https://github.com/Tencent/ncnn/releases 에서 ncnn-android-lib을 받습니다. (사전에 Caffe가 설치 되어 있어야 합니다!!!)
1 - 2
https://github.com/shicai/MobileNet-Caffe 를 다운 받고 mobilenet.caffemodel, mobilenet_deploy.prototxt 파일을 => new_mobilenet_caffemodel, new_mobilenet_deploy_prototxt 파일로 바꿔준 후, 이 파일을 다시 new_mobilenet.bin, new_mobilenet_param 파일로 바꿔줍니다. (바꿔 줄때 mobilenet.id.h, mobilenet.mem.h 파일이 같이 만들어집니다.)
그 후 모델에 있는 파라미터를 암호화 하기 위해 new_mobilenet_param을 new_mobilenet_param_bin 파일로 한번 더 변환해 줍니다
(매우매우 귀찮고 불편하지만 하셔야 합니다.) https://blog.csdn.net/best_coder/article/details/76201275 (제가 참고 했던 사이트 입니다.)
1 - 3
앞에 단계 까지 하셨으면 이젠 간단합니다. 안드로이드 프로젝트를 열고 libncnn.a 정적 라이브러리를 이용해서 제가 코딩한 .cpp .h 파일들과 합쳐 .so 파일을 만들고 실행만 하면 됩니다. (카메라 쪽은 구글 카메라 샘플 코드를 가져와서 만들고, ndk는 ncnn 도큐먼트를 참여하며 개발하였습니다.)
1 - 4
빌드 해보기
20개식 5번 평균 낸 결과의 평균은 102.05 ms 가 나왔습니다. 라이트 보다 조금 더 빠르군요!
'Android > 미분류' 카테고리의 다른 글
안드로이드 Architecture 패턴 예제 코드(MVC, MVP, MVVM, LIVEDATA, KOIN, RXJAVA, DataBinding) (0) | 2019.08.06 |
---|---|
fire tracking sequence diagram (0) | 2018.01.09 |
Fire detection for mobile (5) | 2017.11.17 |
안드로이드 MVP 패턴에 대해 알아보자. (2) | 2017.09.22 |
안드로이드 객체 추출 최종결과 (2) | 2017.09.21 |