Flutter | Flask Servisi’ne Request — OpenCV’den Resim Döndürmek
Flutter üzerinde kendi derin öğrenme modellerinizi çalıştırma, resim işleme, doğal dil işleme gibi ihtiyaçlarınız olduğunda Python tarafında bir web servis yazma ihtiyacınız olabiliyor. Bu yazımda temel olarak Flutter ile Flask servisi arasında nasıl temel olarak veri alışverişi yaparız onu anlamaya çalışacağız. Bunun için iki adet request’imiz olacak. Bunlar:
- String objesi
- Byte objesi
şeklinde olacak. String objesi aslında oldukça basit. Flutter’da bir form üzerinden girilen String veriyi post edip geriye aynı String’i döndürerek ekranda göstereceğiz.
Asıl can alıcı kısım ise Byte objesi olacak. Bu kısımda Flask servere bir resim dosyası göndercek , bu resmi Flask tarafında OpenCV yardımıyla gri formata çevirecek ve Flutter client’imize işlenmiş resmi geri döndüreceğiz. Bu işlem aslında resim veya videolar ile yapılan çoğu derin öğrenme süreci için de temel oluşturacak bir işlem. O halde vakit kaybetmeden başlayalım 🎯.
Öncelike uygulamamız şöyle gözükecek:
Tasarımdan ziyade servis işlemleri üzerinde durmak istiyorum. Kodlara zaten yazının sonundaki repodan ulaşabileceksiniz. Öncelikle String objesini post ettiğimiz servis metodumuza bakalım:
Bu metot dışarıdan aldığı String türündeki veriyi belirlediğimiz url’e post etmekten sorumlu. Veriyi yollamak için jsonEncode ile String’i bir json objesi olarak sarmalıyoruz. Serverden dönecek değer de bir json olacağı için geriye dönen cevabı da deserialize ederek döndürüyoruz. Burada post işlemi için Dio paketini kullandım , dilerseniz http ‘de kullanabilirsiniz.
Gelelim resim dosyası post eden metota:
Burada isteğimizi yapmak için MultipartFile sınıfının static metodu olan fromFile içine gerekli alanları dolduruyoruz. MultipartFile klasik key-value şeklinde veri yollamanın yanı sıra byte türünde veriler içinde kullanılan bir sınıf. Diskteki resim yolundan okuma yapan fromFile metoduna çok basit şekilde kullanıcının galerisinden seçtiği File tipindeki resim yolunu parametre geçerek verimizi byte şeklinde Flask servere yollamış oluyoruz. Cevap olarak dönen json veriyi deserialize ettikten sonra ise base64Encode ile de servis tarafında base64 olarak decode edilmiş verimizi encode ederek resim için gereken ham veriyi elde etmiş oluyoruz. Base64 encode ve decode işlemi niçin gerekli diye sorarsanız , açılmış olan şu konuyu inceleyebilirsiniz.
Şimdi biraz da servis kısmını inceleyelim. Öncelikle String verimizi bize geri döndüren işleve bakalım:
Oldukça basit olan bu metotta gelen json değeri get_json metodu ile handle edebiliyoruz. Verilen force=True parametresi ise mimetype’ı ignore etmek için kullandık. Böylece client kısmında ekstradan application/json olarak mimetype belirtmedik. Ardından da verimizi tekrar json olarak json.dumps ile geri döndürdük.
Şimdi geldik yanarlı dönerli kısma :) :
Öncelikle resmimiz istediğimiz formatta mı onun bir kontrolünü sağlıyoruz. Adam pdf’de yükler yani şimdi 😁. Ardından gelen resmi static klasörü altına tanımladığımız bir klasöre save ediyoruz. Sonra save ettiğimiz bu dosyayı üzerinde işlem yapmak istediğimiz modele gönderiyoruz. Model basitçe gelen resim dosyasını rgb formattan grey formata çeviriyor ve byte olarak geri döndürüyor.
Ardından işlenmiş olan resmimizi imwrite metodu ile yine static klasörü altında belirlediğimiz bir klasöre yazıyoruz. Ardından resmi geri client tarafına yollamak için binary modunda bir okuma işlemi açarak base64 olarak encode edip ascii olarak decode ediyoruz (utf-8 de kullanılabilir). Ascii formata çevirme sebebimiz ise base64 olarak kodlanan verinin json string olarak serialize edilememesi.
Son olarak da resmimizi yine json formatında bu sefer bir key değeri de vererek geriye döndürüyoruz. Veee son :).
Servis tarafındaki modelde basitçe bir işlem yaptık fakat o ara katmanda istediğimiz işlemleri yapabiliriz. Örneğin bir resmi sınıflandırabiliriz veya farklı filtreler uygulayabilir , hatta bir derin öğrenme modeli de çalıştırabiliriz :). Kim bilir belki başka yazılara , bugünlük bu kadar.
Umarım faydalı olmuştur. Vakit ayırıp okuduğunuz için teşekkürler. Bol Flutter’lı günler :).
Proje linki: