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

1. Giriş

54e81d02971f53e8.png

Son Güncelleme: 11.04.2022

Bu Codelab'de, Öğrenebilir Makine'yi 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 bu modeli Mercan donanım hızlandırma ile nasıl çalıştıracağınızı öğreneceksiniz. Web kamerasından gelen resimleri görüntüleyen ve Coral Edge TPU'yu kullanarak bu resimleri sınıflandıran bir Electron uygulaması geliştiriyorsunuz. Bu Codelab'in tümüyle çalışan bir sürümü sig-tfjs GitHub deposunda bulunmaktadır.

Mercan Cihaza ihtiyacım var mı?

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

Oluşturacaklarınız

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

  • Web kamerasından alınan görüntüleri, eğittiğiniz modelde tanımlanan kategorilere ayırır.
  • Varsa performansı artırmak için mercan 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.
  • Coral cihazda modelleri çalıştırmak için Edge TPU çalışma zamanı kitaplığı nasıl yüklenir?
  • Coral Edge TPU kullanarak model çıkarımı nasıl hızlandırılır?
  • WebNN ile model çıkarımı nasıl hızlandırılır?

Bu codelab'de, Node.js'deki TFLite ele alınmaktadır. Alakalı olmayan kavramlar ve kod blokları üzerine yazılır ve kolayca kopyalayıp yapıştırmanız için sunulur.

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 favori geliştirme ortamınızda açın. Bu codelab için masaüstünde Raspberry Pi OS (64 bit) çalıştıran bir Raspberry Pi kullanmanızı öneririz. Bu işlem, Mercan hızlandırıcı bağlamayı kolaylaştırır.

Kesinlikle Önerilir: Raspberry Pi'de depoyu klonlamak için Git'i kullanın

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

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

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

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

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

Mercan cihazlar, kullanımdan önce Edge TPU çalışma zamanı kitaplığını yüklemenizi gerektirir. Platformunuza ait talimatları uygulayarak uygulamayı yükleyin.

Linux / Raspberry Pi'de

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

Google'ın Coral PPA'sını eklemek ve Edge TPU Çalışma Zamanı 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 işletim sistemlerinde

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

Cihazınızı yeniden başlatın

Edge TPU Çalışma Zamanı 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ğrulama

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ış alı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.

@tensorflow/tfjs-node, uygulamasını günlüklerde belirtildiği gibi yüklemeniz gerekmez, çünkü modeli TFLite'ta çalıştırırsınız.

Çıkışta Encountered unresolved custom op: edgetpu-custom-op bulunuyorsa 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 bağladığınızdan emin olun. Ayrıca Coral bağlamalarının Python sürümünü test etmek için Coral'ın Başlangıç Kılavuzu'ndaki talimatları da uygulayabilirsiniz. Python sürümü çalışıyor ancak bu testler yine de başarısız oluyorsa lütfen bir hata raporu doldurarak 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 dizininin altındaki starter_code dizinine taşıyın.
  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 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. Bu kod, codelab'de kavramları gösterecek şekilde basitleştirilmiştir ve çok az hata giderme adımına sahiptir. Kodlardan herhangi birini bir üretim uygulamasında yeniden kullanmayı seçerseniz hataları giderdiğinizden ve tüm kodu eksiksiz olarak test ettiğinizden emin olun.

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

Başlangıç kodunu inceleyin

Bu başlangıç kodunda çok fazla dosya var, ancak yalnızca renderer.js dosyasını düzenlemeniz gerekiyor. Video feed'i ve HTML öğeleri de dahil olmak üzere sayfada nelerin gösterileceğini kontrol eder ve makine öğrenimi modelinizi uygulamaya eklediğiniz yer burasıdır. Diğer dosyaların yanı sıra bir index.html dosyası da bulunuyor, ancak yapması gereken tek şey renderer.js dosyasını yüklemek. Ayrıca Electron'un giriş noktası olan bir main.js dosyası vardır. Açıldığında nelerin gösterileceği ve kapalıyken ne yapılacağı da dahil olmak üzere uygulamanın yaşam döngüsünü kontrol eder. Ancak uygulamada herhangi bir değişiklik yapmanız gerekmez.

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

