tests/common/omega_vision_reference.cs
using HumanoidMocapX.Inference;
static class OmegaVisionReference
{
internal static double[] Image(Dictionary<string, Tensor> weights, float[] input, int height, int width, int channels, int heads, bool sam = false)
{
var name = sam ? "backbone.encoder" : "aggregator.patch_embed";
var patches = height / 16 * (width / 16); var values = new double[(patches + 5) * channels];
Array.Copy(weights[name + ".cls_token"].Data.Select(v => (double)v).ToArray(), values, channels);
Array.Copy(weights[name + ".storage_tokens"].Data.Select(v => (double)v).ToArray(), 0, values, channels, channels * 4);
var filter = weights[name + ".patch_embed.proj.weight"].Data; var bias = weights[name + ".patch_embed.proj.bias"].Data;
double[] mean = { .485, .456, .406 }, deviation = { .229, .224, .225 };
for (var y = 0; y < height / 16; y++)
for (var x = 0; x < width / 16; x++)
for (var output = 0; output < channels; output++)
{
double sum = bias[output];
for (var c = 0; c < 3; c++)
for (var ky = 0; ky < 16; ky++)
for (var kx = 0; kx < 16; kx++)
{
var pixel = input[((y * 16 + ky) * width + x * 16 + kx) * 3 + c];
sum += (pixel - mean[c]) / deviation[c] * filter[((output * 3 + c) * 16 + ky) * 16 + kx];
}
values[((y * (width / 16) + x) + 5) * channels + output] = sum;
}
var positions = Positions(height / 16, width / 16, 5, weights[name + ".rope_embed.periods"].Data, sam);
for (var i = 0; i < (sam ? 32 : 24); i++) values = OmegaReference.Block(weights, name + ".blocks." + i, values, channels, heads, false, positions, sam);
return OmegaReference.Normalize(weights, values.Skip(channels * 5).ToArray(), name + ".norm");
}
internal static double[] Aggregate(Dictionary<string, Tensor> weights, double[][] patches, int height, int width, int channels, int heads)
{
var tokensPerFrame = height / 16 * (width / 16) + 17;
var values = new double[patches.Length * tokensPerFrame * channels];
for (var frame = 0; frame < patches.Length; frame++)
{
var prefix = weights["aggregator.camera_token"].Data.Skip(frame == 0 ? 0 : channels).Take(channels)
.Concat(weights["aggregator.register_token"].Data.Skip(frame == 0 ? 0 : 16 * channels).Take(16 * channels)).Select(v => (double)v).ToArray();
Array.Copy(prefix, 0, values, frame * tokensPerFrame * channels, prefix.Length);
Array.Copy(patches[frame], 0, values, (frame * tokensPerFrame + 17) * channels, patches[frame].Length);
}
var positions = Positions(height / 16, width / 16, 17, weights["aggregator.rope_embed.periods"].Data);
double[] lastFrame = null;
for (var layer = 0; layer < 24; layer++)
{
for (var frame = 0; frame < patches.Length; frame++)
{
var frameValues = values.Skip(frame * tokensPerFrame * channels).Take(tokensPerFrame * channels).ToArray();
var result = OmegaReference.Block(weights, "aggregator.frame_blocks." + layer, frameValues, channels, heads, true, positions);
Array.Copy(result, 0, values, frame * tokensPerFrame * channels, result.Length);
}
if (layer == 23) lastFrame = Prefixes();
if (new[] { 2, 6, 9, 14, 20 }.Contains(layer))
{
var result = OmegaReference.Block(weights, "aggregator.inter_frame_blocks." + layer, Prefixes(), channels, heads, true);
for (var frame = 0; frame < patches.Length; frame++) Array.Copy(result, frame * 17 * channels, values, frame * tokensPerFrame * channels, 17 * channels);
}
else values = OmegaReference.Block(weights, "aggregator.inter_frame_blocks." + layer, values, channels, heads, true);
}
var lastGlobal = Prefixes();
return Enumerable.Range(0, patches.Length * 17).SelectMany(token => lastFrame.Skip(token * channels).Take(channels)
.Concat(lastGlobal.Skip(token * channels).Take(channels))).ToArray();
double[] Prefixes() => Enumerable.Range(0, patches.Length).SelectMany(frame => values.Skip(frame * tokensPerFrame * channels).Take(17 * channels)).ToArray();
}
static float[] Positions(int height, int width, int prefix, float[] periods, bool separateAxes = false)
{
var channels = periods.Length * 4; var result = new float[(height * width + prefix) * channels];
for (var row = 0; row < height * width + prefix; row++)
for (var pair = 0; pair < channels / 2; pair++)
{
var coordinate = pair < periods.Length ? (row - prefix) / width : (row - prefix) % width;
var extent = separateAxes ? (pair < periods.Length ? height : width) : Math.Max(height, width);
var angle = row < prefix ? 0 : 2 * Math.PI * (2 * (coordinate + .5) / extent - 1) / periods[pair % periods.Length];
result[row * channels + pair * 2] = (float)Math.Cos(angle); result[row * channels + pair * 2 + 1] = (float)Math.Sin(angle);
}
return result;
}
}