Esempio n. 1
0
 protected override void ConfirmField()
 {
     TemporaryOutput = new BufferField(GPU, new OpenCvSharp.Size(outW, outH), outCh);
     TemporarySigma  = new BufferField(GPU, new OpenCvSharp.Size(outW, outH), outCh);
     Kernel          = new KernelField(inCh, outCh, KernelSize, optimizer);
     Kernel.Randmize();
 }
Esempio n. 2
0
        public void Process(Gpu gpu, BufferField input, KernelField kernel, int dilation, int expand, ref BufferField output)
        {
            var iw   = input.Width;
            var ih   = input.Height;
            var ic   = input.Channels;
            var ibuf = input.Buffer;

            var ow   = output.Width;
            var oh   = output.Height;
            var oc   = output.Channels;
            var obuf = output.Buffer;

            var ks    = kernel.Size;
            var kbias = kernel.Bias;
            var kbuf  = kernel.Buffer;

            gpu.For(0, output.Length, n =>
            {
                int c = (int)(n / (ow * oh));
                int l = n - c * (ow * oh);
                int y = (int)(l / ow);
                int x = l - y * ow;

                double v = kbias[c];
                for (int _c = 0; _c < ic; _c++)
                {
                    for (int s = -ks; s <= ks; s++)
                    {
                        for (int t = -ks; t <= ks; t++)
                        {
                            int i = x + s * dilation;
                            int j = y + t * dilation;
                            if (i % expand == 0 && j % expand == 0)
                            {
                                int _i = i / expand;
                                int _j = j / expand;
                                if (_i >= 0 && _i < iw && _j >= 0 && _j < ih)
                                {
                                    v += ibuf[_c][_i, _j] * kbuf[_c][c][s + ks, t + ks];
                                }
                            }
                        }
                    }
                }
                obuf[c][x, y] = v;
            });
        }
Esempio n. 3
0
 protected override void InitializeInnerField()
 {
     M = Kernel.Congruence();
     V = Kernel.Congruence();
 }
Esempio n. 4
0
 public void Initialize(KernelField kernel)
 {
     Kernel = kernel;
     InitializeInnerField();
 }
Esempio n. 5
0
        public void Process(Gpu gpu, BufferField input, BufferField sigma, int dilation, int expand, ref BufferField propagater, ref KernelField kernel)
        {
            var iw   = input.Width;
            var ih   = input.Height;
            var ic   = input.Channels;
            var ibuf = input.Buffer;

            var sw   = sigma.Width;
            var sh   = sigma.Height;
            var sc   = sigma.Channels;
            var sbuf = sigma.Buffer;

            var ks    = kernel.Size;
            var kbias = kernel.Bias;
            var kbuf  = kernel.Buffer;

            var dkbias = kernel.dBias;
            var dkbuf  = kernel.dBuffer;

            var pw   = propagater.Width;
            var ph   = propagater.Height;
            var pc   = propagater.Channels;
            var pbuf = propagater.Buffer;

            #region Update Kernel
            gpu.For(0, sc, c =>
            {
                double db  = dkbias[c];
                double ddb = 0;
                for (int x = 0; x < sw; x++)
                {
                    for (int y = 0; y < sh; y++)
                    {
                        ddb += sbuf[c][x, y];
                    }
                }
                dkbias[c] = db + (ddb / (sw * sh));
            });

            gpu.For(0, (2 * ks + 1) * (2 * ks + 1), n =>
            {
                int s  = (int)(n / (2 * ks + 1));
                int t  = n - s * (2 * ks + 1);
                int _s = s - ks;
                int _t = t - ks;

                for (int c = 0; c < ic; c++)
                {
                    for (int d = 0; d < sc; d++)
                    {
                        double dk  = dkbuf[c][d][s, t];
                        double ddk = 0;
                        int cnk    = 0;
                        for (int x = 0; x < sw; x++)
                        {
                            for (int y = 0; y < sh; y++)
                            {
                                int _x = x + _s * dilation;
                                int _y = y + _t * dilation;
                                if (_x % expand == 0 && _y % expand == 0)
                                {
                                    int __x = _x / expand;
                                    int __y = _y / expand;
                                    if (__x >= 0 && __x < iw && __y >= 0 && __y < ih)
                                    {
                                        cnk++;
                                        ddk += ibuf[c][__x, __y] * sbuf[d][x, y];
                                    }
                                }
                            }
                        }
                        dkbuf[c][d][s, t] = dk + ((ddk / (sw * sh * (2 * (ks - 1) + 1))));
                    }
                }
            });
            #endregion

            #region Calculate Propagater
            gpu.For(0, propagater.Length, n =>
            {
                int c = (int)(n / (pw * ph));
                int l = n - c * (pw * ph);
                int y = (int)(l / pw);
                int x = l - y * pw;

                double v = 0;
                for (int _c = 0; _c < sc; _c++)
                {
                    for (int s = ks; s >= -ks; s--)
                    {
                        for (int t = ks; t >= -ks; t--)
                        {
                            int i = x + s * dilation;
                            int j = y + t * dilation;
                            if (i % expand == 0 && j % expand == 0)
                            {
                                int _i = i / expand;
                                int _j = j / expand;
                                if (_i >= 0 && _i < sw && _j >= 0 && _j < sh)
                                {
                                    v += sbuf[_c][_i, _j] * kbuf[c][_c][s + ks, t + ks];
                                }
                            }
                        }
                    }
                }
                pbuf[c][x, y] = v;
            });
            #endregion
        }