Flutter에서 컴퓨터 비전 모바일 앱을 빌드하는 방법
게시 됨: 2020-04-22머신 러닝 기능은 오늘날의 애플리케이션에서 필수품이 되었습니다. 만족도를 높이고 청중이 원하는 탁월한 앱 경험을 제공할 수 있습니다. 최근 하드웨어 및 소프트웨어 최적화 덕분에 기계 학습 모델의 실행이 클라우드에서 모바일 장치 자체로 이동하고 있습니다.
이는 응답 대기 시간을 제거하고 개인 정보 문제를 해결함으로써 사용자 경험에 큰 영향을 미칩니다. 사용자가 화초를 가꾸는 데 도움이 되는 앱인 Planter를 구축하기로 결정했을 때 앱 시장에서 눈에 띄는 것이 AI라는 것을 알았습니다.
우리의 아이디어는 컴퓨터 비전 기술을 사용하여 이미지에서 관엽 식물의 유형을 인식하는 기능을 추가하는 것이었습니다. 기기 성능의 TensorFlow Lite 최적화 덕분에 앱은 사용자 기기에서만 분류 모델을 실행할 수 있습니다. 이 기사에서는 이미지 분류 모델을 빠르게 준비하고 Flutter로 개발한 앱에 배포하는 방법을 설명합니다.
Flutter에서 기계 학습 모듈 구축 – 단계별
소규모 데이터 문제 다루기
머신 러닝 모델을 구축하는 첫 번째 단계는 데이터 수집입니다. 교육 데이터 세트를 만들기 위해 Google 검색에서 식물 이미지를 다운로드할 수 있는 Google 이미지 다운로더를 사용했으며, 상업적 재사용에 대한 레이블이 지정된 권한과 함께 다음과 같은 짧은 스크립트를 사용했습니다.
$ googleimagesdownload --keywords "Zamioculcas zamiifolia" --usage_rights 라벨이 재사용 가능
최종 데이터 세트는 종당 약 70-170개의 이미지로 구성되었습니다. 그렇게 적은 데이터로 처음부터 잘 수행되는 이미지 분류 모델을 준비하는 것은 매우 어려웠을 것입니다.
다행스럽게도 데이터 세트가 각 클래스에 대해 약 100개의 예제로 구성되어 있더라도 고정밀 이미지 분류기를 구축하는 데 사용할 수 있는 사전 훈련된 강력한 인공 신경망이 공개적으로 제공됩니다. 사전 훈련된 모델을 사용하고 특정 사용 사례로 수정하는 이 기술을 전이 학습이라고 합니다.
데이터 증강
데이터 세트를 최대한 활용하기 위해 keras의 ImageDataGenerator 전처리 패키지를 사용했습니다. 이 패키지는 텐서 이미지 배치를 생성하여 즉석에서 확대합니다. 다음 변환을 사용했습니다.
- 수평으로 입력 뒤집기: horizontal_flip = True
- 범위에서 밝기 이동 값 설정: bright_range = (0.75, 1.25)
- 제공된 강도로 전단: 전단 범위 = 15
- 지정된 값을 곱하여 크기 조정: rescale=1./255
- 확대 및 축소: zoom_range=0.4
- 임의의 방향으로 이동: width_shift_range = 0.1, height_shift_range = 0.15
train_datagen_augment = ImageDataGenerator(회전 범위 = 30, horizontal_flip = 참, 밝기 범위 = (0.75,1.25), 전단 범위 = 15, 재조정 = 1./255, 확대/축소 범위=0.4, width_shift_range = 0.1, height_shift_range = 0.15)
훈련
ImageNet 데이터 세트에서 백만 개 이상의 이미지로 훈련된 합성곱 신경망인 NASNet-Mobile을 사용했습니다. NasNetMobile 아키텍처는 신경망 셀로 구축된 블록 세트로 구성됩니다.
Block은 normal convolutions, separable-convolutions, max-pooling, average-pooling, identity mapping 등을 포함하여 이미지 분류 신경망에서 알려진 변환을 포함하는 운영 모듈입니다. 네트워크는 다음 중 하나의 이미지에 할당하도록 훈련되었습니다. 동물, 꽃, 가구를 포함한 1000개의 카테고리. 결과적으로 네트워크는 광범위한 이미지에 대해 풍부한 기능 표현을 '학습'했습니다.
다음 단계를 완료하여 모델을 만들었습니다.
- 사전 훈련된 네트워크의 마지막 계층 제거
- 네트워크 끝에 컨볼루션 모델 추가
- 추가된 모델에서 오는 레이어를 제외하고 결합된 네트워크의 모든 레이어 고정
- 정확도 향상이 멈출 때까지 모델 학습
- 사전 훈련된 모델의 마지막 고정 컨볼루션 블록의 모든 레이어 고정 해제
- 정확도 향상이 멈출 때까지 모델 학습
- 5번과 6번 포인트를 5번 반복합니다.
- 전체 모델을 고정 해제하고 정확도 향상이 멈출 때까지 학습
모델 평가
Planter의 분류 모델은 사진을 기반으로 실내 식물에 식물 유형을 지정하려고 합니다. 모델은 사용자가 하나를 선택할 수 있는 가장 높은 확률을 할당한 세 가지 유형을 반환합니다. 모델을 평가하는 동안 다음 두 가지 측정항목을 사용했습니다.
- categorical_accuracy,
- top_k_categorical_accuracy(k=3일 때).
다음 그래프는 모델의 각 훈련 에포크에 대한 범주 정확도를 나타냅니다.

