示例#1
0
    public static Jackknife.Vector ToJKVector(Machete.Vector v)
    {
        List <double> JKVectorData = new List <double>();

        // Go through all data in vector
        foreach (double data in v.Data)
        {
            JKVectorData.Add(data);
        }
        Jackknife.Vector jkv = new Jackknife.Vector(JKVectorData);

        return(jkv);
    }
示例#2
0
    public static List <Jackknife.Vector> GetJKBuffer(List <Machete.Vector> buffer)
    {
        List <Jackknife.Vector> retpts = new List <Jackknife.Vector>();

        foreach (Machete.Vector v in buffer)
        {
            List <double> JKVectorData = new List <double>();

            // Go through all data in vector
            foreach (double data in v.Data)
            {
                JKVectorData.Add(data);
            }
            Jackknife.Vector jv = new Jackknife.Vector(JKVectorData);
            retpts.Add(jv);
        }

        return(retpts);
    }
示例#3
0
    /**
     * This might just be the worst piece of code that
     * I will ever write in my life
     */
    public static List <Jackknife.Sample> GetJKTrainSet(List <Machete.Sample> in_samples)
    {
        List <Jackknife.Sample> samples = new List <Jackknife.Sample>();

        foreach (Machete.Sample y_s in in_samples)
        {
            // Copy sample ids
            Jackknife.Sample s = new Jackknife.Sample(
                y_s.SubjectId,
                y_s.GestureId,
                0);

            // Copy sample trajectory
            List <Jackknife.Vector> newTrajectory = new List <Jackknife.Vector>();

            // Go through each vector
            foreach (Machete.Vector yeahSampleTrajectoryV in y_s.FilteredTrajectory)
            {
                List <double> JKVectorData = new List <double>();

                // Go through all data in vector
                foreach (double data in yeahSampleTrajectoryV.Data)
                {
                    JKVectorData.Add(data);
                }
                Jackknife.Vector v = new Jackknife.Vector(JKVectorData);

                newTrajectory.Add(v);
            }

            s.AddTrajectory(newTrajectory);

            samples.Add(s);
        }

        return(samples);
    }
示例#4
0
    public static List <Jackknife.Vector> GetJKBufferFromVideo(
        List <Machete.Vector> video,
        int startFrameNo,
        int endFrameNo
        )
    {
        List <Jackknife.Vector> buffer = new List <Jackknife.Vector>();

        for (int ii = startFrameNo; ii <= endFrameNo; ii++)
        {
            Machete.Vector v = video[ii];

            // Go through all data in vector
            List <double> JKVectorData = new List <double>();
            foreach (double data in v.Data)
            {
                JKVectorData.Add(data);
            }
            Jackknife.Vector jv = new Jackknife.Vector(JKVectorData);
            buffer.Add(jv);
        }

        return(buffer);
    }
示例#5
0
 public void Update(Jackknife.Vector pt)
 {
     buffer.Insert(pt);
 }
        public static Results EvaluateSessionWindowed(DeviceType device, int subject_id)
        {
            configuartion_parameters_t parameneters = new configuartion_parameters_t(device);

            // Load subject dataset
            Dataset       ds        = Global.load_subject_dataset(device, subject_id);
            List <Sample> train_set = Global.GetTrainSet(ds, 1);

            // Covert the dataset to format accepted by Jackknife
            List <Jackknife.Sample> jk_train_set = JackknifeConnector.GetJKTrainSet(train_set);

            // Load subject session
            List <Frame> frames = new List <Frame>();

            Global.load_session(device, subject_id, frames, ds);

            // Load ground truth
            List <GestureCommand> cmds = new List <GestureCommand>();

            GestureCommand.GetAllCommands(cmds, ds, device, subject_id);

            // Train the recognizer
            JackknifeBlades blades = new JackknifeBlades();

            blades.SetIPDefaults();

            blades.ResampleCnt = 20;

            Jackknife.Jackknife jk = new Jackknife.Jackknife(blades);
            foreach (Jackknife.Sample s in jk_train_set)
            {
                jk.AddTemplate(s);
            }

            // Set between 2.0 and 10.0 in steps of .25
            // to find the best result
            jk.SetRejectionThresholds(5.25f);

            // Set up filter for session points
            ExponentialMovingAverage ema_filter = new ExponentialMovingAverage(frames[0].pt);
            Vector pt;

            WindowSegmentor windowSegmentor = new WindowSegmentor(jk);

            //List<RecognitionResult> rresults = new List<RecognitionResult>();

            List <ContinuousResult> continuous_results = new List <ContinuousResult>();

            // Go through session
            for (int session_pt = 0; session_pt < frames.Count; session_pt++)
            {
                long ts1 = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; // at beginning

                pt = ema_filter.Filter(frames[session_pt].pt, 1 / (double)parameneters.fps);

                long ts2 = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond; // after filter

                Jackknife.Vector jkpt = JackknifeConnector.ToJKVector(pt);

                windowSegmentor.Update(jkpt);
                windowSegmentor.Segment(continuous_results);

                if (session_pt % 2000 == 0)
                {
                    Debug.Log(string.Format("{0}% Done", (double)session_pt / (double)frames.Count * 100.0));
                }
            }

            foreach (ContinuousResult cr in continuous_results)
            {
                Debug.Log(string.Format("st {0}, en {1}, gid {2}", cr.startFrameNo, cr.endFrameNo, cr.gid));
            }
            // Per gesture confusion matrix
            List <ConfisionMatrix> cm = new List <ConfisionMatrix>();

            for (int ii = 0; ii < ds.Gestures.Count; ii++)
            {
                cm.Add(new ConfisionMatrix());
            }

            for (int ii = 0; ii < continuous_results.Count; ii++)
            {
                ContinuousResult result = continuous_results[ii];

                bool found = false;
                int  cidx  = 0;

                for (cidx = 0; cidx < cmds.Count; cidx++)
                {
                    found = cmds[cidx].Hit(result);

                    if (found == true)
                    {
                        break;
                    }
                }

                if (found == true)
                {
                    // true positive
                    if (cmds[cidx].detected == false)
                    {
                        cmds[cidx].detected = true;
                        cm[result.gid].tp  += 1.0f;
                    }
                }
                else
                {
                    bool bad = GestureCommand.IsBadCommand(
                        frames,
                        result);

                    if (bad == true)
                    {
                        continue;
                    }
                    // false positive
                    cm[result.gid].fp += 1.0f;
                }
            }

            // false negatives
            for (int cidx = 0; cidx < cmds.Count; cidx++)
            {
                if (cmds[cidx].detected == true)
                {
                    continue;
                }

                cm[cmds[cidx].gid].fn += 1.0;
            }

            Results ret = new Results();

            for (int ii = 0; ii < cm.Count; ii++)
            {
                ret.AppendResults(cm[ii]);
            }

            ret.PrintF();
            return(ret);
        }