示例#1
0
        private static void test_writing(string cfgfile, string weightfile, string filename)
        {
            Network net = Parser.parse_network_cfg(cfgfile);

            if (string.IsNullOrEmpty(weightfile))
            {
                Parser.load_weights(net, weightfile);
            }
            Network.set_batch_network(net, 1);
            Utils.Rand = new Random(2222222);
            var sw = new Stopwatch();

            string input = "";

            while (true)
            {
                if (!string.IsNullOrEmpty(filename))
                {
                    input = filename;
                }
                else
                {
                    Console.Write($"Enter Image Path: ");

                    input = Console.ReadLine();
                    if (string.IsNullOrEmpty(input))
                    {
                        return;
                    }
                    input = input.TrimEnd();
                }

                Image im = LoadArgs.load_image_color(input, 0, 0);
                Network.resize_network(net, im.W, im.H);
                Console.Write($"%d %d %d\n", im.H, im.W, im.C);
                float[] x = im.Data;
                sw.Reset();
                sw.Start();
                Network.network_predict(net, x);
                sw.Stop();
                Console.Write($"%s: Predicted ini %f seconds.\n", input, sw.Elapsed.Seconds);
                Image pred = Network.get_network_image(net);

                Image upsampled = LoadArgs.resize_image(pred, im.W, im.H);
                Image thresh    = LoadArgs.threshold_image(upsampled, .5f);
                pred = thresh;

                LoadArgs.show_image(pred, "prediction");
                LoadArgs.show_image(im, "orig");
                CvInvoke.WaitKey();
                CvInvoke.DestroyAllWindows();

                if (!string.IsNullOrEmpty(filename))
                {
                    break;
                }
            }
        }
示例#2
0
        private static void demo_art(string cfgfile, string weightfile, int camIndex)
        {
            Network net = Parser.parse_network_cfg(cfgfile);

            if (string.IsNullOrEmpty(weightfile))
            {
                Parser.load_weights(net, weightfile);
            }
            Network.set_batch_network(net, 1);

            Utils.Rand = new Random(2222222);
            using (VideoCapture cap = new VideoCapture(camIndex))
            {
                string window = "ArtJudgementBot9000!!!";
                if (cap != null)
                {
                    Utils.Error("Couldn't connect to webcam.\n");
                }
                int   i;
                int[] idx = { 37, 401, 434 };
                int   n   = idx.Length;

                while (true)
                {
                    Image ini = LoadArgs.get_image_from_stream(cap);
                    Image inS = LoadArgs.resize_image(ini, net.W, net.H);
                    LoadArgs.show_image(ini, window);

                    float[] p = Network.network_predict(net, inS.Data);

                    Console.Write($"\033[2J");
                    Console.Write($"\033[1;1H");

                    float score = 0;
                    for (i = 0; i < n; ++i)
                    {
                        float s = p[idx[i]];
                        if (s > score)
                        {
                            score = s;
                        }
                    }

                    Console.Write($"I APPRECIATE THIS ARTWORK: %10.7f%%\n", score * 100);
                    Console.Write($"[");
                    int upper = 30;
                    for (i = 0; i < upper; ++i)
                    {
                        Console.Write($"%c", ((i + .5) < score * upper) ? 219 : ' ');
                    }

                    Console.Write($"]\n");

                    CvInvoke.WaitKey(1);
                }
            }
        }
示例#3
0
 private static void fetch_in_thread()
 {
     inputImage = LoadArgs.get_image_from_stream(vidCap);
     if (inputImage.Data.Length == 0)
     {
         Utils.Error("Stream closed.");
     }
     inS = LoadArgs.resize_image(inputImage, net.W, net.H);
 }