Bu codelab'i izlerken uygulamanızda hata ayıklamanız gerekebilir. Bu uygulama Electron'u temel aldığından, Chrome hata ayıklayıcı özelliğine sahiptir. Çoğu platformda Ctrl + Üst Karakter + i ile 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 pek bir şey yok. Şimdi resim sınıflandırıcıyı eğitmeye başlayalım.

3. Resim Sınıflandırıcı Eğitme

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

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

Resim Sınıflandırıcı, giriş görüntülerini alır ve bunlara etiketler 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 bir masaüstü veya dizüstü bilgisayar kullanabilirsiniz, ancak elde edilen dosyaları Pi'ye kopyalamanız gerekir.

Artık bir model 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 dedektörü, yalnızca kişinin kadrajda olup olmadığını tespit eder.

  1. Öğrenebilir Makine eğitimi sayfasını yeni bir sekmede açın.
  2. Resim Projesi'ni ve ardından Standart görüntü modeli'ni 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ırmanız da mümkündür.
  4. Her sınıf için yeterli veri topladığınızda (genellikle 50 örnek yeterlidir) Modeli Eğit'e basın.

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

Bir model, iki sınıftan görüntülerle eğitilir:

Modele farklı girişler sağlamayı 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 dosya indirir. bir grafik de oluşturabilirsiniz.
  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 dosya indirir.

4. Uygulamanızdaki CPU modelini çalıştırın

Bir modeli eğittiğinize göre artık onu uygulamanıza eklemenizin zamanı geldi. 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ın sıkıştırmasını açın. Arşivde iki dosya var. model_uquant.tflite, model grafiği ve ağırlıklar dahil olmak üzere kayıtlı TFLite modelidir. labels.txt, modelin tahmin ettiği sınıflar için kullanıcıların okuyabileceği etiketleri içerir. Her iki dosyayı da modeldirectory klasörüne yerleştirin.

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

Bir model ve ön işleme girişlerini yüklemek için TensorFlow.js'den birkaç bağımlılık gerekir:

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

@tensorflow/tfjs zaten yüklüdür ancak şu komutla tfjs-tflite-node öğesini yüklemeniz gerekir:

npm install --save tfjs-tflite-node

Uzantıyı yükledikten sonra renderer.js kodunun üst kısmındaki uygulamaya ekleyin:

CODELAB bölüm 1: tfjs-tflite-node öğesini içe aktarma.

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

Modeli yükleme

Artık modeli yüklemeye hazırsınız. tfjs-tflite-node, bunun için loadTFLiteModel işlevini sağlar. Modelleri bir dosya yolundan, ArrayBuffer'dan veya TFHub URL'sinden yükleyebilir. Modelinizi ve ağırlıklarını yüklemek için main işlevine şunu ekleyin:

CODELAB bölüm 1: 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 üç adımdan oluşur. Önce web kamerasından bir giriş karesi çeker ve ön işleme yaparsınız. Ardından, modeli bu çerçevede çalıştırıp bir tahmin elde ediyorsunuz. Bundan sonra, tahmini sayfada görüntülersiniz.

Web kamerası girişini ön işleme

Şu anda web kamerası yalnızca bir HTML öğesidir ve görüntülediği kareler JavaScript oluşturucu.js dosyasında kullanılamaz. TensorFlow.js, web kamerasından çerçeveleri çekmek için, kameradan kare yakalamaya yönelik kullanımı kolay bir capture() yöntemi sağlayan tf.data.webcam uygulamasını sunar.

Kullanmak için şu kurulum kodunu main() cihazına ekleyin:

CODELAB bölüm 1: tf.data.webcam uygulamasını buradan ayarlayın.

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

Daha sonra, her karede bir görüntü yakalamak için aşağıdaki kodu run() bölümüne ekleyin:

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

const image = await tensorCam.capture();

