TensorFlow.js ile Node'da TFlite modelleri çalıştırmak için Coral Edge TPU'ları kullanın

1. Giriş

54e81d02971f53e8.png

Last Updated: 2022-04-11

Bu Codelab'de, Öğrenebilir Makine kullanarak bir görüntü sınıflandırma modelini nasıl eğiteceğinizi ve JavaScript için güçlü ve esnek bir makine öğrenimi kitaplığı olan TensorFlow.js'yi kullanarak Coral donanım hızlandırmasıyla nasıl uygulayacağınızı öğreneceksiniz. Web kamerasından alınan görüntüleri gösteren ve bunları Coral Edge TPU kullanarak sınıflandıran bir Electron uygulaması oluşturursunuz. Bu Codelab'in tamamen çalışan bir sürümü sig-tfjs GitHub deposunda mevcuttur.

Coral cihazına ihtiyacım var mı?

Hayır. Bu codelab'i Coral cihaz olmadan deneyebilir ve bunun yerine WebNN hızlandırıcıyı kullanarak masaüstü makinede yine iyi bir performans elde edebilirsiniz.

Ne oluşturacaksınız?

Bu codelab'de, görüntüleri sınıflandıran bir Electron uygulaması oluşturacaksınız. Uygulamanız:

  • Web kamerasından alınan görüntüleri, eğitmiş olduğunuz modelde tanımlanan kategorilere göre sınıflandırır.
  • Mevcutsa performansı artırmak için Coral hızlandırıcı kullanır.
  • Platformunuzda destekleniyorsa performansı artırmak için WebNN'yi kullanır.

Neler öğreneceksiniz?

  • Node.js'de TFLite modellerini çalıştırmak için tfjs-tflite-node NPM paketini yükleme ve ayarlama
  • Modelleri Coral cihazda çalıştırmak için Edge TPU çalışma zamanı kitaplığını yükleme
  • Coral Edge TPU kullanarak model çıkarımını hızlandırma
  • WebNN ile model çıkarımını hızlandırma

Bu codelab, Node.js'de TFLite'a odaklanmaktadır. Alakalı olmayan kavramlar ve kod blokları işaretlenmiştir ve yalnızca kopyalayıp yapıştırmanız için paylaşılmıştır.

Gerekenler

Bu Codelab'i tamamlamak için şunlar gerekir:

2. Hazırlanın

Kodu alma

Bu proje için ihtiyacınız olan tüm kodları bir Git deposuna yerleştirdik. Başlamak için kodu alın ve en sevdiğiniz geliştirme ortamında açın. Bu codelab için Raspberry Pi OS (64 bit) with desktop çalıştıran bir Raspberry Pi kullanmanızı öneririz. Bu sayede Coral hızlandırıcıyı kolayca bağlayabilirsiniz.

Önemle Tavsiye Edilir: Depoyu Raspberry Pi'ye klonlamak için Git'i kullanma

Kodu almak için yeni bir terminal penceresi açın ve depoyu klonlayın:

git clone https://github.com/tensorflow/sig-tfjs.git

Kod laboratuvarı için düzenlemeniz gereken tüm dosyalar tfjs-tflite-node-codelab dizininde (sig-tfjs içinde) bulunur. Bu dizinde starter_code, cpu_inference_working, coral_inference_working ve webnn_inference_working adlı alt dizinler yer alır. Bunlar, bu codelab'in adımlarıyla ilgili kontrol noktalarıdır.

Depodaki diğer dosyalar arasında, tfjs-tflite-node-codelab öğesinin bağlı olduğu NPM paketleri de bulunur. Bu dosyalardan herhangi birini düzenlemeniz gerekmez ancak ortamınızın doğru şekilde ayarlandığından emin olmak için bazı testlerini çalıştırmanız gerekir.

Edge TPU çalışma zamanı kitaplığını yükleme

Coral cihazları kullanmadan önce Edge TPU çalışma zamanı kitaplığını yüklemeniz gerekir. Platformunuza yönelik talimatları uygulayarak yükleyin.

Linux / Raspberry Pi'de

Linux'ta kitaplık, Google'ın PPA'sından Debian paketi olarak edinilebilir. x86-64 ve Armv8 (64 bit) mimarileri için libedgetpu1-std. İşlemciniz farklı bir mimari kullanıyorsa kaynaktan derlemeniz gerekir.

Google'ın Coral PPA'sını eklemek ve Edge TPU Runtime kitaplığını yüklemek için bu komutu çalıştırın.

# None of this is needed on Coral boards
# This repo is needed for almost all packages below
echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list
# This repo is needed for only python3-coral-cloudiot and python3-coral-enviro
echo "deb https://packages.cloud.google.com/apt coral-cloud-stable main" | sudo tee /etc/apt/sources.list.d/coral-cloud.list

curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

sudo apt-get update
sudo apt-get install libedgetpu1-std

Windows'da / Diğer İşletim Sistemlerinde

Önceden derlenmiş ikili dosyalar MacOS ve Windows'un x86-64 sürümlerinde kullanılabilir. Bu dosyalar, indirildikten sonra arşivde install.sh veya install.bat komut dosyası çalıştırılarak yüklenebilir.

Cihazınızı yeniden başlatma