示例#4
0
        private static FloatPair get_rnn_vid_data(Network net, string[] files, int n, int batch, int steps)
        {
            int   b;
            Image outIm      = Network.get_network_image(net);
            int   outputSize = outIm.W * outIm.H * outIm.C;

            Console.Write($"%d %d %d\n", outIm.W, outIm.H, outIm.C);
            float[] feats = new float[net.Batch * batch * outputSize];
            for (b = 0; b < batch; ++b)
            {
                int     inputSize = net.W * net.H * net.C;
                float[] input     = new float[inputSize * net.Batch];
                string  filename  = files[Utils.Rand.Next() % n];
                using (VideoCapture cap = new VideoCapture(filename))
                {
                    int frames = (int)cap.GetCaptureProperty(CapProp.FrameCount);
                    int index  = Utils.Rand.Next() % (frames - steps - 2);
                    if (frames < (steps + 4))
                    {
                        --b;
                        continue;
                    }

                    Console.Write($"frames: %d, index: %d\n", frames, index);
                    cap.SetCaptureProperty(CapProp.PosFrames, index);

                    int i;
                    for (i = 0; i < net.Batch; ++i)
                    {
                        using (Mat src = cap.QueryFrame())
                        {
                            Image im = new Image(src);

                            LoadArgs.rgbgr_image(im);
                            Image re = LoadArgs.resize_image(im, net.W, net.H);
                            Array.Copy(re.Data, 0, input, i * inputSize, inputSize);
                        }
                    }

                    float[] output = Network.network_predict(net, input);

                    for (i = 0; i < net.Batch; ++i)
                    {
                        Array.Copy(output, i * outputSize, feats, (b + i * batch) * outputSize, outputSize);
                    }
                }
            }

            FloatPair p = new FloatPair();

            p.X = feats;
            p.Y = new float[feats.Length - outputSize * batch];
            Array.Copy(feats, outputSize * batch, p.Y, 0, p.Y.Length);

            return(p);
        }
示例#5
0
        private static void optimize_picture(Network net, Image orig, int maxLayer, float scale, float rate, float thresh, bool norm)
        {
            net.N = maxLayer + 1;

            int  dx   = Utils.Rand.Next() % 16 - 8;
            int  dy   = Utils.Rand.Next() % 16 - 8;
            bool flip = Utils.Rand.Next() % 2 != 0;

            Image crop = LoadArgs.crop_image(orig, dx, dy, orig.W, orig.H);
            Image im   = LoadArgs.resize_image(crop, (int)(orig.W * scale), (int)(orig.H * scale));

            if (flip)
            {
                LoadArgs.flip_image(im);
            }

            Network.resize_network(net, im.W, im.H);
            Layer last = net.Layers[net.N - 1];

            Image delta = new Image(im.W, im.H, im.C);

            NetworkState state = new NetworkState();

            state.Input = (float[])im.Data.Clone();
            state.Delta = (float[])im.Data.Clone();

            Network.forward_network_gpu(net, state);
            Blas.copy_ongpu(last.Outputs, last.OutputGpu, last.DeltaGpu);

            Array.Copy(last.DeltaGpu, last.Delta, last.Outputs);
            calculate_loss(last.Delta, last.Delta, last.Outputs, thresh);
            Array.Copy(last.Delta, last.DeltaGpu, last.Outputs);

            Network.backward_network_gpu(net, state);

            Array.Copy(state.Delta, delta.Data, im.W * im.H * im.C);


            if (flip)
            {
                LoadArgs.flip_image(delta);
            }

            Image resized = LoadArgs.resize_image(delta, orig.W, orig.H);
            Image outi    = LoadArgs.crop_image(resized, -dx, -dy, orig.W, orig.H);

            if (norm)
            {
                Utils.normalize_array(outi.Data, outi.W * outi.H * outi.C);
            }
            Blas.Axpy_cpu(orig.W * orig.H * orig.C, rate, outi.Data, orig.Data);

            LoadArgs.constrain_image(orig);
        }
示例#6
0
        private static void test_coco(string cfgfile, string weightfile, string filename, float thresh)
        {
            Image[][] alphabet = LoadArgs.load_alphabet();
            Network net = Parser.parse_network_cfg(cfgfile);
            if (string.IsNullOrEmpty(weightfile))
            {
                Parser.load_weights(net, weightfile);
            }
            Layer l = net.Layers[net.N - 1];
            Network.set_batch_network(net, 1);
            Utils.Rand = new Random(2222222);
            float nms = .4f;
            var sw = new Stopwatch();

            int j;
            Box[] boxes = new Box[l.Side * l.Side * l.N];
            float[][] probs = new float[l.Side * l.Side * l.N][];
            for (j = 0; j < l.Side * l.Side * l.N; ++j) probs[j] = new float[l.Classes];
            while (true)
            {
                string input;
                if (!string.IsNullOrEmpty(filename))
                {
                    input = filename;
                }
                else
                {
                    Console.Write($"Enter Image Path: ");

                    input = Console.ReadLine();
                    if (string.IsNullOrEmpty(input)) return;
                    input = input.TrimEnd();
                }
                Image im = LoadArgs.load_image_color(input, 0, 0);
                Image sized = LoadArgs.resize_image(im, net.W, net.H);
                float[] x = sized.Data;
                sw.Reset();
                sw.Start();
                Network.network_predict(net, x);
                sw.Stop();
                Console.Write($"%s: Predicted ini %f seconds.\n", input, sw.Elapsed.Seconds);
                l.get_detection_boxes( 1, 1, thresh, probs, boxes, false);
                if (nms != 0) Box.do_nms_sort(boxes, probs, l.Side * l.Side * l.N, l.Classes, nms);
                LoadArgs.draw_detections(im, l.Side * l.Side * l.N, thresh, boxes, probs, CocoClasses, alphabet, 80);
                LoadArgs.save_image(im, "prediction");
                LoadArgs.show_image(im, "predictions");
                CvInvoke.WaitKey();
                CvInvoke.DestroyAllWindows();
                if (!string.IsNullOrEmpty(filename)) break;
            }
        }
示例#7
0
        private static void generate_vid_rnn(string cfgfile, string weightfile)
        {
            Network extractor = Parser.parse_network_cfg("cfg/extractor.recon.cfg");

            Parser.load_weights(extractor, "/home/pjreddie/trained/yolo-coco.conv");

            Network net = Parser.parse_network_cfg(cfgfile);

            if (string.IsNullOrEmpty(weightfile))
            {
                Parser.load_weights(net, weightfile);
            }
            Network.set_batch_network(extractor, 1);
            Network.set_batch_network(net, 1);

            int          i;
            VideoCapture cap = new VideoCapture("/extra/vid/ILSVRC2015/Data.Data/VID/snippets/val/ILSVRC2015_val_00007030.mp4");

            float[] feat;
            float[] next;
            next = null;
            Image last = null;

            for (i = 0; i < 25; ++i)
            {
                Image im = LoadArgs.get_image_from_stream(cap);
                Image re = LoadArgs.resize_image(im, extractor.W, extractor.H);
                feat = Network.network_predict(extractor, re.Data);
                if (i > 0)
                {
                    Console.Write($"%f %f\n", Utils.mean_array(feat, 14 * 14 * 512), Utils.variance_array(feat, 14 * 14 * 512));
                    Console.Write($"%f %f\n", Utils.mean_array(next, 14 * 14 * 512), Utils.variance_array(next, 14 * 14 * 512));
                    Console.Write($"%f\n", Utils.mse_array(feat, 14 * 14 * 512));
                    Blas.Axpy_cpu(14 * 14 * 512, -1, feat, next);
                    Console.Write($"%f\n", Utils.mse_array(next, 14 * 14 * 512));
                }
                next = Network.network_predict(net, feat);
                if (i == 24)
                {
                    last = new Image(re);
                }
            }
            for (i = 0; i < 30; ++i)
            {
                next = Network.network_predict(net, next);
                Image newi = save_reconstruction(extractor, last, next, "new", i);
                last = newi;
            }
        }
