Home

Awesome

TensorflowJS EfficientNet

npm Node.js CI codecov Codacy Badge Run on Repl.it <a href="https://www.npmjs.com/package/node-efficientnet"><img src="https://img.shields.io/npm/l/node-efficientnet.svg" alt="License"></a>
<a href="https://npmcharts.com/compare/node-efficientnet?minimal=true"><img src="https://img.shields.io/npm/dm/node-efficientnet.svg" alt="Downloads"></a> <a href="https://npmcharts.com/compare/node-efficientnet?minimal=true"><img src="https://img.shields.io/npm/dt/node-efficientnet.svg" alt="Downloads"></a> Gitter

This repository contains a tensorflowJs implementation of EfficientNet, an object detection model trained on ImageNet and can detect 1000 different objects.

EfficientNet a lightweight convolutional neural network architecture achieving the state-of-the-art accuracy with an order of magnitude fewer parameters and FLOPS, on both ImageNet and five other commonly used transfer learning datasets.

The codebase is heavily inspired by the TensorFlow implementation.

Alt Text

👏 Supporters

↳ Stargazers

Stargazers repo roster for @ntedgi/node-efficientnet

↳ Forkers

Forkers repo roster for @ntedgi/node-efficientnet

Multilingual status

localestatustranslate by 👑
en
zh@luoye-fe
es@h383r
ar@lamamyf
ru@Abhighyaa
he@jhonDoe15
fr@burmanp
other⏩ (need help, PR welcome )

Table of Contents

  1. Just Want to Play With The Model
  2. Installation
  3. API
  4. Examples
  5. Usage
  6. About EfficientNet Models
  7. Models
  8. Multilingual status

How I Run This Project Locally ?

Usage:

EfficientNet has 8 different model checkpoints each checkpoint as different input layer resolution for larger input layer resolution, the greater the accuracy and the running time is slower.

for example lets take this images:

<table border="0"> <tr> <td> <img src="https://raw.githubusercontent.com/ntedgi/node-efficientnet/main/samples/panda.jpg" width="100%" /> </td> <td> <table border="0"> <tr> <td>Model</td> <td>Prediction</td> </tr> <tr> <td>EfficientNetB0</td> <td>('Giant panda',83.607) , ( 'Skunk',11.61) , ('hog',4.772)</td> </tr> <tr> <td>EfficientNetB7</td> <td>('Giant panda',90.406) , ( 'American black bear',7.07) , ('Badger',2.5192)</td> </tr> </table> </td> </tr> <tr> <td> <img src="https://raw.githubusercontent.com/ntedgi/node-efficientnet/main/samples/fish.jpg" width="100%" /> </td> <td> <table border="0"> <tr> <td>Model</td> <td>Prediction</td> </tr> <tr> <td>EfficientNetB3</td> <td>('goldfish, Carassius auratus',82.5) , ( 'starfish, sea star',9.26) , ('corn'',7.33)</td> </tr> <tr> <td>EfficientNetB7</td> <td>('goldfish, Carassius auratus',97.5) , ( 'starfish, sea star',1.46) , ('corn'',0.93)</td> </tr> </table> </td> </tr> <tr> <td> <img src="https://raw.githubusercontent.com/ntedgi/node-efficientnet/main/samples/car.jpg" width="100%" /> </td> <td> <table border="0"> <tr> <td>Model</td> <td>Prediction</td> </tr> <tr> <td>EfficientNetB0</td> <td>('Sports Car',88.02) , ( 'racing car',6.647) , ('car wheel',5.32)</td> </tr> <tr> <td>EfficientNetB7</td> <td>('Sports Car',87.68) , ( 'convertible'',7.831) , ('car wheel',4.485)</td> </tr> </table> </td> </tr> <tr> <td> <img src="https://raw.githubusercontent.com/ntedgi/node-efficientnet/main/samples/gun.jpg" width="100%" /> </td> <td> <table border="0"> <tr> <td>Model</td> <td>Prediction</td> </tr> <tr> <td>EfficientNetB0</td> <td>('revolver',85.52) , ( 'assault rifle',9.85) , ('rifle',4.6197)</td> </tr> <tr> <td>EfficientNetB7</td> <td>('revolver',88.13) , ( 'rifle',8.29) , ('assault rifle',3.56)</td> </tr> </table> </td> </tr> </table>

Installation

npm i --save node-efficientnet

API

EfficientNetCheckPointFactory.create(checkPoint: EfficientNetCheckPoint, options?: EfficientNetCheckPointFactoryOptions): Promise<EfficientNetModel>

Example: to create an efficientnet model you need to pass EfficientNetCheckPoint (available checkpoint [B0..B7]) each one of them represent different model

const {
  EfficientNetCheckPointFactory,
  EfficientNetCheckPoint,
} = require("node-efficientnet");

const model = await EfficientNetCheckPointFactory.create(
  EfficientNetCheckPoint.B7
);

const path2image = "...";

const topResults = 5;

const result = await model.inference(path2image, {
  topK: topResults,
  locale: "zh",
});

Of course, you can use local model file to speed up loading

You can download model file from efficientnet-tensorflowjs-binaries, please keep the directory structure consistent, just like:

local_model
  └── B0
    ├── group1-shard1of6.bin
    ├── group1-shard2of6.bin
    ├── group1-shard3of6.bin
    ├── group1-shard4of6.bin
    ├── group1-shard5of6.bin
    ├── group1-shard6of6.bin
    └── model.json
const path = require("path");
const {
  EfficientNetCheckPointFactory,
  EfficientNetCheckPoint,
} = require("node-efficientnet");

const model = await EfficientNetCheckPointFactory.create(
  EfficientNetCheckPoint.B7,
  {
    localModelRootDirectory: path.join(__dirname, "local_model"),
  }
);

const path2image = "...";

const topResults = 5;

const result = await model.inference(path2image, {
  topK: topResults,
  locale: "zh",
});

Examples

download files from remote and predict using model

const fs = require("fs");
const nodeFetch = require("node-fetch");

const {
  EfficientNetCheckPointFactory,
  EfficientNetCheckPoint,
} = require("node-efficientnet");

const images = ["car.jpg", "panda.jpg"];
const imageDir = "./samples";
const imageDirRemoteUri =
  "https://raw.githubusercontent.com/ntedgi/node-EfficientNet/main/samples";

if (!fs.existsSync(imageDir)) {
  fs.mkdirSync(imageDir);
}

async function download(image, cb) {
  const response = await nodeFetch.default(`${imageDirRemoteUri}/${image}`);
  const buffer = await response.buffer();
  fs.writeFile(`${imageDir}/${image}`, buffer, cb);
}

EfficientNetCheckPointFactory.create(EfficientNetCheckPoint.B2)
  .then((model) => {
    images.forEach(async (image) => {
      await download(image, () => {
        model.inference(`${imageDir}/${image}`).then((result) => {
          console.log(result.result);
        });
      });
    });
  })
  .catch((e) => {
    console.error(e);
  });

output :

[
  { label: "sports car, sport car", precision: 88.02440940394301 },
  {
    label: "racer, race car, racing car",
    precision: 6.647441678387659,
  },
  { label: "car wheel", precision: 5.3281489176693295 },
][
  ({
    label: "giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca",
    precision: 83.60747593436018,
  },
  { label: "skunk, poleca", precision: 11.61300759424677 },
  {
    label: "hog, pig, grunter, squealer, Sus scrofa",
    precision: 4.779516471393051,
  })
];

About EfficientNet Models

EfficientNets rely on AutoML and compound scaling to achieve superior performance without compromising resource efficiency. The AutoML Mobile framework has helped develop a mobile-size baseline network, EfficientNet-B0, which is then improved by the compound scaling method to obtain EfficientNet-B1 to B7.

<table border="0"> <tr> <td> <img src="https://raw.githubusercontent.com/tensorflow/tpu/master/models/official/efficientnet/g3doc/params.png" width="100%" /> </td> <td> <img src="https://raw.githubusercontent.com/tensorflow/tpu/master/models/official/efficientnet/g3doc/flops.png", width="90%" /> </td> </tr> </table>

EfficientNets achieve state-of-the-art accuracy on ImageNet with an order of magnitude better efficiency:

Models

The performance of each model variant using the pre-trained weights converted from checkpoints provided by the authors is as follows:

Architecture@top1* Imagenet@top1* Noisy-Student
EfficientNetB00.7720.788
EfficientNetB10.7910.815
EfficientNetB20.8020.824
EfficientNetB30.8160.841
EfficientNetB40.8300.853
EfficientNetB50.8370.861
EfficientNetB60.8410.864
EfficientNetB70.8440.869

* - topK accuracy score for converted models (imagenet val set)


if (this.repo.isAwesome || this.repo.isHelpful) {
  Star(this.repo);
}