retinanetjs
Version:
Wrapper for models built using keras-retinanet.
84 lines • 8.74 kB
JavaScript
import * as tf from '@tensorflow/tfjs';
/**
* This duplicates the behavior of `keras_retinanet.utils.anchors.AnchorParameters.default`
*/
export const 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
*/
export 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]);
});
}
/**
* This duplicates the behavior of `keras_retinanet.utils.anchors.generate_anchors`
* @hidden
*/
export function generateAnchors(baseSize, anchorParams = 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);
});
}
/**
* This duplicates the behavior of `keras_retinanet.utils.anchors.anchors_for_shape`
* @hidden
*/
export function anchorsForShape(inputShape, anchorParams = 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);
});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5jaG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvYW5jaG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBWXZDOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQXFCO0lBQ3ZELE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ25CLE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNwRCxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQzlCLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUM7Q0FDOUIsQ0FBQztBQUVGOzs7R0FHRztBQUNILE1BQU0sVUFBVSxLQUFLLENBQ25CLEtBQWUsRUFDZixNQUFjLEVBQ2QsT0FBb0I7SUFFcEIsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNsQixNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNqQyxNQUFNLE1BQU0sR0FBRyxFQUFFO2FBQ2QsS0FBSyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUM7YUFDakIsR0FBRyxDQUFDLEdBQUcsQ0FBQzthQUNSLEdBQUcsQ0FBQyxNQUFNLENBQUM7YUFDWCxVQUFVLENBQUMsQ0FBQyxDQUFDO2FBQ2IsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ2xCLE9BQU8sRUFBRSxDQUFDO1FBQ2IsTUFBTSxNQUFNLEdBQUcs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