async analyzeImage(imageData, url, tabId) {
    if (!tabId) {
      console.error('No tab.  No prediction.');
      return;
    }
    if (!this.model) {
      console.log('Waiting for model to load...');
      setTimeout(
        () => { this.analyzeImage(imageData, url, tabId) }, FIVE_SECONDS_IN_MS);
      return;
    }
    console.log('Predicting...');
    const startTime = performance.now();
    const predictions = await this.model.classify(imageData, TOPK_PREDICTIONS);
    const totalTime = performance.now() - startTime;
    console.log(`Done in ${totalTime.toFixed(1)} ms `);
    const message = { action: 'IMAGE_CLICK_PROCESSED', url, predictions };
    chrome.tabs.sendMessage(tabId, message);
  }
Triggers the model to make a prediction on the image referenced by the
image data. After a successful prediction a IMAGE_CLICK_PROCESSED message
when complete, for the content.js script to hear and update the DOM with
the results of the prediction.

@param {ImageData} imageData ImageData of the image to analyze.
@param {string} url url of image to analyze.
@param {number} tabId which tab the request comes from.