rcaceiro / node-yolo

MIT License
18 stars 4 forks source link

node-yolo

This Node.js C++ addon allow you to use a state-of-the-art, real-time object detection system called Yolo.
This addon came out from a computer engineering final project, VAPi, guided by Patrício Domingues at Institute Polytechnic of Leiria.
The version 1.x.x was developed by Rúben Caceiro and Ricardo Maltez during the final project.
The version 2.x.x was sponsored by Instituto de Telecomunicações developed by Rúben Caceiro and guided by Patrício Domingues.

Pre-requirements

Note 1: Before any update please see the changelog.
Note 2: The versions prior 2.0.0 of the module has the ImageMagick as a dependency, but with OpenCV we can archive the desired goal. And by this we remove one dependency of the project.

Recommended* hardware requirements

How To Use

const Yolo = require('@vapi/node-yolo');
const detector = new Yolo("darknet_configs", "cfg/coco.data", "cfg/yolov3.cfg", "yolov3.weights");
detector.detectImage(path,threshold,frames_to_process)
        .then(detections =>
        {
         // here you receive the detections
        })
        .catch(error =>
        {
         // here you can handle the errors. Ex: Out of memory
        });

detector.detectVideo(path,threshold,frames_to_process)
        .then(detections =>
        {
         // here you receive the detections
        })
        .catch(error =>
        {
         // here you can handle the errors. Ex: Out of memory
        });

path, required, represents the path to the file

threshold, not required, default behaviour is 0.5, represents the threshold to yolo filter the detections

frames_to_process, not required, default behaviour is 1/1, represents the number of frames that developer wants to process, this means 1/3 process 1 frame for each 3.

darknet_configs is a folder where you should put the Yolo weights, cfg and data files. You need to create two folder, cfg and data and put the files for each one. Like this:

.
├── darknet_configs         # The folder for the Yolo weight, cfg and data files
│   ├── cfg                 # cfg folder
|          |── coco.data
|          |── yolov3.cfg
│   ├── data                # data folder
|   |      |── coco.names
│   └── yolov3.weights      # YoloV3 weights file
└── ...

Note 1: Our suggestion for better accuracy use coco.data, coco.names, yolov3-spp.cfg and yolov3-spp.weights.
Note 2: Our suggestion for faster detection use coco.data, coco.names, yolov3-tiny.cfg and yolov3-tiny.weights.
Note 3: Our suggestion for best of two worlds use coco.data, coco.names, yolov3.cfg and yolov3.weights.

video detection object

Field Type Description
frame long/int64 number of the frame
millisecond double the millisecond that frame appear on video
timeSpentForClassification double time used to classifies one frame
detections array array of detection object, containing all detections

image detection object

Field Type Description
timeSpentForClassification double time used to classifies one image
detections array array of detection object, containing all detections

detection object

Field Type Description
className string name of the class of the object detected
probability double the probability that this className is correct
box box object that contains box info of the object

box object

Field Type Description
x double x coordinate in pixels of the picture
y double y coordinate in pixels of the picture
w double width from x point in pixels
h double height from y point in pixels

* To get that metrics we calculate the usage for video with 3 hours at 60fps.
**If you do not use gpu, may should consider a processor with higher number of cores.
***The weaker graphics card used was a nVidia GTX960M