object-tracking-measure

1.7.0 • Public • Published

Build Status

Object Tracking measure

This project aims to calculate metrics for tracking algorithm (especially MOTA, IDF1)

MOTA

See [1].

const otm = require('object-tracking-measure');

const groundTruths = [
	[
		[22, 33, 20, 20],// x, y, w, h
		[22, 33, 20, 20],
		[22, 33, 20, 20],
		[22, 33, 20, 20]
	],
	[
		[22, 33, 20, 20],// x, y, w, h
		null,
		[25, 35, 20, 20],
		[39, 41, 20, 20]
	]
];

const predictions = [
	[
		[23, 33, 22, 20],// x, y, w, h
		[21, 35, 20, 26],
		[23, 33, 22, 20],
		[21, 35, 20, 26]
	],
	[
		[23, 33, 20, 20],// x, y, w, h
		null,
		[23, 35, 22, 20],
		[39, 35, 20, 26]
	]
];

otm.mota({
	groundTruths,
	predictions
});

IDF1

See [2].

const otm = require('object-tracking-measure');

const groundTruths = [
	[
		[22, 33, 20, 20],// x, y, w, h
		[22, 33, 20, 20],
		[22, 33, 20, 20],
		[22, 33, 20, 20]
	],
	[
		[22, 33, 20, 20],// x, y, w, h
		null,
		[25, 35, 20, 20],
		[39, 41, 20, 20]
	]
];

const predictions = [
	[
		[23, 33, 22, 20],// x, y, w, h
		[21, 35, 20, 26],
		[23, 33, 22, 20],
		[21, 35, 20, 26]
	],
	[
		[23, 33, 20, 20],// x, y, w, h
		null,
		[23, 35, 22, 20],
		[39, 35, 20, 26]
	]
];

otm.idf1({
	groundTruths,
	predictions
});

Advanced usage

By default, object-tracking-measure uses

  • distance between boxes is (1 - Intersection Over Union) (using mean-average-precision library)
  • threshold is 1 (i.e. IOU = 0 - no overlap)

You can cutomize this, for example to track distance between {x,y} points like

const otm = require('object-tracking-measure');

const groundTruths = [
	[
		{x: 22, y: 34},
		{x: 22, y: 34},
		{x: 22, y: 34},
		{x: 22, y: 34}
	],
	[
		{x: 55, y: 68},// x, y, w, h
		null,
		{x: 55, y: 68},
		{x: 55, y: 68}
	]
];

const predictions = [
	[
		{x: 22, y: 34},// x, y, w, h
		{x: 22, y: 34},
		{x: 22, y: 34},
		{x: 22, y: 34}
	],
	[
		{x: 55, y: 68},// x, y, w, h
		null,
		{x: 55, y: 68},
		{x: 55, y: 68}
	]
];

otm.idf1({
	groundTruths,
	predictions,
	distFn: ((a,b) => Math.sqrt(((a.x - b.x) * (a.x - b.x)) + ((a.y - b.y) * (a.y - b.y)))), // Euclidian distance
	threshold: 2 // means that 2 meters far is too far
});

Inspect ID Metric

const measure = otm.idDetails({
	groundTruths,
	predictions
});

console.log(otm.idInspect(Object.assign({}, measure, {
	columns: process.stdout.columns - 20
})))

will print

--
GroundTruth[0]✓――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――✓
Prediction[0] ✓――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――✓
              |----------------------------|----------------------------|---------------------------
              0                            1                            2                           

--
GroundTruth[1]✓―――――――――――――――――――――――――――✓?―――――――――――――――――――――――――――?✓――――――――――――――――――――――――――✓
Prediction[1] ✓―――――――――――――――――――――――――――✓?―――――――――――――――――――――――――――?✓――――――――――――――――――――――――――✓
              |----------------------------|----------------------------|---------------------------

Inspect MOT Metric

const measure = otm.motDetails({
	groundTruths,
	predictions
});

console.log(otm.motInspect(Object.assign({}, measure, {
	columns: process.stdout.columns - 20
})))

will print

0[0]                1-1-1-1-1-1-1-1-1-1-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-
1[1]                0-0-0-0-0-0-0-0-0-0---------------------1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-

Other tools

getStats

const result = otm.getStats({
	track: [
		[22, 33, 20, 20], // X, y, w, h
		null,
		[25, 35, 20, 20],
		[39, 41, 20, 20],
		null
	]
});

/* 
{
	count: 3, // number of non-null point)
	iterationAge: 1, // number of null at the end
	fullDensity: 0.6, // non-null /total size of track
	gapDensity: 0.3333333333333333, // number of gaps / number of non-null
	density: 0.75, // non-null / size of the trimed track
	firstIndex: 0, // first index of the trimed track
	lastIndex: 3 // last index of the trimed track
}
*/
 

fastGetNullSegment

const result = otm.fastGetNullSegment({
	track: [
		[22, 33, 20, 20], // X, y, w, h
		null,
		null,
		null,
		[25, 35, 20, 20],
		[39, 41, 20, 20],
		null
	]
});

/* 
{
	first: 1,
	last: 5,
	type: 'null',
}
*/
 

References

[1] Keni Bernardin and Rainer Stiefelhagen (2008). Evaluating Multiple Object Tracking Performance: The CLEAR MOT Metrics

[2] Ergys Ristani1, Francesco Solera2, Roger S. Zou1, Rita Cucchiara2, and Carlo Tomasi1 (2016). Performance Measures and a Data Set for Multi-Target, Multi-Camera Tracking

Dependencies (2)

Dev Dependencies (3)

Package Sidebar

Install

npm i object-tracking-measure

Weekly Downloads

8

Version

1.7.0

License

MIT

Unpacked Size

973 kB

Total Files

52

Last publish

Collaborators

  • piercus