Edge TPU Runtime yüklendikten sonra, yükleyicinin eklediği yeni Coral Udev kuralını etkinleştirmek için cihazı yeniden başlatın.

Coral cihazınızın algılandığını doğrulayın

Coral cihazınızın algılandığını ve çalıştığını doğrulamak için coral-tflite-delegate paketi ile ilgili entegrasyon testlerini çalıştırın. Bu paket, deponun kök dizininde bulunur. Entegrasyon testlerini çalıştırmak için Coral hızlandırıcınızı takın ve paketin dizininde şu komutları çalıştırın:

npx yarn
npx yarn build-deps
npx yarn test-integration

Şuna benzer bir çıkış görürsünüz:

yarn run v1.22.17
$ yarn build && yarn test-integration-dev
$ tsc
$ jasmine --config=jasmine-integration.json
Platform node has already been set. Overwriting the platform with node.
Randomized with seed 78904
Started

============================
Hi there 👋. Looks like you are running TensorFlow.js in Node.js. To speed things up dramatically, install our node backend, which binds to TensorFlow C++, by running npm i @tensorflow/tfjs-node, or npm i @tensorflow/tfjs-node-gpu if you have CUDA. Then call require('@tensorflow/tfjs-node'); (-gpu suffix for CUDA) at the start of your program. Visit https://github.com/tensorflow/tfjs-node for more details.
============================
WARNING: converting 'int32' to 'uint8'
.


1 spec, 0 failures
Finished in 2.777 seconds
Randomized with seed 78904 (jasmine --random=true --seed=78904)
Done in 6.36s.

Modeli TFLite'ta çalıştıracağınız için günlüklerde belirtilen @tensorflow/tfjs-node, yükleme konusunda endişelenmenize gerek yoktur.

Çıkışta Encountered unresolved custom op: edgetpu-custom-op varsa Coral cihazınız algılanmamıştır. Edge TPU çalışma zamanı kitaplığını yüklediğinizden ve Coral cihazını bilgisayarınıza taktığınızdan emin olun. Coral bağlamalarının Python sürümünü test etmek için Coral'ın Başlangıç Kılavuzu'nu da inceleyebilirsiniz. Python sürümü çalışmasına rağmen bu testler hâlâ başarısız oluyorsa lütfen hata raporu göndererek durumu bize bildirin.

Başlangıç kodunu çalıştırma

Artık başlangıç kodunu çalıştırmaya hazırsınız. Başlamak için aşağıdaki adımları uygulayın.

  1. tfjs-tflite-node-codelab dizini altındaki starter_code dizinine gidin.
  2. Bağımlılıkları yüklemek için npm install komutunu çalıştırın.
  3. Projeyi başlatmak için npm start komutunu çalıştırın. Bilgisayarınızın web kamerasından alınan video feed'ini gösteren bir uygulama açılır.

Başlangıç noktamız nedir?

Başlangıç noktamız, bu codelab için tasarlanmış temel bir Electron kamera uygulamasıdır. Kod, codelab'deki kavramları göstermek için basitleştirilmiştir ve hata işleme özelliği azdır. Üretim uygulamasında kodu yeniden kullanmayı seçerseniz hataları giderdiğinizden ve tüm kodu tam olarak test ettiğinizden emin olun.

Cihazın kamerasının canlı feed'ini içeren temel bir Electron uygulaması.

Başlangıç kodunu keşfetme

Bu başlangıç kodunda birçok dosya vardır ancak düzenlemeniz gereken tek dosya renderer.js'dır. Video feed'i ve HTML öğeleri de dahil olmak üzere sayfada gösterilenleri kontrol eder ve makine öğrenimi modelinizi uygulamaya eklediğiniz yerdir. Diğer dosyalar arasında bir index.html dosyası da bulunur ancak bu dosya yalnızca renderer.js dosyasını yükler. Electron için giriş noktası olan bir main.js dosyası da vardır. Uygulamanın yaşam döngüsünü kontrol eder. Bu kapsamda, uygulama açıldığında ne gösterileceği ve kapatıldığında ne yapılacağı da yer alır. Ancak bu dosyada herhangi bir değişiklik yapmanız gerekmez.

Hata ayıklayıcıyı açın

Bu codelab'i uygularken uygulamanızda hata ayıklamanız gerekebilir. Bu uygulama Electron tabanlı olduğundan Chrome hata ayıklayıcısı yerleşiktir. Çoğu platformda Ctrl + Üst Karakter + i tuşlarına basarak açabilirsiniz. Uygulamadan gelen günlükleri ve hata mesajlarını görmek için Konsol sekmesini tıklayın.

Burada keşfedilecek başka bir şey yok. O yüzden hemen görüntü sınıflandırıcıyı eğitmeye başlayalım.

3. Görüntü Sınıflandırıcı Eğitme

Bu bölümde, özel bir görüntü sınıflandırma modelinin TFLite ve Coral sürümlerini eğiteceksiniz.

Sınıflandırıcıyı eğitme

Görüntü sınıflandırıcı, giriş görüntülerini alır ve bunlara etiket atar. Bu codelab'de, tarayıcınızda bir modeli eğitmek için Öğrenebilir Makine'yi kullanırsınız. Bu bölümdeki eğitimi hızlandırmak için Raspberry Pi yerine masaüstü veya dizüstü bilgisayar kullanabilirsiniz ancak sonuçta elde edilen dosyaları Pi'ye kopyalamanız gerekir.

