UNPKG

retinanetjs

Version:

Wrapper for models built using keras-retinanet.

84 lines 8.74 kB
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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