示例#8
0
        private static void gun_classifier(string datacfg, string cfgfile, string weightfile, int camIndex, string filename)
        {
            int[] badCats = { 218, 539, 540, 1213, 1501, 1742, 1911, 2415, 4348, 19223, 368, 369, 370, 1133, 1200, 1306, 2122, 2301, 2537, 2823, 3179, 3596, 3639, 4489, 5107, 5140, 5289, 6240, 6631, 6762, 7048, 7171, 7969, 7984, 7989, 8824, 8927, 9915, 10270, 10448, 13401, 15205, 18358, 18894, 18895, 19249, 19697 };

            Console.Write($"Classifier Demo\n");
            Network net = Parser.parse_network_cfg(cfgfile);

            if (string.IsNullOrEmpty(weightfile))
            {
                Parser.load_weights(net, weightfile);
            }
            Network.set_batch_network(net, 1);
            var options = OptionList.read_data_cfg(datacfg);

            Utils.Rand = new Random(2222222);
            using (VideoCapture cap = !string.IsNullOrEmpty(filename)
                ?  new VideoCapture(filename)
                : new VideoCapture(camIndex))
            {
                int top = OptionList.option_find_int(options, "top", 1);

                string   nameList = OptionList.option_find_str(options, "names", "");
                string[] names    = Data.Data.get_labels(nameList);

                int[] indexes = new int[top];

                if (cap.IsOpened)
                {
                    Utils.Error("Couldn't connect to webcam.\n");
                }

                float fps = 0;
                int   i;

                while (true)
                {
                    var sw = new Stopwatch();
                    sw.Start();

                    Image ini = LoadArgs.get_image_from_stream(cap);
                    Image inS = LoadArgs.resize_image(ini, net.W, net.H);
                    LoadArgs.show_image(ini, "Threat Detection");

                    float[] predictions = Network.network_predict(net, inS.Data);
                    Network.top_predictions(net, top, indexes);

                    Console.Write($"\033[2J");
                    Console.Write($"\033[1;1H");

                    bool threat = false;
                    for (i = 0; i < badCats.Length; ++i)
                    {
                        int index = badCats[i];
                        if (predictions[index] > .01)
                        {
                            Console.Write($"Threat Detected!\n");
                            threat = true;
                            break;
                        }
                    }

                    if (threat)
                    {
                        Console.Write($"Scanning...\n");
                    }
                    for (i = 0; i < badCats.Length; ++i)
                    {
                        int index = badCats[i];
                        if (predictions[index] > .01)
                        {
                            Console.Write($"%s\n", names[index]);
                        }
                    }

                    CvInvoke.WaitKey(10);

                    sw.Stop();
                    float curr = 1000.0f / sw.ElapsedMilliseconds;
                    fps = .9f * fps + .1f * curr;
                }
            }
        }
