Bu yazımızda Azure Functions üzerinde bir fonkisyon yazacağız, yazacağımız fonksiyon Azure Blog Storage’ den bir resimi Computer Vision API Cognitive servisine upload edip analiz sonucunu bize getirecek ve fonksiyonumuz ilgili blob storage’e her resim yüklendiğinde aynı işlemi gerçekleştirecek.

İlk olarak Azure portal üzerinde bir Computer Vision API servisi oluşturmamız gerekiyor. Azure portalimize gidiyoruz ve “Create a resorce” kısmına tıklıyoruz. Karşımıza gelen blade de sol taraftan “AI + Cognitive Services” seçiyoruz ve sol taraftan “See all” linkine tıklıyoruz.

“AI + Cognitive Services” bladedinden aşağıda ki Cognitive Services kısmından “More” Linkini tıklıyoruz.

Yeni gelen Blade de Computer Vision API servisini seçiyoruz.

Yeni açılan blade de “Create” Tuşuna tıklıyoruz.

Her Azure kaynağın da olduğu gibi Computer Vision API ile ilgili ayarları seçiyoruz. Her Azure subscriptionunda aynı servisten bir adet ücretsiz plan seçebilirsiniz. F0 ücretsiz planı seçtikten sonra diğer ayarlarımı da giriyoruz ve “Create” tuşuna tıklıyoruz.

Servisimiz oluşturuluyor. Bu adımdan sonra Computer Vision API’ a istek göndermek için yazacağımız fonksiyon için bir Azure Functions Servisi oluşturmamız gerekiyor.

Azure Fonkisyonlar ile ilgili detayları ve nasıl Azure Fonksiyon uygulaması oluşturulduğunu aşağıda ki yazılarımızdan inceleyebilirsiniz.

Azure Functions Nedir?

Azure Function Kullanımı

Azure Functions uygulaması oluşturduktan sonra fonksiyon uygulamamıza gidiyoruz ve “Functions” kısmından yeni bir fonksiyon oluşturmak için New Functions kısmına tıklıyoruz.

Açılan yeni blade de Azure Functions şablonları gözüküyor. Burda “Blob trigger” şablonunu seçiyoruz.

Açılan ekranda Blob Trigger Azure Fonksiyonu için ayarları seçiyoruz.

Bu ekranda fonksiyon dilini ve ismini yazdıktan sonra aşağıdan bir Blob Storage hesabı seçmemiz gerekiyor. Burda mevcutta bulunan bir Azure Blob Storage hesabı kullanacağız.

Bunun için Storage Account Connection kısmında “New” linkini tıklıyoruz.

Burda eğer mevcut blog storage’iniz gözükmüyor ise blob storage tipinizin General Purpose olmamasından kaynaklanıyor olabilir. Kullanacağınız Blog Storage tipinizin General Purpose olmasına dikkat edin.

İlgili Blog Storage hesabını seçiyoruz.

Kullandığımız Blog Storage hesabında Images isimli bir container bulunuyor. Sizin de fotoğraflarınızı yüklemek için bir blob container oluşturmanız gerekiyor blob storage hesabınızda.

Son olarak yapmamız gereken ayar. “images” containerının yolunu göstermek. Burda full path yerine “images/{name}” şeklinde yazmamız gerekiyor.

Bu seçeneği de seçtikten sonra “Create” tuşuna tıklıyoruz ve fonksiyonumuz oluşturuluyor.

Servisi test etmek için “images” containerımıza örnek resimler yüklüyoruz.

Azure fonksiyonumuza geri dönüyoruz ve fonksiyonun çalışıp çalışmadığını test etmek için fonksiyonun test sekmesine bir resmin url’sini yazıyoruz.

Azure Fonksiyonumuz test etmek için yukarıda ki “Test” tuşuna tıklıyoruz ve 202 durum kodunu alıp almadığını kontrol ediyoruz.

Bu aşamada sıra Computer Vision API’ımıza istek yapacak methodlarımızı yazmakta. Aşağıda gerekli olan kod parçacıklarını bulabilirsiniz.

#r “Newtonsoft.Json”
#r “Microsoft.WindowsAzure.Storage”

using Microsoft.WindowsAzure.Storage.Blob;
using Newtonsoft.Json;
using System.Text;

public static async Task Run(CloudBlockBlob myBlob, string name, TraceWriter log)
{
log.Info($”C# Blob trigger function Processed blob\n Name:{name}”);

var uri = GetUri(myBlob);
var analysis = await GetAnalysis(uri);

log.Info($”results: {analysis}”);
}

public static Uri GetUri(CloudBlockBlob blob)
{
var sasPolicy = new SharedAccessBlobPolicy
{
Permissions = SharedAccessBlobPermissions.Read,
SharedAccessStartTime = DateTime.Now.AddMinutes(-30),
SharedAccessExpiryTime = DateTime.Now.AddMinutes(30)
};
var sasToken = blob.GetSharedAccessSignature(sasPolicy);
var uri = new Uri($”{blob.Uri.ToString()}{sasToken}”);
return uri;
}

public static async Task GetAnalysis(Uri uri)
{
var client = new HttpClient();
var data = JsonConvert.SerializeObject(new {url = uri.ToString()});
var request = new HttpRequestMessage
{
RequestUri = new Uri(“https://westeurope.api.cognitive.microsoft.com/vision/v1.0/analyze”),
Method = HttpMethod.Post
};

request.Headers.Add(“Ocp-Apim-Subscription-Key”,”fea3c660d8964098a25afc6d634d110d”);
request.Content = new StringContent(data, Encoding.UTF8,”application/json”);

var response = await client.SendAsync(request);
var result = await response.Content.ReadAsStringAsync();
return result;

}

Burda iki method implementasyonumuz var;

Bir tanesi GetUri, bu method ile sasPolicy ile blog storage’ımize SaSToken ile erişim sağlıyoruz.

Diğeri ise GetAnalysis, bu method ile cognitive servisimize istek gönderiyoruz.

Burda iki önemli ayar var, birisi Cognitive Servisimizin Uri’ı diğeri ise API Anahtarımız. Bunları Cognitive Servisimizden alıyoruz.

Cognitive Servisimizin yolu Computer Vision Services hizmetinde ki “Overview” bladedinde, sonuna biz sadece resim için hangi analiz methodunu kullanacağımızı belirttik(analyze, ocr vs.) Bu uygulamada genel analiz veren “/analyze” servisini seçtik.

Servis anahtarlarımız ise Cognitive Services API’ımız da “Keys” menüsünde.

Bu ayarlarımızı da yaptıktan sonra fonksiyonumuzu çalıştırıp analiz sonucunu görebiliriz.

Burda ilk çalıştırdığımızda, Test sekmesinde hangi url var ise o resmin sonucunu dönderecektir. Blob Storage de bulunan herhangi bir resim URL sini verebilirsiniz.

Daha sonrasında ise Blog Storage’ e her resim yüklediğinizde fonksiyon tetiklenecek ve otomatik çalışacak.

Bu model ile uygulamalarınızda ki bu tarz otomatik çalışması gereken işlemleri küçük kod parçaçıkları ile otomatize şekilde serverless PaaS micro veya nano servisler olarak tasarlayabilirsiniz.