de plastic roos is de verstorende factor

de plastic roos is de verstorende factor

 

Het MobileNet model trainen, transfer learing met regressie.               terug naar de inleiding

In de schets  transfer learing met classificatie was er sprake van classificatie. In deze schets gaat het om transfer learing met regression.

In deze schets wordt het object "predictor" aangemaakt, een object van de  featureExtractor class  "regression" class. (regel 13)

In de schets wordt een, met de slider (regel 17) ingesteld, getal tussen de 0 en 1 aan een videobeeld gekoppeld.
Werkwijze: Een object voor de camera plaatsen en met de slider een getal instellen.
Een dataset maken door meerdere keren op de knop "afbeelding en getal toevoegen" te klikken.

Dit herhalen met andere object posities en getallen. Als de dataset compleet is op de trainer knop klikken.

Na de training ontstaat er een Model die getallen tussen de 0 en 1 , gekoppeld aan een videobeeld, weergeeft.
Zo kan je met getainde modellen met bepaalde gebaren animaties beinvloeden.
 

callbacks   zie de w3 school

In de schets wordt de callback op twee manieren gebruikt

1) Als een verwijzing naar een functie
2) Voor het afgeven van data die door de predict methode (regel 60) wordt verkregen. Zie de toonResult functie in regel 55.
    Het predictor object roept de toonResult functie weer aan en geeft de data aan de callback result (regel 60).

    Van de data in result wordt alleen de data in value gebruikt . Deze data wordt met de dot notatie  "result.value" aan preds gegeven (regel 61)

Met console.log(result); (regel 59) wordt alle data in de console getoond.

Zo kom je te weten dat het getal gekoppeld aan het videobeeld in de variabele "value" zit.

foutmelding

Uncaught (in promise) TypeError: e is not a function at ml5.min.js:66
Deze foutmelding ontstaat als aan een constructor een niet bestaand argument wordt toegevoegd.
Met deze fout blijkt de ml5.js schets gewoon te werken. 
 
 
 let featureExtractor;
let predictor, video, slider, getal;
let preds = 0;
 
function setup() {
  createCanvas(540, 380);
  video = createCapture(VIDEO);
  video.hide();
  background(0);
//Het model laden dat geschikt is om kenmerken te veranderen
 featureExtractor = ml5.featureExtractor('MobileNet', modelGeladen);
 predictor = featureExtractor.regression(video, videoReady);
 
//telkens als het knopje wordt ingedrukt wordt een afbeelding
//met een getal tussen 0 en 1 aan addImage toegevoegd
 slider = createSlider(0, 1, 0.5, 0.01);
 
 addKnop = createButton('afbeelding en getal toevoegen')
 addKnop.mousePressed(function() {  //alweer een anonymous functie
   predictor.addImage(slider.value());
 });
 
  trainknop = createButton('trainer');
  trainknop.mousePressed(function() {
    predictor.train(training);
  });
 
  opslaanknop = createButton('model downloaden');
  opslaanknop.mousePressed(function()
    {predictor.save();
  });
}
 
function modelGeladen(){
  console.log('het model is geladen');
}
 
function videoReady() {
  console.log('De video is klaar');
}
 
//Als de training compleet is wordt de predictor gestart en de toonResult functie uitgevoerd
//de loss functie berekend de error
function training(loss){
   if (loss == null) {
    console.log('voorspelling complete');
    predictor.predict(toonResult);
  } else {
  console.log(loss);
  }
}
//toonResult is een loop die het getal in "preds" weergeeft
//dat het meeste bij het videobeeld past.
function toonResult(error, result) {
  if (error){
    console.error(error);
  } else {
  //console.log(result);
  predictor.predict(toonResult);
  preds = result.value;
  }
}
 
function draw(){
  background(0);
  getal = slider.value();
  //de afbeelding is korter dan het canvas zo verschijnt de tekst in een zwarte band
  image(video,0,0,540,340);
  fill(255);
  textSize(20);
  text("toegevoegd getal: ",10, height-15);
  text(getal,180, height-15);
  text("gekoppelde getal: ",230, height-15);
  preds = round(preds, 2);  //een cijfer achter de komma
  text(preds,400, height-15);
}