示例#9
0
        private static void threat_classifier(string datacfg, string cfgfile, string weightfile, int camIndex, string filename)
        {
            float threat = 0;
            float roll   = .2f;

            Console.Write($"Classifier Demo\n");
            Network net = Parser.parse_network_cfg(cfgfile);

            if (string.IsNullOrEmpty(weightfile))
            {
                Parser.load_weights(net, weightfile);
            }
            Network.set_batch_network(net, 1);
            var options = OptionList.read_data_cfg(datacfg);

            Utils.Rand = new Random(2222222);
            using (VideoCapture cap = !string.IsNullOrEmpty(filename)
                ? new VideoCapture(filename)
                : new VideoCapture(camIndex))
            {
                int top = OptionList.option_find_int(options, "top", 1);

                string   nameList = OptionList.option_find_str(options, "names", "");
                string[] names    = Data.Data.get_labels(nameList);

                int[] indexes = new int[top];

                if (!cap.IsOpened)
                {
                    Utils.Error("Couldn't connect to webcam.\n");
                }
                float fps = 0;
                int   i;

                int count = 0;

                while (true)
                {
                    ++count;
                    var sw = new Stopwatch();
                    sw.Start();

                    Image ini = LoadArgs.get_image_from_stream(cap);
                    if (ini.Data.Length == 0)
                    {
                        break;
                    }
                    Image inS = LoadArgs.resize_image(ini, net.W, net.H);

                    Image outo = ini;
                    int   x1   = outo.W / 20;
                    int   y1   = outo.H / 20;
                    int   x2   = 2 * x1;
                    int   y2   = outo.H - outo.H / 20;

                    int border = (int)(.01f * outo.H);
                    int h      = y2 - y1 - 2 * border;
                    int w      = x2 - x1 - 2 * border;

                    float[] predictions = Network.network_predict(net, inS.Data);
                    float   currThreat  = 0;
                    currThreat = predictions[0] * 0f +
                                 predictions[1] * .6f +
                                 predictions[2];
                    threat = roll * currThreat + (1 - roll) * threat;

                    LoadArgs.draw_box_width(outo, x2 + border, (int)(y1 + .02 * h), (int)(x2 + .5 * w), (int)(y1 + .02 * h + border), border, 0, 0,
                                            0);
                    if (threat > .97)
                    {
                        LoadArgs.draw_box_width(outo, (int)(x2 + .5 * w + border),
                                                (int)(y1 + .02 * h - 2 * border),
                                                (int)(x2 + .5 * w + 6 * border),
                                                (int)(y1 + .02 * h + 3 * border), 3 * border, 1, 0, 0);
                    }

                    LoadArgs.draw_box_width(outo, (int)(x2 + .5 * w + border),
                                            (int)(y1 + .02 * h - 2 * border),
                                            (int)(x2 + .5 * w + 6 * border),
                                            (int)(y1 + .02 * h + 3 * border), (int)(.5 * border), 0, 0, 0);
                    LoadArgs.draw_box_width(outo, x2 + border, (int)(y1 + .42 * h), (int)(x2 + .5 * w), (int)(y1 + .42 * h + border), border, 0, 0,
                                            0);
                    if (threat > .57)
                    {
                        LoadArgs.draw_box_width(outo, (int)(x2 + .5 * w + border),
                                                (int)(y1 + .42 * h - 2 * border),
                                                (int)(x2 + .5 * w + 6 * border),
                                                (int)(y1 + .42 * h + 3 * border), 3 * border, 1, 1, 0);
                    }

                    LoadArgs.draw_box_width(outo, (int)(x2 + .5 * w + border),
                                            (int)(y1 + .42 * h - 2 * border),
                                            (int)(x2 + .5 * w + 6 * border),
                                            (int)(y1 + .42 * h + 3 * border), (int)(.5 * border), 0, 0, 0);

                    LoadArgs.draw_box_width(outo, x1, y1, x2, y2, border, 0, 0, 0);
                    for (i = 0; i < threat * h; ++i)
                    {
                        float ratio = (float)i / h;
                        float r     = (ratio < .5f) ? (2 * (ratio)) : 1;
                        float g     = (ratio < .5f) ? 1 : 1 - 2 * (ratio - .5f);
                        LoadArgs.draw_box_width(outo, x1 + border, y2 - border - i, x2 - border, y2 - border - i, 1, r, g, 0);
                    }

                    Network.top_predictions(net, top, indexes);

                    string buff = $"/home/pjreddie/tmp/threat_{count:06}";

                    Console.Write($"\033[2J");
                    Console.Write($"\033[1;1H");
                    Console.Write($"\nFPS:%.0f\n", fps);

                    for (i = 0; i < top; ++i)
                    {
                        int index = indexes[i];
                        Console.Write($"%.1f%%: %s\n", predictions[index] * 100, names[index]);
                    }

                    LoadArgs.show_image(outo, "Threat");
                    CvInvoke.WaitKey(10);

                    sw.Stop();
                    float curr = 1000.0f / sw.ElapsedMilliseconds;
                    fps = .9f * fps + .1f * curr;
                }
            }
        }