Ayrıca, modelle uyumlu olması için her kareyi ön işlemeniz gerekir. Bu codelab'de kullanılan modelin giriş şekli [1, 224, 224, 3] olduğundan 224x224 piksel boyutunda bir RGB resim bekler. tensorCam.capture(), [224, 224, 3] şeklinde bir şekil verir. Bu nedenle, tensörün önüne tf.expandDims ile ek bir boyut eklemeniz gerekir. Ek olarak, CPU modeli -1 ile 1 arasında bir float32 girişi bekler ancak web kamerası 0 ile 255 arasında değerleri yakalar. Giriş tensörünü 127'ye bölerek aralığını [0, 255] değerinden [0, ~2] değerine değiştirebilir, ardından istediğiniz aralığı [-1, ~1] elde etmek için 1'i çıkarabilirsiniz. Bunun için bu satırları run() işlevindeki tf.tidy() işlevine ekleyin:

CODELAB bölüm 1: Web kamerası çerçevelerini burada ön 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 atmak önemlidir. tf.tidy(), geri çağırma işlevinde yer alan kod için bu işlemi 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 elden çıkarmanız gerekir.

CODELAB 1. bölüm: Web kamerası çerçevelerini buradan kaldırın.

image.dispose();

Modeli çalıştırma ve sonuçları görüntüleme

Modeli ön işlenmiş girişte çalıştırmak için normalleştirilmiş tensörde model.predict() çağrısı yapın. Bu işlem, her bir etiketin tahmin edilen olasılığını içeren tek boyutlu bir tensor döndürür. Her etiketin olasılık yüzdesini elde etmek için bu olasılığı 100 ile çarpın ve modelin tahminini ekranda göstermek için başlangıç koduna dahil olan showPrediction işlevini kullanın.

Bu kod ayrıca model.predict civarında stats.begin ve stats.end çağrıları yaparak tahminin ne kadar süreceğini hesaplamak için stats.js kullanır.

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

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ırdığınızda modelinizin sınıflandırmalarını görürsünüz.

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

Performans

Şu anda kurulduğu gibi, model CPU üzerinde çalışır. Bu, masaüstü bilgisayarlar ve çoğu dizüstü bilgisayarda sorun oluşturmaz. Ancak Raspberry Pi veya başka bir düşük güçlü cihazda çalıştırıyorsanız bu istenen olmayabilir. Raspberry Pi 4'te muhtemelen yaklaşık 10 FPS görürsünüz. Bu hız, bazı uygulamalar için yeterince hızlı olmayabilir. Daha hızlı bir makine kullanmadan daha iyi performans elde etmek için Coral Edge TPU biçiminde uygulamaya özel silikon kullanabilirsiniz.

5. Uygulamanızda Coral modelini çalıştırın

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

Codelab'in bu adımı, son bölümde yazdığınız kod temel alınarak oluşturulur. Ancak temiz bir sayfayla başlamak istiyorsanız bunun yerine cpu_inference_working kontrol noktasını kullanabilirsiniz.

Coral modelinin çalıştırılmasına ilişkin 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 modelin sayısal değeri belirlenir. Bu, modele geçirilen giriş tensörlerini ve döndürdüğü çıkış tensörlerini etkiler. Diğer bir fark da modellerin Coral TPU üzerinde çalıştırılabilmesi için Edge TPU derleyicisi kullanılarak derlenmesidir. TeachableMachine, bu adımı zaten uyguladı. Ancak Mercan dokümanlarına göz atarak bu işlemi diğer modeller için nasıl yapacağınızı öğrenebilirsiniz.

Coral modeli dosyasını uygulamaya ekleyin

Sınıflandırıcıyı eğitirken indirdiğiniz converted_edgetpu.zip model dosyasının sıkıştırmasını açın. Arşivde yer alan iki dosya bulunuyor. model_edgetpu.tflite, model grafiği ve ağırlıklar dahil olmak üzere kayıtlı TFLite modelidir. labels.txt, modelin tahmin ettiği sınıflar için kullanıcıların okuyabileceği etiketleri 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 uygulamayı yüklediğinizden emin olun.

Mercan cihazlara TFLite yetki verilmiş kullanıcıları olarak erişilebilir. Bunlara JavaScript'ten erişmek için coral-tflite-delegate paketini yükleyin:

npm install --save coral-tflite-delegate

Ardından, şu satırı renderer.js dosyasının en üstüne ekleyerek yetki verdiğiniz kullanıcıyı içe aktarın:

CODELAB 2. bölüm: Yetki verilmiş kullanıcıyı buradan içe aktarın.

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

Modeli yükleme

Artık Mercan modelini yüklemeye hazırsınız. Bunu CPU modeliyle aynı şekilde yaparsınız. Ancak şimdi Coral yetkisini yüklemek için seçenekleri loadTFLiteModel işlevine geçirirsiniz.

CODELAB bölüm 2: Yetki verilmiş kullanıcı modelini buradan yükleyin.

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

CPU modeliyle aynı oldukları için etiketleri yüklemeniz gerekmez.

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

Mercan modelini, son bölümde eklediğiniz CPU modeliyle birlikte ekleyin. İ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ş düğmesi vardır.

Düğmeyi şu koda ekleyin:

CODELAB 2. bölüm: Yetki verme düğmesini buradan 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şlevinde ilişkilendirelim. useCoralDelegate yanlış değerine ayarlandığında CPU sürümünü çalıştırması gerekir. Aksi takdirde, Coral sürümünü çalıştırır (ancak şu an için herhangi bir işlem yapmaz). CPU modelini çalıştırma kodunu bir if ifadesiyle sarmalayın. Mercan modeli tensörü kullandığı için expanded tensörü if ifadesinde dışarıda bırakılır.

CODELAB 2. bölüm: Yetki verilmiş kullanıcıyı kullanıp kullanmayacağınızı buradan 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ünde uint8 tensörlerinin 0 ile 255 arasında olması beklenir. Dolayısıyla girişin normalleştirilmesi gerekmez. Bununla birlikte, çıktı da 0-255 aralığında bir uint8 tensörüdür. Gösterilmeden önce 0'dan 100'e kadar bir hareketli değere dönüştürülmesi gerekir.