Artık modeli eğitmeye hazırsınız. Ne tür bir model eğiteceğinizden emin değilseniz eğitilmesi kolay bir model olan kişi algılayıcıyı kullanabilirsiniz. Bu model yalnızca kadrajda bir kişi olup olmadığını algılar.

  1. Öğrenebilir Makine eğitim sayfasını yeni bir sekmede açın.
  2. Image Project'i ve ardından Standard image model'i (Standart görüntü modeli) seçin.
  3. Her sınıf için resim örnekleri ekleyin. Bunu yapmanın en kolay yolu web kamerası girişini kullanmaktır. Sınıfları yeniden adlandırabilirsiniz.
  4. Her sınıf için yeterli veri topladığınızda (genellikle 50 örnek yeterlidir) Modeli Eğit'i tıklayın.

Modelin eğitimi tamamlandığında modelin çıkışının önizlemesini görürsünüz.

Bir model, iki sınıfa ait görüntüler üzerinde eğitilir.

Modele farklı girişler vermeyi deneyin. Yanlış sınıflandırılmış bir giriş bulursanız bunu eğitim verilerine ekleyin ve modeli yeniden eğitin.

  1. Modelin doğruluğundan memnun olduğunuzda Modeli Dışa Aktar'ı tıklayın. Modelin iki ayrı sürümünü indirmeniz gerekir.
  2. Modelinizi TensorFlow Lite kayan nokta modeli olarak dışa aktarın. Bu işlem, converted_tflite.zip adlı bir dosyayı indirir. CPU'da çalışır.
  3. Modelinizi TensorFlow Lite EdgeTPU modeli olarak dışa aktarın. Bu işlem, Coral Edge TPU'da çalışan converted_edgetpu.zip adlı bir dosyayı indirir.

4. Uygulamanızda CPU modelini çalıştırma

Bir modeli eğittiğinize göre artık onu uygulamanıza ekleyebilirsiniz. Bu bölümün sonunda uygulama, cihazın CPU'sunu kullanarak modelinizi çalıştırabilecek.

Model dosyasını uygulamaya ekleme

Sınıflandırıcıyı eğitirken indirdiğiniz converted_tflite.zip model dosyasını açın. Arşivde iki dosya var. model_uquant.tflite, model grafiği ve ağırlıkları da dahil olmak üzere kaydedilmiş TFLite modelidir. labels.txt, modelin tahmin ettiği sınıfların okunabilir etiketlerini içerir. Her iki dosyayı da modeldirectory içine yerleştirin.

Bağımlılıkları yükleme

Bir modeli yüklemek ve girişleri önceden işlemek için TensorFlow.js'den birkaç bağımlılık gerekir:

  • tfjs-tflite-node: TFLite modellerini Node.js'de çalıştırmak için TensorFlow.js'in paketi.
  • @tensorflow/tfjs: TensorFlow.js'nin ana paketi.

@tensorflow/tfjs zaten yüklü ancak tfjs-tflite-node'u şu komutla yüklemeniz gerekiyor:

npm install --save tfjs-tflite-node

Yüklendikten sonra renderer.js dosyasının en üstündeki uygulamaya ekleyin:

CODELAB 1. bölüm: tfjs-tflite-node'u içe aktarın.

const {loadTFLiteModel} = require('tfjs-tflite-node');

Modeli yükleme

Artık modeli yüklemeye hazırsınız. tfjs-tflite-node, bu işlemi yapabilmeniz için loadTFLiteModel işlevini sunar. Dosya yolundan, ArrayBuffer'dan veya TFHub URL'sinden modeller yükleyebilir. Modelinizi ve ağırlıklarını yüklemek için main işlevine şunu ekleyin:

CODELAB 1. bölüm: Modeli buraya yükleyin.

const modelPath = './model/model_unquant.tflite';
const model = await loadTFLiteModel(modelPath);
const labels = fs.readFileSync('./model/labels.txt', 'utf8')
      .split('\n');

Modeli çalıştırma

Modelinizi çalıştırmak için üç adım gerekir. Öncelikle, web kamerasından bir giriş karesi çekip önceden işlersiniz. Ardından, modeli bu karede çalıştırıp tahmin alırsınız. Ardından, tahmini sayfada gösterirsiniz.

Web kamerası girişini önceden işleme

Web kamerası şu anda yalnızca bir HTML öğesidir ve gösterdiği kareler JavaScript renderer.js dosyasında kullanılamaz. TensorFlow.js, web kamerasından kare çekmek için tf.data.webcam'i sağlar. Bu yöntem, kameradan kare çekmek için kolayca kullanılabilen bir capture() yöntem sunar.

Bunu kullanmak için main() uygulamasına bu kurulum kodunu ekleyin:

CODELAB 1. bölüm: tf.data.webcam'i burada kurun.

const tensorCam = await tf.data.webcam(webcam);

Ardından, her karede bir resim yakalamak için run() bölümüne aşağıdakileri ekleyin:

CODELAB 1. bölüm: Web kamerası karelerini buradan yakalayın.

