Ejemplo n.º 1
0
        } // Done

        /// <summary>
        /// Определяет степень сходства двух заданных объектов.
        /// </summary>
        /// <param name="features1">Совокупность реперных характеристик одного из сравниваемых объектов.</param>
        /// <param name="features2">Совокупность реперных характеристик другого сравниваемого объекта.</param>
        /// <returns>Степень сходства заданных объектов.</returns>
        public virtual Affinity Detect(IEnumerable <T> features1, IEnumerable <T> features2)
        {
            if (CorrelationMatrix == null)
            {
                throw new AssertException("Отсутствует матрица корреляций, т.к. не был вызван метод Init базового класса детектора сходства.");
            }
            if (AffinityBlockBuilder == null)
            {
                throw new AffinityDetectorException("В свойстве AffinityBlockBuilder не задан метод разбиения реперных характеристик сравниваемых объектов на устойчивые блоки реперных характеристик.");
            }
            if (AffinityBlockCorrelator == null)
            {
                throw new AffinityDetectorException("В свойстве AffinityBlockCorrelator не задан метод определения степени корреляции между устойчивыми блоками реперных характеристик сравниваемых объектов.");
            }
            AffinityBlocks1 = AffinityBlockBuilder(features1);
            AffinityBlocks2 = AffinityBlockBuilder(features2);
            int    size        = 0;
            int    diffs       = 0;
            double reliability = 0;

            while (AffinityBlocks1.MoveNext() && AffinityBlocks2.MoveNext())
            {
                Correlation correlation = AffinityBlockCorrelatorInvoke(AffinityBlocks1.Current, AffinityBlocks2.Current);
                if (correlation.Importance > 0.5)
                {
                    // Учитываем только значимые блоки и пропускаем малозначительные, например, относящиеся к фону.
                    if (correlation.Value > 0.5)
                    {
                        // Соответствующие устойчивые блоки реперных характеристик коррелируют между собой.
                        reliability = reliability + correlation.Value;
                    }
                    else
                    {
                        // Соответствующие устойчивые блоки реперных характеристик не коррелируют между собой.
                        diffs++;
                    }
                    size++;
                }
            }
            if (size == diffs)
            {
                // Сравниваемые объекты гарантированно не похожи между собой.
                reliability      = 1;
                DetectedAffinity = new Affinity(0, reliability);
            }
            else
            {
                // Сравниваемые объекты имеют некоторое сходство по своим реперным характеристикам.
                reliability = reliability / (size - diffs);
                double affinity = 1 - (double)diffs / (double)size;
                DetectedAffinity = new Affinity(affinity, reliability);
            }
            return(DetectedAffinity);
        } // Detect
Ejemplo n.º 2
0
        } // Init

        /// <summary>
        /// Деинициализирует механизм выявления сходства, например, обновляет библиотеку моделей типичных растров или фиксирует улучшенные коэффициенты нейросети.
        /// </summary>
        public virtual void Done()
        {
            if (AffinityBlocks1 != null)
            {
                AffinityBlocks1.Dispose();
                AffinityBlocks1 = null;
            }
            if (AffinityBlocks2 != null)
            {
                AffinityBlocks2.Dispose();
                AffinityBlocks2 = null;
            }
            DetectedAffinity = null;
        } // Done