CODELAB 2. bölüm: Coral tahminini burada çalıştırın. (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ırdığınızda Coral hızlandırıcıdaki sınıflandırmalar gösterilir.

CPU ve Coral modelleri aynı anda yalnızca bir uygulama içinde çalışır ve bunlar arasında geçiş yapan bir düğme bulunur. CPU modeli yaklaşık 20 FPS, Mercan modeli yaklaşık 45 FPS'ye yaklaşır.

Düğmeye basarak Mercan ve CPU çıkarımı arasında geçiş yapabilirsiniz. Mercan modelinin güven sıralamalarının CPU modelininkinden daha az kesin olduğunu ve genellikle çift ondalık basamakla sona erdiğini fark edebilirsiniz. Hassasiyetteki bu kayıp, Coral'da nicelleştirilmiş bir model çalıştırmanın telafisi olur. Genellikle pratikte fark yaratmaz ancak yine de unutulmaması 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 hardware'in yapabildiklerini temsil etmez. Performansı daha iyi anlamak için, yalnızca model.predict çağrısını ölçen gecikme (milisaniye cinsinden) görünene kadar FPS sayacını tıklayabilirsiniz. Ancak bu süreye Tensor'ları TFLite yerel C bağlamalarına ve ardından Coral cihaza taşımak için gereken süre de dahildir. Bu nedenle, mükemmel bir ölçüm değildir. C++'ta yazılan daha doğru performans karşılaştırmaları için UçTPU karşılaştırma sayfasına bakın.

Ayrıca, video Raspberry Pi yerine dizüstü bilgisayarda kaydedildiğinden farklı bir FPS görebilirsiniz.

Mercan ö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ç WebGL, paralel yapılabilir büyük işlemler için iyidir ancak bu uygulama, ön işleme aşamasında bunun büyük bir kısmını yapmaz (tek işlem olarak paralel olmayan expandDims kullanılır). Tensörlerin GPU'ya/GPU'dan taşınmasında ortaya çıkabilecek ekstra gecikmeyi önlemek için CPU arka ucuna geçiş yapabilirsiniz. Bunun için dosyanın üst kısmındaki içe aktarma işlemlerinden sonra bu satırı ekleyebilirsiniz.

tf.setBackend(‘cpu');

Bu durum, paralel yapılan TFLite CPU modelinin ön işlemesini de etkiler. Dolayısıyla bu model, bu değişiklikle çok daha yavaş çalışır.

6. WebNN ile CPU modelini hızlandırın

Mercan hızlandırıcınız yoksa veya modeli hızlandırmak için başka bir yöntem denemek istiyorsanız WebNN TFLite yetki verilmiş kişi'yi kullanabilirsiniz. Bu yetki verilen kişi, OpenVINO araç seti ile model çıkarımını hızlandırmak için Intel işlemcilerde yerleşik olarak bulunan makine öğrenimi donanımını kullanır. Dolayısıyla, bu codelab'in kurulum bölümünde ele alınmayan ek gereksinimler vardır ve OpenVINO araç setini yüklemeniz gerekir. Devam etmeden önce ayarlarınızı desteklenen Hedef Sistem Platformları açısından kontrol ettiğinizden emin olun. Bununla birlikte, WebNN temsilcisinin henüz macOS'i desteklemediğini unutmayın.

OpenVINO araç setini yükleyin

OpenVINO araç seti, modelleri hızlandırmak için Intel işlemcilerde yerleşik olarak bulunan makine öğrenimi donanımını kullanır. Intel'den önceden derlenmiş bir sürümü indirebilir veya uygulamayı kaynaktan geliştirebilirsiniz. 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 veya webnn-tflite-delegate dizininde bulunan setupvars.sh (Linux) ya da setupvars.bat (Windows) komutunu çalıştırarak yapılandırdığınızdan emin olun.

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

WebNN temsilcisinin düzgün çalıştığını doğrulamak için deponun kök dizininde bulunan webnn-tflite-delegate paketinin 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ış alı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.

Aşağıdakine benzer bir çıkış görüyorsanız bu bir yapılandırma hatası olduğu anlamına gelir:

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 bunları setupvars.sh (Linux) veya setupvars.bat (Windows) komutunu çalıştırarak ayarlayabilirsiniz, ancak Linux veya Windows ( kalıcı çözüm) talimatlarını uygulayarak kalıcı olarak ayarlamak isteyebilirsiniz. Windows kullanıyorsanız

setupvars.bat

komut komutu Git bash'ı desteklemez. Bu nedenle, komutu ve bu codelab'deki diğer komutları Windows komut istemiyle çalıştırdığınızdan emin olun.

WebNN Temsilcisi'ni yükleme

OpenVINO yüklüyken artık WebNN ile CPU modelini hızlandırmaya hazırsınız demektir. codelab'in bu bölümü, "Uygulamanızdaki CPU Modelini Çalıştırma" bölümünde yazdığınız koda dayanır bölümüne bakın. Bu adımda yazdığınız kodu kullanabilirsiniz, ancak Mercan bölümünü zaten tamamladıysanız temiz bir sayfayla başlamak için bunun yerine cpu_inference_working kontrol noktasını kullanın.

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

npm install --save webnn-tflite-delegate

Ardından, şu satırı renderer.js dosyasının en üstüne ekleyerek yetki verdiğiniz kullanıcıyı içe aktarın:

CODELAB 2. bölüm: Yetki verilmiş kullanıcıyı buradan içe 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 WebNN yetki verilmiş halde modeli 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 yetki verilmiş kullanıcılar listesine WebNNDelegate'i ekleyin:

CODELAB bölüm 2: Yetki verilmiş kullanıcı 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 ekleyin

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.

Düğmeyi şu kodla ekleyin (bunun aslında modelleri henüz değiştirmeyeceğini unutmayın):

CODELAB 2. bölüm: Yetki verme düğmesini buradan 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 öğesini de ekler.

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

WebNN, CPU ve GPU'da çalışmayı desteklediğinden bunlar arasında geçiş yapmak için 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);
}

Şimdi uygulamayı çalıştırıyorsanız 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 bunlardan birini seçtiğinizde şu anda herhangi bir şey olmaz. Uygulamada, WebNN cihazının Varsayılan, GPU veya CPU&#39;dan seçilebileceği bir açılır liste gösteriliyor..

Açılır listede cihazı değiştirebilme

Açılır listeyi, kullanılacak WebNN cihazını değiştirecek şekilde bağlamak için açılır seçici öğesinin change etkinliğine bir işleyici ekleyin. Seçilen değer değiştiğinde, WebNN modelini yetki verme seçeneklerinde ilgili WebNN cihazıyla yeniden oluşturun.

Açılır listeyi ekleyen kodun sonuna aşağıdaki kodu 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 ayarlarla yeni bir model oluşturur. Şimdi, WebNN modelini bağlama ve çıkarım için kullanma zamanı.

WebNN modelini çalıştırma

WebNN modeli kullanıma hazırdır ancak WebNN ile TfLite CPU arasında geçiş yapma düğmesi henüz modeli değiştirmez. Modeli değiştirmek için önce, codelab'in ilk bölümünde TfLite CPU modelini yüklediğiniz andan model değişkenini yeniden adlandırmanız gerekir.

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

const model = await loadTFLiteModel(modelPath);

...bu satırla eşleşecek şekilde ekleyin.

const cpuModel = await loadTFLiteModel(modelPath);

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

CODELAB 2. bölüm: Yetki verilmiş kullanıcıyı kullanıp kullanmayacağınızı buradan 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. Uygulamada TFLite CPU modeli ile WebNN CPU ve GPU modelleri çalışır. WebNN modellerinden biri etkin olduğunda, bir açılır menü bunlar arasında geçiş yapar. CPU modeli yaklaşık 15 FPS, WebNN CPU modeli ise yaklaşık 40 FPS alır..

Entegre bir Intel GPU'nuz varsa WebNN CPU ile 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çerir. Bu nedenle, WebNN'nin yapabildiği işlemleri temsil etmez. Performansı daha iyi anlamak için, yalnızca model.predict çağrısını ölçen gecikme (milisaniye cinsinden) görünene kadar FPS sayacını tıklayabilirsiniz. Ancak bu süreye Tensor'ları TFLite yerel C bağlamalarına taşımak için gereken süre de dahil olduğundan mükemmel bir ölçüm değildir.

7. Tebrikler

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

Deneyin ve çeşitli resimlerde test edin. Tamamen farklı bir öğeyi sınıflandırmak için TeachableMachine'da yeni bir model 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.
  • Coral cihazda modelleri çalıştırmak için Edge TPU çalışma zamanı kitaplığı nasıl yüklenir?
  • Coral Edge TPU kullanarak model çıkarımı nasıl hızlandırılır?
  • WebNN ile model çıkarımı nasıl hızlandırılır?

Sırada ne var?

Artık başlangıç yapabileceğiniz bir çalışma tabanınız olduğuna göre, bu makine öğrenimi model koşucusunu gerçek hayattan bir kullanım alanına genişletmek için hangi yaratıcı fikirleri üretebilirsiniz? Belki hızlı ve uygun maliyetli çıkarımlarla çalıştığınız sektörde devrim yaratabilir ya da bir ekmek kızartma makinesini değiştirerek ekmek istediğiniz gibi göründüğünde kızartmayı durdurabilirsiniz. Seçeneklerin sonu gelmez.

TeachableMachine'ın kullandığınız modeli nasıl eğittiği hakkında daha fazla bilgi edinmek için Öğrenimi Aktarma konusundaki codelab'imize göz atın. Konuşma tanıma ve poz tahmini gibi Coral ile çalışan başka modeller arıyorsanız coral.ai/models sayfasına göz atın. Bu modellerin ve daha birçok modellerin CPU sürümlerini TensorFlow Hub'da bulabilirsiniz.

Yaptıklarınızı bizimle paylaşın

Bugün öğrendiklerinizi diğer yaratıcı kullanım alanlarına da kolayca genişletebilirsiniz. Ayrıca, kalıpların dışına çıkarak fikir edinmenizi ve saldırıya devam etmenizi öneririz.

Projenizin TensorFlow blogumuzda ve hatta gelecekteki etkinliklerde öne çıkarılması için #MadeWithTFJS hashtag'ini kullanarak bizi sosyal medyada etiketlemeyi unutmayın. Neler ürettiğinizi görmekten memnuniyet duyarız.

Göz atılabilecek web siteleri