retinanetjs
Version:
Wrapper for models built using keras-retinanet.
96 lines • 9.21 kB
JavaScript
;
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
const tf = __importStar(require("@tensorflow/tfjs"));
/**
* This duplicates the behavior of `keras_retinanet.utils.anchors.AnchorParameters.default`
*/
exports.defaultAnchorParameters = {
ratios: [0.5, 1, 2],
scales: [2 ** 0, 2 ** (1.0 / 3.0), 2 ** (2.0 / 3.0)],
sizes: [32, 64, 128, 256, 512],
strides: [8, 16, 32, 64, 128]
};
/**
* This duplicates the behavior of `keras_retinanet.utils.anchors.shift`
* @hidden
*/
function shift(shape, stride, anchors) {
return tf.tidy(() => {
const [yLength, xLength] = shape;
const shiftX = tf
.range(0, xLength)
.add(0.5)
.mul(stride)
.expandDims(0)
.tile([yLength, 1])
.flatten();
const shiftY = tf
.range(0, yLength)
.add(0.5)
.mul(stride)
.expandDims(1)
.tile([1, xLength])
.flatten();
const shifts = tf
.stack([shiftX, shiftY, shiftX, shiftY])
.transpose();
const A = anchors.shape[0];
const K = shifts.shape[0];
return anchors
.reshape([1, A, 4])
.add(shifts.reshape([1, K, 4]).transpose([1, 0, 2]))
.reshape([K * A, 4]);
});
}
exports.shift = shift;
/**
* This duplicates the behavior of `keras_retinanet.utils.anchors.generate_anchors`
* @hidden
*/
function generateAnchors(baseSize, anchorParams = exports.defaultAnchorParameters) {
return tf.tidy(() => {
const numAnchors = anchorParams.ratios.length * anchorParams.scales.length;
const scales = tf.tensor1d(anchorParams.scales);
const ratios = tf.tensor1d(anchorParams.ratios);
// Scale base size
let w = tf.mul(tf.tile(scales, [anchorParams.ratios.length]), baseSize); // tslint:disable-line
let h = tf.mul(tf.tile(scales, [anchorParams.ratios.length]), baseSize); // tslint:disable-line
// Compute areas of anchors
const area = tf.mul(w, h);
// Correct for ratios
w = tf.sqrt(tf.div(area, tf.tile(ratios.expandDims(1), [1, anchorParams.scales.length]).flatten()));
h = tf.mul(w, tf.tile(ratios.expandDims(1), [1, anchorParams.scales.length]).flatten());
// transform from (x_ctr, y_ctr, w, h) -> (x1, y1, x2, y2)
const x1 = tf.sub(tf.zeros([numAnchors]), tf.div(w, 2));
const y1 = tf.sub(tf.zeros([numAnchors]), tf.div(h, 2));
const x2 = tf.add(x1, w);
const y2 = tf.add(y1, h);
return tf.concat([x1, y1, x2, y2].map(t => t.expandDims(1)), 1);
});
}
exports.generateAnchors = generateAnchors;
/**
* This duplicates the behavior of `keras_retinanet.utils.anchors.anchors_for_shape`
* @hidden
*/
function anchorsForShape(inputShape, anchorParams = exports.defaultAnchorParameters) {
return tf.tidy(() => {
const pyramidLevels = [3, 4, 5, 6, 7];
const imageShape = inputShape.slice(0, 2);
return tf.concat(pyramidLevels.map((p, pIdx) => {
const curImageShape = imageShape.map(s => Math.floor((s + 2 ** p - 1) / 2 ** p));
const anchors = generateAnchors(anchorParams.sizes[pIdx], anchorParams);
const shiftedAnchors = shift(curImageShape, anchorParams.strides[pIdx], anchors);
return shiftedAnchors;
}), 0);
});
}
exports.anchorsForShape = anchorsForShape;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5jaG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvYW5jaG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxxREFBdUM7QUFZdkM7O0dBRUc7QUFDVSxRQUFBLHVCQUF1QixHQUFxQjtJQUN2RCxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNuQixNQUFNLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDcEQsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztJQUM5QixPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDO0NBQzlCLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxTQUFnQixLQUFLLENBQ25CLEtBQWUsRUFDZixNQUFjLEVBQ2QsT0FBb0I7SUFFcEIsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNsQixNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNqQyxNQUFNLE1BQU0sR0FBRyxFQUFFO2FBQ2QsS0FBSyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUM7YUFDakIsR0FBRyxDQUFDLEdBQUcsQ0FBQzthQUNSLEdBQUcsQ0FBQyxNQUFNLENBQUM7YUFDWCxVQUFVLENBQUMsQ0FBQyxDQUFDO2FBQ2IsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ2xCLE9BQU8sRUFBRSxDQUFDO1FBQ2IsTUFBTSxNQUFNLEdBQUcsRUFBRTthQUNkLEtBQUssQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDO2FBQ2pCLEdBQUcsQ0FBQyxHQUFHLENBQUM7YUFDUixHQUFHLENBQUMsTUFBTSxDQUFDO2FBQ1gsVUFBVSxDQUFDLENBQUMsQ0FBQzthQUNiLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQzthQUNsQixPQUFPLEVBQUUsQ0FBQztRQUNiLE1BQU0sTUFBTSxHQUFHLEVBQUU7YUFDZCxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQzthQUN2QyxTQUFTLEVBQWlCLENBQUM7UUFFOUIsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLE9BQU8sT0FBTzthQUNYLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDbEIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ25ELE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6QixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFoQ0Qsc0JBZ0NDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsZUFBZSxDQUM3QixRQUFnQixFQUNoQixZQUFZLEdBQUcsK0JBQXVCO0lBRXRDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDbEIsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDM0UsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFaEQsa0JBQWtCO1FBQ2xCLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxzQkFBc0I7UUFDL0YsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLHNCQUFzQjtRQUUvRiwyQkFBMkI7UUFDM0IsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFMUIscUJBQXFCO1FBQ3JCLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUNULEVBQUUsQ0FBQyxHQUFHLENBQ0osSUFBSSxFQUNKLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQ3pFLENBQ0YsQ0FBQztRQUNGLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUNSLENBQUMsRUFDRCxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUN6RSxDQUFDO1FBRUYsMERBQTBEO1FBQzFELE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RCxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEQsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekIsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekIsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQW5DRCwwQ0FtQ0M7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixlQUFlLENBQzdCLFVBQW9CLEVBQ3BCLFlBQVksR0FBRywrQkFBdUI7SUFFdEMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNsQixNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0QyxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQ2QsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUM1QixNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQ3RDLENBQUM7WUFDRixNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUN4RSxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQzFCLGFBQWEsRUFDYixZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUMxQixPQUFPLENBQ1IsQ0FBQztZQUNGLE9BQU8sY0FBYyxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxFQUNGLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBdkJELDBDQXVCQyJ9