Merhaba arkadaşlar, bu yazımda TensorFlow Lite kullanılarak elde edilmiş .tflite uzantılı dosyanın Flutter projesine entegre edilmesini inceleyeceğiz. Entegrasyonu eğitilmiş bir model üzerinden gerçekleştireceğiz, mobil kısmını anlatacağım bu bölümde bir model eğitme kısmına girmeyeceğim. Elinizde farklı uzantıda eğitilmiş bir modeliniz varsa, çıktısını .tflite’ a dönüştürüp kullanmanız da mümkündür.
Google tarafından Flutter için henüz resmi bir TensorFlow Lite paketi yayınlanmadı ancak geliştiricilerin paylaştığı Flutter “tflite” paketini kullanarak Flutter ile geliştirdiğimiz mobil uygulamalarımızı makine öğrenimiyle buluşturabiliyoruz. Mesela sağlık alanında cep telefonu kamerası ile ciltte yer alan ben, yara gibi problemlerin zararlı olup olmadığını taratabiliriz. Akciğer BT görüntüleri ile hastanın pnömoni belirtilerini inceleyebiliriz. İçerisinde benim de yer aldığım bir projede yine tflite kullanarak diyabetik retinopati hastalığının teşhisi için mobil uygulama geliştirildi. Bu proje retinayı, cep telefonu kamerasının ucuna takılan bir lens ile görüntülenip, dr hastalığına karar veren bir bir akıllı mobil uygulamaydı. Bunun gibi daha pek çok alanda geliştirdiğiniz modelleri, mobil uygulamanızda kullanabilirsiniz. Şimdi Flutter kısmına gelelim:
Öncelikle pubsec.yaml dosyamıza https://pub.dev/packages/tflite üzerinden tflite paketini ekleyelim.
dependencies:
tflite: ^1.0.5
Sonrasında, assets klasörüne model ekleyerek pubspec.yaml dosyasını güncelleyelim:
flutter:
assets:
- assets/modelAdi.tflite
- assets/labels.txt
assets klasörü içerisine .tflite uzantılı dosyanızla birlikte labels dosyanızı da metin belgesi olarak eklemeniz gerekmektedir. Örneği bir kedi – köpek fotoğraflarıyla eğitilmiş model için label.txt dosyası
0 Dog
1 Cat
0 köpeği, 1 kediyi işaret edecek şekilde olabilir.
Yapılandırmaları neredeyse tamamladık. android / app / build.gradle dosyasında bazı değişiklikler yapmamız gerekiyor. Android bloğunun altına aşağıdakileri ekleyelim:
aaptOptions {
noCompress 'tflite'
noCompress 'lite'
}
Hazırlıklar tamam!
TensorFlow lite gerçek zamanlı olarak sınıflandırma yaparak birden çok sonuç sağlıyor. Flutter’ın TensorFlow Lite ile birlikte çalışması gayet başarılı. İhtiyaç duyulan datasetleri Kaggle, IEEE DataPort gibi platformlardan edinerek eğitimlerinizi gerçekleştirebilirsiniz. Bu işin mutfağında Python yer alıyor. Google ML Kit ile de başarılı sonuçlar elde etmek mümkün ancak bu mutfakta ellerimize Python kesinlikle bulaşmalı diye düşünüyorum.
Dart kısmına gelecek olursak, image_picker paketini kullanarak projemize devam edebiliriz. pubsec.yaml dosyamıza image_picker paketini ekleyelim:
dependencies:
image_picker: ^0.6.7+7
Main.dart dosyası için import etmemiz gereken paketleri ekleyelim:
import 'package:flutter/material.dart';
import 'package:tflite/tflite.dart';
import 'package:image_picker/image_picker.dart';
import 'dart:io';
StatelessWidget kısmı için Scaffold içerisinde bir AppBar ekleyelim ve title olarak TFLite Örneği diyelim, body kısmı için birazdan tanımlayacağımız ResimSecimi() metodunu child olarak ekleyelim:
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('TFLite Örneği'),
centerTitle: true,
backgroundColor: Colors.black
),
body: Center(
child: ResimSecimi()
)
)
);
}
}
Bir StatefulWidget ve bir State sınıfı oluşturalım:
class ResimSecimi extends StatefulWidget {
@override
ResimSecimiState createState() => ResimSecimiState();
}
StatefulWidget sınıfını tanımlayalım:
class ResimSecimiState extends State {
}
Sıradaki işlem ihtiyacımız olan değişkenleri tanımlamak. Cihazdan gelecek olan görüntüyü tutmak için File tipinde bir imageURI değişkeni, sınıflandırma yapmak üzere kullanılacak String tipinde yüklenen görselin yolunu tutmak için path değişkeni ve TFLite ‘dan bize dönen sonucu tutmak için String tipinde bir result değişkeni tanımlayalım:
File imageURI;
String result;
String path;
Flutter’ın Future yapısını kullanarak ilk metodumuzu yazalım. getImageFromCamera() metodu adından da anlaşılacağı üzere mobil cihaz kamerası kullanılarak görüntülerin elde edilmesinde kullanılacak:
Future getImageFromCamera() async {
var image = await ImagePicker.pickImage(source: ImageSource.camera);
setState(() {
imageURI = image;
path = image.path;
});
}
Her zaman kameradan çekilen görsel kullanılmak istenilmeyebilir. Bu durum içinde cihaz depolamasında daha önceden yer alan imageları kullanabilmek için getImageFromGallery() metodunu kullanacağız.
Future getImageFromGallery() async {
var image = await ImagePicker.pickImage(source: ImageSource.gallery);
setState(() {
imageURI = image;
path = image.path;
});
}
benzer şekilde galeriden çekilen görsele ait nitelikler imageURI ve path değişkenlerinde tutulmakta. Artık görüntüyü aldık 🤓 Şimdi bu görüntüyü kullanarak sınıflandırma işlemlerimize devam edelim.
Future classifyImage() async {
await Tflite.loadModel(model: "assets/modelAdi.tflite",labels: "assets/labels.txt");
var output = await Tflite.runModelOnImage(path: path);
setState(() {
result = output.toString();
});
}
İlk olarak Tflite.loadModel ile modelimizi yüklüyoruz ve ardından modele kullanıcının seçtiği görsel yolunu vererek çalıştırıyoruz. Ardından sonucu result değişkeninde saklıyoruz. Görüntünün kendisi yerine yolu kullanıyoruz çünkü tflite paketi modeli File veri türlerinde çalıştıramaz. SetState () ‘de çıktıyı sonuç değişkeninde saklıyoruz. TFLite’ın kullanılabilmesi için gerekli yapıları tamamladık. Şimdi ise arayüz adımına geldik. Burada mantığın anlaşılması daha önemli olduğu için arayüze yalnızca 3 buton ekleyip projenin yürütülmesini sağlamak yeterli olacaktır. Butonlardan birisi kamerayı açmaya yarayacak olan fotoğraf çek butonu, galeriden seç butonu ve sınıflandırma işlemini başlatma butonu olacaktır.
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
imageURI == null
? Text('Resim seçilmedi.')
: Image.file(imageURI,
width: 300, height: 200, fit: BoxFit.cover),
Container(
margin: EdgeInsets.fromLTRB(0, 30, 0, 20),
child: FlatButton.icon(
icon: Icon(Icons.camera_alt),
onPressed: () => getImageFromCamera(),
label: Text('Kamerayı Aç'),
textColor: Colors.white,
color: Colors.blue,
padding: EdgeInsets.fromLTRB(12, 12, 12, 12),
)),
Container(
margin: EdgeInsets.fromLTRB(0, 0, 0, 0),
child: FlatButton.icon(
icon: Icon(Icons.image),
onPressed: () => getImageFromGallery(),
label: Text('Galeriden Seç'),
textColor: Colors.white,
color: Colors.orange,
padding: EdgeInsets.fromLTRB(12, 12, 12, 12),
)),
Container(
margin: EdgeInsets.fromLTRB(0, 30, 0, 20),
child: FlatButton.icon(
icon: Icon(Icons.play_circle_outline),
onPressed: () => classifyImage(),
label: Text('Görüntüyü Sınıflandır'),
textColor: Colors.white,
color: Colors.green,
padding: EdgeInsets.fromLTRB(12, 12, 12, 12),
)),
result == null
? Text(
'Sonuç:',
style: TextStyle(fontSize: 22),
)
: Text(result, style: TextStyle(fontSize: 22))
])));
}
Basit bir yapı için gerekli şeylerin hepsi bu kadar. Siz de mobil uygulama kısmını test etmek için hazır bir .tflite dosyası üzerinden deneyebilirsiniz. Ancak uygulamanızın başarısını artırmaya yönelik farklı yaklaşımlarla tflite paket özelliklerini de kullanmanız gereklidir.
Farklı Yaklaşımlar
Yukarıda tflite’ın basit kullanımını inceledik. Ancak tflite paketinin kullanımı yalnızca bununla sınırlı değil. Bu en basit haliyle bir kullanımdı. tflite paketi için farklı özellikler de mevcut. loadModel için farklı bir yaklaşım deneyebiliriz:
static Future<String> loadModel() async{
return Tflite.loadModel(
model: "assets/modelAdi.tflite",
labels: "assets/labels.txt",
);
}
void initState() {
super.initState();
TFLiteHelper.loadModel().then((value) {
setState(() {
modelLoaded = true;
});
});
}
Model yüklendikten sonra, TensorFlow lite’a görselleri sağlamak için kameradan veya dosya yöneticisinden gelen fotoğraf çıktısını kullanabiliriz.
await Tflite.runModelOnFrame(
bytesList: image.planes.map((plane) {
return plane.bytes;
}).toList(),
numResults: 5)
.then((value) { if (value.isNotEmpty) {
}});
Görüntü sınıflandırmada 2 çıktılı bir işlem için bazı özellikleri değiştirmek isteyebilirsiniz:
classifyImage(File image) async {
var output = await Tflite.runModelOnImage(
path: image.path,
numResults: 2,
threshold: 0.1,
imageMean: 125.5,
imageStd: 125.5
);
Sorularınızı aşağıdaki alana yorum olarak bırakabilirsiniz
İyi çalışmalar dilerim.
Emeğinize sağlık, çok faydalı bir yazı olmuş
Teşekkürler
çok güzel bir yazı olmuş cidden teşekkürler 🙂
Teşekkürler 🙂