const image = await tensorCam.capture();

Ayrıca her kareyi modelle uyumlu olacak şekilde önceden işlemeniz gerekir. Bu codelab'de kullanılan modelin giriş şekli [1, 224, 224, 3] olduğundan 224 x 224 piksellik bir RGB görüntüsü beklenir. tensorCam.capture()[224, 224, 3] şeklini verdiğinden tensörün önüne tf.expandDims ile fazladan bir boyut eklemeniz gerekir. Ayrıca, CPU modeli -1 ile 1 arasında bir Float32 girişi bekler ancak web kamerası 0 ile 255 arasında değerler yakalar. Giriş tensörünün aralığını [0, 255] değerinden [0, ~2] değerine değiştirmek için 127'ye bölebilir, ardından istediğiniz aralık olan [-1, ~1] değerini elde etmek için 1 çıkarabilirsiniz. Bunu yapmak için run() işlevindeki tf.tidy() bölümüne şu satırları ekleyin:

CODELAB 1. bölüm: Web kamerası karelerini burada önceden işleyin.

const expanded = tf.expandDims(image, 0);
const divided = tf.div(expanded, tf.scalar(127));
const normalized = tf.sub(divided, tf.scalar(1));

Tensörleri kullandıktan sonra elden çıkarmanız önemlidir. tf.tidy(), geri çağırmasında bulunan kod için bunu otomatik olarak yapar ancak eşzamansız işlevleri desteklemez. Daha önce oluşturduğunuz görüntü tensörünü dispose() yöntemini çağırarak manuel olarak atmanız gerekir.

CODELAB 1. bölüm: Web kamerası çerçevelerini burada bırakın.

image.dispose();

Modeli çalıştırın ve sonuçları görüntüleyin

Modeli önceden işlenmiş giriş üzerinde çalıştırmak için normalleştirilmiş tensörde model.predict() işlevini çağırın. Bu işlev, her etiketin tahmin edilen olasılığını içeren tek boyutlu bir tensör döndürür. Her etiketin olasılığını yüzde olarak elde etmek için bu olasılığı 100 ile çarpın ve modelin tahminini ekranda göstermek için başlangıç koduyla birlikte gelen showPrediction işlevini kullanın.

Bu kod, model.predict civarında stats.begin ve stats.end'e çağrı yerleştirerek tahminin ne kadar sürdüğünü ölçmek için stats.js'yi de kullanır.

CODELAB 1. bölüm: Modeli çalıştırın ve sonuçları burada gösterin.

stats.begin();
const prediction = model.predict(normalized);
stats.end();
const percentage = tf.mul(prediction, tf.scalar(100));
showPrediction(percentage.dataSync(), labels);

Uygulamayı yarn start ile tekrar çalıştırın. Modelinizden gelen sınıflandırmaları görmeniz gerekir.

TFLite CPU modeli, Electron uygulamasında çalışır. Web kamerasından gelen görüntüleri sınıflandırır ve her sınıf için güven değerlerini aşağıda gösterir.

Performans

Model, şu anki kurulumuyla CPU üzerinde çalışır. Bu durum masaüstü bilgisayarlar ve çoğu dizüstü bilgisayar için uygundur ancak Raspberry Pi veya başka bir düşük güç cihazında uyguluyorsanız istenmeyebilir. Raspberry Pi 4'te muhtemelen saniyede yaklaşık 10 kare görürsünüz. Bu hız, bazı uygulamalar için yeterli olmayabilir. Daha hızlı bir makine kullanmadan daha iyi performans elde etmek için Coral Edge TPU şeklinde uygulamaya özel silikon kullanabilirsiniz.

5. Coral modelini uygulamanızda çalıştırma

Coral cihazınız yoksa bu bölümü atlayabilirsiniz.

Bu codelab adımında, son bölümde yazdığınız koddan yararlanılır. Ancak temiz bir başlangıç yapmak istiyorsanız bunun yerine cpu_inference_working kontrol noktasını kullanabilirsiniz.

Coral modelini çalıştırma adımları, CPU modelini çalıştırma adımlarıyla neredeyse aynıdır. Temel fark, model biçimidir. Coral yalnızca uint8 tensörlerini desteklediğinden model nicelendirilir. Bu, modele iletilen giriş tensörlerini ve döndürdüğü çıkış tensörlerini etkiler. Bir diğer fark ise modellerin Coral TPU'da çalıştırılabilmesi için Edge TPU derleyicisi kullanılarak derlenmesi gerektiğidir. TeachableMachine bu adımı zaten tamamlamıştır ancak Coral dokümanlarını ziyaret ederek diğer modeller için bu işlemi nasıl yapacağınızı öğrenebilirsiniz.

Coral model dosyasını uygulamaya ekleme

Sınıflandırıcıyı eğitirken indirdiğiniz converted_edgetpu.zip model dosyasını açın. Arşivde iki dosya bulunur. model_edgetpu.tflite, model grafiği ve ağırlıkları da dahil olmak üzere kaydedilmiş TFLite modelidir. labels.txt, modelin tahmin ettiği sınıfların okunabilir etiketlerini içerir. Model dosyasını coral_model dizinine yerleştirin.

Bağımlılıkları yükleme