示例#10
0
        private static void demo_classifier(string datacfg, string cfgfile, string weightfile, int camIndex, string filename)
        {
            Console.Write($"Classifier Demo\n");
            Network net = Parser.parse_network_cfg(cfgfile);

            if (string.IsNullOrEmpty(weightfile))
            {
                Parser.load_weights(net, weightfile);
            }
            Network.set_batch_network(net, 1);
            var options = OptionList.read_data_cfg(datacfg);

            Utils.Rand = new Random(2222222);
            using (VideoCapture cap = !string.IsNullOrEmpty(filename)
                ? new VideoCapture(filename)
                : new VideoCapture(camIndex))
            {
                int top = OptionList.option_find_int(options, "top", 1);

                string   nameList = OptionList.option_find_str(options, "names", "");
                string[] names    = Data.Data.get_labels(nameList);

                int[] indexes = new int[top];

                if (cap != null)
                {
                    Utils.Error("Couldn't connect to webcam.\n");
                }

                float fps = 0;
                int   i;

                while (true)
                {
                    var sw = new Stopwatch();
                    sw.Start();

                    Image ini = LoadArgs.get_image_from_stream(cap);
                    Image inS = LoadArgs.resize_image(ini, net.W, net.H);
                    LoadArgs.show_image(ini, "Classifier");

                    float[] predictions = Network.network_predict(net, inS.Data);
                    if (net.Hierarchy != null)
                    {
                        net.Hierarchy.Hierarchy_predictions(predictions, 0, net.Outputs, true);
                    }
                    Network.top_predictions(net, top, indexes);

                    Console.Write($"\033[2J");
                    Console.Write($"\033[1;1H");
                    Console.Write($"\nFPS:%.0f\n", fps);

                    for (i = 0; i < top; ++i)
                    {
                        int index = indexes[i];
                        Console.Write($"%.1f%%: %s\n", predictions[index] * 100, names[index]);
                    }

                    CvInvoke.WaitKey(10);

                    sw.Stop();
                    float curr = 1000.0f / sw.ElapsedMilliseconds;
                    fps = .9f * fps + .1f * curr;
                }
            }
        }