평가 세트의 최종 범주 정확도는 0.870이고 상위 3개 범주 정확도는 0.916입니다. 이러한 결과는 사용된 훈련 데이터 세트의 작은 크기를 고려하면 매우 만족스러웠습니다.
모델 변환
모바일 앱에서 keras 모델을 사용하려면 TensorFlow Lite FlatBuffer 객체로 변환해야 합니다. 이것은 아래 예제에 표시된 코드로 수행할 수 있습니다.
tensorflow.lite를 라이트로 가져오기 keras_model_path = "모델/keras_model" tflite_model_path = "모델/모델.tflite" model.save(keras_model_path) 변환기 = lite.TFLiteConverter.from_keras_model_file(keras_model_path) tflite_model = 변환기.convert() open(tflite_model_path, "wb").write(tflite_model)
이제 model/model.tflite 경로에 최적화된 모델이 저장되었으므로 다음을 사용하여 기본 모바일 앱에서 쉽게 사용할 수 있습니다.
- Core ML – iOS 앱용
- TensorFlow Lite Android 지원 라이브러리 – Android 앱용
이제 Planter에 대한 경험을 바탕으로 Flutter에서 해당 모델을 사용하는 방법을 보여 드리겠습니다.
왜 플러터인가?
Flutter는 Google이 소유한 UI 툴킷입니다. 단일 코드베이스에서 모바일, 웹 및 데스크톱용으로 고유하게 컴파일된 애플리케이션을 빌드하기 위해 만들어졌습니다. Flutter를 사용해야 할지 고민이라면 Miquido에서 Flutter로 개발한 Abbey Road Studios의 Topline 사례 연구인 이 기사를 읽는 것이 좋습니다.
tflite 라이브러리로 모델을 활용할 수 있습니다. TensorFlow Lite API에 액세스하기 위한 Flutter 플러그인입니다. iOS 및 Android 플랫폼 모두에서 이미지 분류, 객체 감지, Pix2Pix, Deeplab 및 PoseNet을 지원합니다.

Flutter 개발이 궁금하세요?
더 알아보기애플리케이션 개발 프로세스에서 다음 단계를 완료해야 했습니다.
- pubspec.yaml 파일에 tflite를 종속성으로 추가합니다.
- 자산 폴더를 만들고 레이블 파일과 모델 파일을 그 안에 넣습니다.
- pubspec.yaml에 다음을 추가합니다.
자산: - 자산/라벨.txt - 자산/mobilenet_v1_1.0_224.tflite
- 라이브러리 tflite를 가져옵니다.
가져오기 '패키지:tflite/tflite.dart';
- 모델 및 레이블 로드:
문자열 res = 대기 Tflite.loadModel( 모델: "자산/모델.tflite", 레이블: "assets/labels.txt", numThreads: 1 // 기본값은 1 );
- 이미지에서 모델 실행(예측):
var 인식 = Tflite.runModelOnImage( 경로: tfResizedImage.path, 이미지 표준: 255.0, num결과: 3, 임계값: 0.00001, 비동기: 사실 );
예측 출력의 형식은 다음 예와 같습니다.
[{신뢰도: 0.03441339731216431, 색인: 46, 레이블: Vriesea splendens}, {신뢰: 2.086162567138672e-7, 색인: 7, 레이블: Aphelandra squarrosa}, 레이블: 166, 지수: 1.1590116 }]
- 릴리스 리소스:
Tflite.close()를 기다립니다.
최종 결과
Planter를 사용하면 라이브러리에 이미지가 있는 식물을 추가할 수 있습니다. 식물의 사진을 찍거나 전화 갤러리에서 하나를 선택하여 이미지를 얻을 수 있습니다. 포함된 관엽식물 분류 모델은 가장 높은 확률로 인식된 3종을 반환하고 목록에 표시합니다.
종을 클릭하면 제안된 급수 및 비료 일정과 식물에 대한 몇 가지 추가 정보가 미리 채워진 양식이 포함된 식물 요약 보기로 이동합니다. 아래 플로우에서는 카메라폰으로 촬영한 이미지에서 Zamioculcas zamiifolia가 인식되는 예를 볼 수 있습니다.



기계 학습을 모바일로 이동하십시오!
이 기사에서는 모바일 앱에 사용자를 즐겁게 하는 AI 기능을 추가하는 것이 간단하고 빠를 수 있다는 것을 확신시키고 싶었습니다. 또한 모델 실행을 모바일로 이동하면 API 응답 대기 시간을 제거하여 사용자에게 즐거운 사용자 경험을 제공합니다. 또한 클라우드로 데이터를 보낼 필요가 없으므로 데이터 보안을 보장하는 데 도움이 됩니다.
Flutter와 iOS 및 Android 네이티브 앱 모두에 대한 코드를 동시에 컴파일하는 기능을 사용하면 많은 이점을 얻을 수 있습니다. 약간의 노력으로 앱을 시장에서 돋보이게 만들고 앱의 잠재고객 보유를 극대화할 수 있습니다.
다음 프로젝트에 대한 준비가 되셨습니까? 주저하지 말고 저희에게 연락하십시오!