Coral modellerini çalıştırmak için Edge TPU çalışma zamanı kitaplığı gerekir. Devam etmeden önce kurulum talimatlarını uygulayarak yüklediğinizden emin olun.

Coral cihazlara TFLite temsilcileri olarak erişilir. Bunlara JavaScript'ten erişmek için coral-tflite-delegate paketini yükleyin:

npm install --save coral-tflite-delegate

Ardından, renderer.js dosyasının en üstüne şu satırı ekleyerek temsilciyi içe aktarın:

CODELAB 2. bölüm: Yetkiyi buraya aktarın.

const {CoralDelegate} = require('coral-tflite-delegate');

Modeli yükleme

Artık Coral modelini yüklemeye hazırsınız. Bu işlemi, CPU modeliyle aynı şekilde yaparsınız. Ancak artık Coral temsilcisini yüklemek için loadTFLiteModel işlevine seçenekler iletirsiniz.

CODELAB 2. bölüm: Yetkili modelini buradan yükleyin.

const coralModelPath = './coral_model/model_edgetpu.tflite';
const options = {delegates: [new CoralDelegate()]};
const coralModel = await loadTFLiteModel(coralModelPath, options);

Etiketler CPU modeliyle aynı olduğundan etiketleri yüklemeniz gerekmez.

CPU ile Coral arasında geçiş yapmak için düğme ekleme

Son bölümde eklediğiniz CPU modelinin yanına Coral modelini eklersiniz. İkisini de aynı anda çalıştırmak performans farklılıklarını görmeyi zorlaştırır. Bu nedenle, Coral ve CPU yürütmesi arasında geçiş yapmak için bir açma/kapatma düğmesi kullanılır.

Aşağıdaki kodu kullanarak düğmeyi ekleyin:

CODELAB 2. bölüm: Temsilci düğmesini burada oluşturun.

let useCoralDelegate = false;
const toggleCoralButton = document.createElement('button');
function toggleCoral() {
  useCoralDelegate = !useCoralDelegate;
  toggleCoralButton.innerText = useCoralDelegate
      ? 'Using Coral. Press to switch to CPU.'
      : 'Using CPU. Press to switch to Coral.';
}
toggleCoralButton.addEventListener('click', toggleCoral);
toggleCoral();
document.body.appendChild(toggleCoralButton);

Bu koşulu run() işlevine bağlayalım. useCoralDelegate değeri false olduğunda CPU sürümü çalıştırılmalıdır. Aksi takdirde Coral sürümü çalıştırılır (ancak şu an için herhangi bir işlem yapılmaz). CPU modelini çalıştırmadan önce kodu bir if ifadesiyle sarmalayın. Coral modeli kullandığı için expanded tensörünün if ifadesinin dışında bırakıldığını unutmayın.

CODELAB 2. bölüm: Burada temsilci kullanılıp kullanılmayacağını kontrol edin.

// NOTE: Don't just copy-paste this code into the app.
// You'll need to edit the code from the CPU section.
const expanded = tf.expandDims(image, 0);
if (useCoralDelegate) {
  // CODELAB part 2: Run Coral prediction here.
} else {
  const divided = tf.div(expanded, tf.scalar(127));
  const normalized = tf.sub(divided, tf.scalar(1));
  stats.begin();
  const prediction = model.predict(normalized);
  stats.end();
  const percentage = tf.mul(prediction, tf.scalar(100));
  showPrediction(percentage.dataSync(), labels);
}

Modeli çalıştırma

Modelin Coral sürümü, 0 ile 255 arasında uint8 tensörleri beklediğinden girişinin normalleştirilmesi gerekmez. Ancak çıkış, 0 ile 255 arasında bir uint8 tensörüdür. Gösterilmeden önce 0 ile 100 arasında bir kayan sayıya dönüştürülmesi gerekir.

CODELAB 2. bölüm: Coral tahmini burada çalıştırılır. (Bu, yukarıdaki kod snippet'inin bir parçasıdır)

stats.begin();
const prediction = coralModel.predict(expanded);
stats.end();
const percentage = tf.div(tf.mul(prediction, tf.scalar(100)), tf.scalar(255));
showPrediction(percentage.dataSync(), labels);

Uygulamayı yarn start ile tekrar çalıştırın. Bu durumda, Coral hızlandırıcıdan gelen sınıflandırmalar gösterilir.

CPU ve Coral modelleri uygulamada tek tek çalışır ve aralarında geçiş yapmak için bir düğme kullanılır. CPU modeli yaklaşık 20 FPS, Coral modeli ise yaklaşık 45 FPS elde eder.

Düğmeye basarak Coral ve CPU çıkarımı arasında geçiş yapabilirsiniz. Coral modelinin güven sıralamalarının CPU modeline göre daha az hassas olduğunu ve genellikle çift ondalık basamakla bittiğini fark edebilirsiniz. Bu hassasiyet kaybı, Coral'da nicelenmiş bir model çalıştırmanın sonucudur. Bu durum genellikle uygulamada önemli olmasa da aklınızda bulundurmanız gereken bir noktadır.

Performansla ilgili not

Gördüğünüz kare hızı, ön işleme ve son işlemeyi içerdiğinden Coral donanımının yeteneklerini yansıtmaz. Yalnızca model.predict çağrısını ölçen gecikme süresini (milisaniye cinsinden) göstermek için FPS ölçeri tıklayarak performans hakkında daha iyi bir fikir edinebilirsiniz. Ancak bu süre, tensörlerin TFLite yerel C bağlamalarına ve ardından Coral cihazına taşınması için gereken süreyi de içerdiğinden mükemmel bir ölçüm değildir. C++ ile yazılmış daha doğru performans karşılaştırmaları için EdgeTPU karşılaştırma sayfasını inceleyin.

Ayrıca, videonun Raspberry Pi yerine dizüstü bilgisayarda kaydedildiğini de belirtmek isteriz. Bu nedenle, farklı bir FPS görebilirsiniz.

Coral ön işlemesini hızlandırma

Bazı durumlarda, TFJS arka uçlarını değiştirerek ön işleme sürecini hızlandırabilirsiniz. Varsayılan arka uç, büyük ve paralelleştirilebilir işlemler için uygun olan WebGL'dir. Ancak bu uygulama, ön işleme aşamasında bu tür işlemlerin çoğunu yapmaz (kullandığı tek işlem, paralel olmayan expandDims işlemidir). Dosyanın en üstündeki içe aktarma işlemlerinden sonra bu satırı ekleyerek tensörleri GPU'ya ve GPU'dan taşımanın ek gecikmesini önlemek için CPU arka ucuna geçebilirsiniz.

tf.setBackend(cpu');

Bu durum, TFLite CPU modelinin ön işlemesini de etkiler. Bu model, paralelleştirildiği için bu değişiklikle birlikte çok daha yavaş çalışır.

6. WebNN ile CPU modelini hızlandırma

Coral hızlandırıcınız yoksa veya modeli hızlandırmak için başka bir yöntem denemek istiyorsanız WebNN TFLite temsilcisini kullanabilirsiniz. Bu temsilci, OpenVINO araç seti ile model çıkarımını hızlandırmak için Intel işlemcilere yerleştirilmiş makine öğrenimi donanımını kullanır. Bu nedenle, bu codelab'in kurulum bölümünde ele alınmayan ek koşulları vardır ve OpenVINO araç setini yüklemeniz gerekir. Devam etmeden önce kurulumunuzu desteklenen Hedef Sistem Platformları ile karşılaştırdığınızdan emin olun. Ancak WebNN temsilcisinin henüz macOS'i desteklemediğini unutmayın.

OpenVINO araç setini yükleme

OpenVINO araç seti, modelleri hızlandırmak için Intel işlemcilere yerleştirilmiş makine öğrenimi donanımını kullanır. Intel'den önceden derlenmiş bir sürümü indirebilir veya kaynaktan oluşturabilirsiniz. OpenVINO'yu yüklemenin çeşitli yolları vardır ancak bu Codelab'in amaçları doğrultusunda Windows veya Linux için yükleyici komut dosyasını kullanmanızı öneririz. Diğer sürümler uyumlu olmayabileceğinden 2021.4.2 LTS çalışma zamanı sürümünü yüklediğinizden emin olun. Yükleyiciyi çalıştırdıktan sonra, kabuğunuzun ortam değişkenlerini Linux veya Windows'a ( kalıcı çözüm) yönelik yükleme talimatlarında açıklandığı şekilde ya da webnn-tflite-delegate dizininde bulunan setupvars.sh (Linux) veya setupvars.bat (Windows) komutunu çalıştırarak yapılandırdığınızdan emin olun.

WebNN temsilcisinin çalıştığını doğrulama

WebNN temsilcisinin doğru çalıştığını doğrulamak için, deponun kök dizininde bulunan webnn-tflite-delegate paketi için entegrasyon testlerini çalıştırın. Entegrasyon testlerini çalıştırmak için paketin dizininde şu komutları çalıştırın:

# In webnn-tflite-delegate/
npx yarn
npx yarn test-integration

Şuna benzer bir çıkış görürsünüz:

WebNN delegate: WebNN device set to 0.
INFO: Created TensorFlow Lite WebNN delegate for device Default and power Default.

============================
Hi there 👋. Looks like you are running TensorFlow.js in Node.js. To speed things up dramatically, install our node backend, which binds to TensorFlow C++, by running npm i @tensorflow/tfjs-node, or npm i @tensorflow/tfjs-node-gpu if you have CUDA. Then call require('@tensorflow/tfjs-node'); (-gpu suffix for CUDA) at the start of your program. Visit https://github.com/tensorflow/tfjs-node for more details.
============================
label: wine bottle
score:  0.934505045413971
.


1 spec, 0 failures
Finished in 0.446 seconds
Randomized with seed 58441 (jasmine --random=true --seed=58441)
Done in 8.07s.

Buna benzer bir çıkış görürseniz bu, yapılandırma hatası olduğunu gösterir:

Platform node has already been set. Overwriting the platform with node.
Randomized with seed 05938
Started
error Command failed with exit code 3221225477.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

Bu çıkış, büyük olasılıkla OpenVINO'nun ortam değişkenlerini ayarlamadığınız anlamına gelir. Şimdilik bu ayarları setupvars.sh (Linux) veya setupvars.bat (Windows) komutunu çalıştırarak ayarlayabilirsiniz. Ancak Linux veya Windows ( kalıcı çözüm) talimatlarını uygulayarak bu ayarları kalıcı olarak ayarlayabilirsiniz. Windows kullanıyorsanız bu

setupvars.bat

Komut, Git bash'i desteklemez. Bu nedenle, bu komutu ve bu codelab'deki diğer komutları Windows komut isteminden uyguladığınızdan emin olun.

WebNN Delegate'i yükleme

OpenVINO yüklendiğine göre artık WebNN ile CPU modelini hızlandırmaya hazırsınız. Bu codelab bölümü, "Uygulamanızda CPU Modelini Çalıştırma" bölümünde yazdığınız kod üzerine kuruludur. Bu adımda yazdığınız kodu kullanabilirsiniz ancak Coral bölümünü zaten tamamladıysanız temiz bir başlangıç yapmak için cpu_inference_working kontrol noktasını kullanın.

WebNN temsilcisinin Node.js bölümü npmjs'de dağıtılır. Yüklemek için şu komutu çalıştırın:

npm install --save webnn-tflite-delegate

Ardından, renderer.js dosyasının en üstüne şu satırı ekleyerek temsilciyi içe aktarın:

CODELAB 2. bölüm: Yetkiyi buraya aktarın.

const {WebNNDelegate, WebNNDevice} = require('webnn-tflite-delegate');

WebNN temsilcisi, CPU veya GPU'da çalışmayı destekler. WebNNDevice, hangisinin kullanılacağını seçmenize olanak tanır.

Modeli yükleme

Artık modeli WebNN temsilcisi etkinleştirilmiş şekilde yüklemeye hazırsınız. Coral için farklı bir model dosyası yüklemeniz gerekiyordu ancak WebNN, TFLite ile aynı model biçimini destekler. WebNNDelegate'i etkinleştirmek için modele iletilen temsilciler listesine ekleyin:

CODELAB 2. bölüm: Yetkili modelini buradan yükleyin.

let webnnModel = await loadTFLiteModel(modelPath, {
  delegates: [new WebNNDelegate({webnnDevice: WebNNDevice.DEFAULT})],
});

Bu aynı model olduğundan etiketleri tekrar yüklemeniz gerekmez.

TfLite CPU ile WebNN arasında geçiş yapmak için düğme ekleme

Modelin WebNN sürümü hazır olduğuna göre WebNN ile TfLite CPU çıkarımı arasında geçiş yapmak için bir düğme ekleyin. Her ikisini de aynı anda çalıştırmak performans farklılıklarını görmeyi zorlaştırır.

Bu kodu kullanarak düğmeyi ekleyin (henüz modeller arasında geçiş yapılmayacağını unutmayın):

CODELAB 2. bölüm: Temsilci düğmesini burada oluşturun.

let useWebNNDelegate = false;
const divElem = document.createElement('div');
const toggleWebNNButton = document.createElement('button');
function toggleWebNN() {
  useWebNNDelegate = !useWebNNDelegate;
  toggleWebNNButton.innerHTML = useWebNNDelegate
      ? 'Using WebNN. Press to switch to TFLite CPU.'
      : 'Using TFLite CPU. Press to switch to WebNN.';
  divElem.hidden = useWebNNDelegate ? false : true;
}

toggleWebNNButton.addEventListener('click', toggleWebNN);
toggleWebNN();
document.body.appendChild(toggleWebNNButton);
document.body.appendChild(divElem);

Bu kod, sonraki bölümde WebNN ayarlarını yapılandırmak için kullanacağınız bir div öğesi de ekler.

WebNN cihazları arasında geçiş yapmak için bir açılır liste ekleme

WebNN, CPU ve GPU'da çalışmayı desteklediğinden aralarında geçiş yapmak için bir açılır liste ekleyin. Bu kodu, düğmeyi oluşturan kodun arkasına ekleyin:

// Create elements for WebNN device selection
divElem.innerHTML = '<br/>WebNN Device: ';
const selectElem = document.createElement('select');
divElem.appendChild(selectElem);

const webnnDevices = ['Default', 'GPU', 'CPU'];
// append the options
for (let i = 0; i < webnnDevices.length; i++) {
  var optionElem = document.createElement('option');
  optionElem.value = i;
  optionElem.text = webnnDevices[i];
  selectElem.appendChild(optionElem);
}

Uygulamayı çalıştırdığınızda artık varsayılan, GPU ve CPU'nun listelendiği bir açılır menü görürsünüz. Açılır liste henüz bağlanmadığı için bu seçeneklerden birini belirlemek şu an herhangi bir işlem yapmaz. Uygulamada, WebNN cihazının Varsayılan, GPU veya CPU olarak seçilebileceği bir açılır liste gösterilir.

Açılır listenin cihazı değiştirmesini sağlama

Açılır listeyi, kullanılan WebNN cihazını değiştirecek şekilde bağlamak için açılır liste seçici öğesinin change etkinliğine bir işleyici ekleyin. Seçilen değer değiştiğinde, temsilci seçeneklerinde karşılık gelen WebNN cihazı seçilerek WebNN modeli yeniden oluşturulur.

Aşağıdaki kodu, açılır listeyi ekleyen kodun ardından ekleyin:

selectElem.addEventListener('change', async () => {
  let webnnDevice;
  switch(selectElem.value) {
    case '1':
      webnnDevice = WebNNDevice.GPU;
      break;
    case '2':
      webnnDevice = WebNNDevice.CPU;
      break;
    default:
      webnnDevice = WebNNDevice.DEFAULT;
      break;
  }
  webnnModel = await loadTFLiteModel(modelPath, {
    delegates: [new WebNNDelegate({webnnDevice})],
  });
});

Bu değişiklikle birlikte, açılır liste her değiştirildiğinde doğru ayarlara sahip yeni bir model oluşturulur. Şimdi WebNN modelini bağlama ve çıkarım için kullanma zamanı.

WebNN modelini çalıştırma

WebNN modeli kullanıma hazır ancak WebNN ile TfLite CPU arasında geçiş yapma düğmesi henüz modeli değiştirmiyor. Modeli değiştirmek için öncelikle model değişkenini, TfLite CPU modelini kod laboratuvarının ilk bölümünde yüklediğiniz zamanki adından farklı bir adla yeniden adlandırmanız gerekir.

Aşağıdaki satırı değiştirin...

const model = await loadTFLiteModel(modelPath);

...bu satırla eşleşmesi için.

const cpuModel = await loadTFLiteModel(modelPath);

model değişkeni cpuModel olarak yeniden adlandırıldıktan sonra, düğmenin durumuna göre doğru modeli seçmek için bu değişkeni run işlevine ekleyin:

CODELAB 2. bölüm: Burada temsilci kullanılıp kullanılmayacağını kontrol edin.

let model;
if (useWebNNDelegate) {
  model = webnnModel;
} else {
  model = cpuModel;
}

Artık uygulamayı çalıştırdığınızda düğme, TfLite CPU ve WebNN arasında geçiş yapar. TFLite CPU modeli ile WebNN CPU ve GPU modelleri uygulamada çalışır. WebNN modellerinden biri etkin olduğunda, açılır menüde bu modeller arasında geçiş yapılır. CPU modeli yaklaşık 15 FPS, WebNN CPU modeli ise yaklaşık 40 FPS elde eder.

Entegre Intel GPU'nuz varsa WebNN CPU ve GPU çıkarımı arasında da geçiş yapabilirsiniz.

Performansla ilgili not

Gördüğünüz kare hızı, ön işleme ve son işlemeyi içerdiğinden WebNN'nin yeteneklerini temsil etmez. Yalnızca model.predict çağrısını ölçen gecikme süresini (milisaniye cinsinden) göstermek için FPS ölçeri tıklayarak performans hakkında daha iyi bir fikir edinebilirsiniz. Ancak bu süre, Tensor'ların TFLite yerel C bağlamalarına taşınması için gereken süreyi de içerdiğinden mükemmel bir ölçüm değildir.

7. Tebrikler

Tebrikler! Electron'da tfjs-tflite-node kullanarak ilk Coral / WebNN projenizi tamamladınız.

Özelliği deneyin ve çeşitli resimlerde test edin. Ayrıca, tamamen farklı bir şeyi sınıflandırmak için TeachableMachine'da yeni bir model de eğitebilirsiniz.

Özet

Bu codelab'de şunları öğrendiniz:

  • Node.js'de TFLite modellerini çalıştırmak için tfjs-tflite-node npm paketini yükleme ve ayarlama
  • Modelleri Coral cihazda çalıştırmak için Edge TPU çalışma zamanı kitaplığını yükleme
  • Coral Edge TPU kullanarak model çıkarımını hızlandırma
  • WebNN ile model çıkarımını hızlandırma

Yapabilecekleriniz

Artık çalışır durumda bir temeliniz olduğuna göre, bu makine öğrenimi modeli çalıştırıcısını üzerinde çalıştığınız gerçek dünya kullanım alanına genişletmek için hangi yaratıcı fikirleri üretebilirsiniz? Hızlı ve uygun fiyatlı çıkarım ile çalıştığınız sektörde devrim yaratabilir veya ekmek tam istediğiniz gibi göründüğünde kızartmayı durduracak şekilde bir tost makinesini değiştirebilirsiniz. Seçeneklerin sonu gelmez.

Daha ileri giderek Teachable Machine'in kullandığınız modeli nasıl eğittiği hakkında daha fazla bilgi edinmek için Aktarım Öğrenimi ile ilgili codelab'imize göz atın. Coral ile çalışan diğer modelleri (ör. konuşma tanıma ve duruş tahmini) arıyorsanız coral.ai/models adresini ziyaret edin. Bu modellerin ve diğer birçok modelin CPU sürümlerini TensorFlow Hub'da da bulabilirsiniz.

Ürettiklerinizi bizimle paylaşma

Bugün oluşturduğunuz içerikleri diğer yaratıcı kullanım alanlarında da kolayca kullanabilirsiniz. Yaratıcılığınızı konuşturmaya ve denemeye devam etmenizi öneririz.

Projenizin TensorFlow blogumuzda veya gelecekteki etkinliklerde yer alma şansı için sosyal medyada #MadeWithTFJS hashtag'ini kullanarak bizi etiketlemeyi unutmayın. Ürettiklerinizi görmeyi çok isteriz.

Göz atabileceğiniz web siteleri