示例#11
0
        public static void run_nightmare(List <string> args)
        {
            if (args.Count < 4)
            {
                Console.Error.Write($"usage: %s %s [cfg] [weights] [Image] [Layer] [options! (optional)]\n", args[0], args[1]);
                return;
            }

            string cfg      = args[2];
            string weights  = args[3];
            string input    = args[4];
            int    maxLayer = int.Parse(args[5]);

            int    range       = Utils.find_int_arg(args, "-range", 1);
            bool   norm        = Utils.find_int_arg(args, "-norm", 1) != 0;
            int    rounds      = Utils.find_int_arg(args, "-rounds", 1);
            int    iters       = Utils.find_int_arg(args, "-iters", 10);
            int    octaves     = Utils.find_int_arg(args, "-octaves", 4);
            float  zoom        = Utils.find_int_arg(args, "-zoom", 1);
            float  rate        = Utils.find_int_arg(args, "-rate", .04f);
            float  thresh      = Utils.find_int_arg(args, "-thresh", 1);
            float  rotate      = Utils.find_int_arg(args, "-rotate", 0);
            float  momentum    = Utils.find_int_arg(args, "-momentum", .9f);
            float  lambda      = Utils.find_int_arg(args, "-lambda", .01f);
            string prefix      = Utils.find_int_arg(args, "-prefix", "");
            bool   reconstruct = Utils.find_arg(args, "-reconstruct");
            int    smoothSize  = Utils.find_int_arg(args, "-smooth", 1);

            Network net = Parser.parse_network_cfg(cfg);

            Parser.load_weights(net, weights);
            string cfgbase = Utils.Basecfg(cfg);
            string imbase  = Utils.Basecfg(input);

            Network.set_batch_network(net, 1);
            Image im = LoadArgs.load_image_color(input, 0, 0);

            float[] features = new float[0];
            Image   update   = null;

            if (reconstruct)
            {
                Network.resize_network(net, im.W, im.H);

                int zz = 0;
                Network.network_predict(net, im.Data);
                Image outIm = Network.get_network_image(net);
                Image crop  = LoadArgs.crop_image(outIm, zz, zz, outIm.W - 2 * zz, outIm.H - 2 * zz);
                Image fIm   = LoadArgs.resize_image(crop, outIm.W, outIm.H);
                Console.Write($"%d features\n", outIm.W * outIm.H * outIm.C);


                im       = LoadArgs.resize_image(im, im.W, im.H);
                fIm      = LoadArgs.resize_image(fIm, fIm.W, fIm.H);
                features = fIm.Data;

                int i;
                for (i = 0; i < 14 * 14 * 512; ++i)
                {
                    features[i] += Utils.rand_uniform(-.19f, .19f);
                }

                im     = LoadArgs.make_random_image(im.W, im.H, im.C);
                update = new Image(im.W, im.H, im.C);
            }

            int e;
            int n;

            for (e = 0; e < rounds; ++e)
            {
                Console.Error.Write($"Iteration: ");
                for (n = 0; n < iters; ++n)
                {
                    Console.Error.Write($"%d, ", n);
                    if (reconstruct)
                    {
                        reconstruct_picture(net, features, im, update, rate, momentum, lambda, smoothSize, 1);
                        //if ((n+1)%30 == 0) rate *= .5;
                        LoadArgs.show_image(im, "reconstruction");
                        CvInvoke.WaitKey(10);
                    }
                    else
                    {
                        int layer  = maxLayer + Utils.Rand.Next() % range - range / 2;
                        int octave = Utils.Rand.Next() % octaves;
                        optimize_picture(net, im, layer, 1 / (float)Math.Pow(1.33333333, octave), rate, thresh, norm);
                    }
                }
                Console.Error.Write($"done\n");
                string buff;
                if (!string.IsNullOrEmpty(prefix))
                {
                    buff = $"{prefix}_{imbase}_{cfgbase}_{maxLayer}_{e:06}%s/%s_%s_%d_%06d";
                }
                else
                {
                    buff = $"{imbase}_{cfgbase}_{maxLayer}_{e:06}";
                }
                Console.Write($"%d %s\n", e, buff);
                LoadArgs.save_image(im, buff);
                //LoadArgs.show_image(im, buff);
                //CvInvoke.WaitKey();

                if (rotate != 0)
                {
                    Image rot = LoadArgs.rotate_image(im, rotate);
                    im = rot;
                }
                Image crop    = LoadArgs.crop_image(im, (int)(im.W * (1f - zoom) / 2f), (int)(im.H * (1f - zoom) / 2f), (int)(im.W * zoom), (int)(im.H * zoom));
                Image resized = LoadArgs.resize_image(crop, im.W, im.H);
                im = resized;
            }
        }
示例#12
0
        private static void validate_yolo_recall(string cfgfile, string weightfile)
        {
            Network net = Parser.parse_network_cfg(cfgfile);

            if (string.IsNullOrEmpty(weightfile))
            {
                Parser.load_weights(net, weightfile);
            }
            Network.set_batch_network(net, 1);
            Console.Error.Write($"Learning Rate: %g, Momentum: %g, Decay: %g\n", net.LearningRate, net.Momentum, net.Decay);

            string[] paths = Data.Data.GetPaths("Data.Data/voc.2007.test");

            Layer l       = net.Layers[net.N - 1];
            int   classes = l.Classes;
            int   side    = l.Side;

            int j, k;

            Box[]     boxes = new Box[side * side * l.N];
            float[][] probs = new float[side * side * l.N][];
            for (j = 0; j < side * side * l.N; ++j)
            {
                probs[j] = new float[classes];
            }

            int m = paths.Length;
            int i = 0;

            float thresh    = .001f;
            float iouThresh = .5f;

            int   total     = 0;
            int   correct   = 0;
            int   proposals = 0;
            float avgIou    = 0;

            for (i = 0; i < m; ++i)
            {
                string path  = paths[i];
                Image  orig  = LoadArgs.load_image_color(path, 0, 0);
                Image  sized = LoadArgs.resize_image(orig, net.W, net.H);
                string id    = Utils.Basecfg(path);
                Network.network_predict(net, sized.Data);
                l.get_detection_boxes(orig.W, orig.H, thresh, probs, boxes, true);

                string labelpath;
                Utils.find_replace(path, "images", "labels", out labelpath);
                Utils.find_replace(labelpath, "JPEGImages", "labels", out labelpath);
                Utils.find_replace(labelpath, ".jpg", ".txt", out labelpath);
                Utils.find_replace(labelpath, ".JPEG", ".txt", out labelpath);

                int        numLabels = 0;
                BoxLabel[] truth     = Data.Data.read_boxes(labelpath, ref numLabels);
                for (k = 0; k < side * side * l.N; ++k)
                {
                    if (probs[k][0] > thresh)
                    {
                        ++proposals;
                    }
                }
                for (j = 0; j < numLabels; ++j)
                {
                    ++total;
                    Box   t       = new Box(truth[j].X, truth[j].Y, truth[j].W, truth[j].H);
                    float bestIou = 0;
                    for (k = 0; k < side * side * l.N; ++k)
                    {
                        float iou = Box.box_iou(boxes[k], t);
                        if (probs[k][0] > thresh && iou > bestIou)
                        {
                            bestIou = iou;
                        }
                    }
                    avgIou += bestIou;
                    if (bestIou > iouThresh)
                    {
                        ++correct;
                    }
                }

                Console.Error.Write($"%5d %5d %5d\tRPs/Img: %.2f\tIOU: %.2f%%\tRecall:%.2f%%\n", i, correct, total, (float)proposals / (i + 1), avgIou * 100 / total, 100f * correct / total);
            }
        }
示例#13
0
        public static void test_detector(string datacfg, string cfgfile, string weightfile, string filename, float thresh)
        {
            var    options  = OptionList.read_data_cfg(datacfg);
            string nameList = OptionList.option_find_str(options, "names", "Data.Data/names.list");

            string[] names = Data.Data.get_labels(nameList);

            Image[][] alphabet = LoadArgs.load_alphabet();
            Network   net      = Parser.parse_network_cfg(cfgfile);

            if (string.IsNullOrEmpty(weightfile))
            {
                Parser.load_weights(net, weightfile);
            }
            Network.set_batch_network(net, 1);
            Utils.Rand = new Random(2222222);
            var sw = new Stopwatch();

            string input = "";
            int    j;
            float  nms = .4f;

            while (true)
            {
                if (!string.IsNullOrEmpty(filename))
                {
                    input = filename;
                }
                else
                {
                    Console.Write($"Enter Image Path: ");

                    input = Console.ReadLine();
                    if (string.IsNullOrEmpty(input))
                    {
                        return;
                    }
                    input = input.TrimEnd();
                }
                Image im    = LoadArgs.load_image_color(input, 0, 0);
                Image sized = LoadArgs.resize_image(im, net.W, net.H);
                Layer l     = net.Layers[net.N - 1];

                Box[]     boxes = new Box[l.W * l.H * l.N];
                float[][] probs = new float[l.W * l.H * l.N][];
                for (j = 0; j < l.W * l.H * l.N; ++j)
                {
                    probs[j] = new float[l.Classes];
                }

                float[] x = sized.Data;
                sw.Start();
                Network.network_predict(net, x);
                sw.Stop();
                Console.Write($"%s: Predicted ini %f seconds.\n", input, sw.Elapsed.Seconds);
                Layer.get_region_boxes(l, 1, 1, thresh, probs, boxes, false, new int[0]);
                if (nms != 0)
                {
                    Box.do_nms_sort(boxes, probs, l.W * l.H * l.N, l.Classes, nms);
                }
                LoadArgs.draw_detections(im, l.W * l.H * l.N, thresh, boxes, probs, names, alphabet, l.Classes);
                LoadArgs.save_image(im, "predictions");
                LoadArgs.show_image(im, "predictions");

                CvInvoke.WaitKey();
                CvInvoke.DestroyAllWindows();
                if (!string.IsNullOrEmpty(filename))
                {
                    break;
                }
            }
        }