/// <summary> /// Load the classifier file /// </summary> /// <param name="loadFileName"></param> /// <returns></returns> public static StrongClassifier LoadClassifier(string loadFileName) { StreamReader sr = new StreamReader(loadFileName, System.Text.Encoding.Unicode); XmlReader xr = new XmlTextReader(sr); XmlSerializer ser = new XmlSerializer(typeof(StrongClassifier)); StrongClassifier classifier = (StrongClassifier)ser.Deserialize(xr); xr.Close(); return(classifier); }
/// <summary> /// Calculate the LBP distance /// </summary> /// <param name="frontUIData"></param> public void LBPDistance(DataExchange frontUIData) { ParseConfig(frontUIData); List <Image> listFilteredImage = new List <Image>(); int nEl = frontUIData.ElementCount; ExchangeElement exEl = null; Image filteredImage = null; LBPFilter lbpFilter = new LBPFilter(1, 8, true, true); int i, j; for (i = 0; i < nEl; i++) { exEl = frontUIData.GetElement(i); filteredImage = GetData(exEl, lbpFilter); listFilteredImage.Add(filteredImage); } SparseFilterExample example; LBPIntegralHistogrom lbpHist1 = new LBPIntegralHistogrom(); LBPIntegralHistogrom lbpHist2 = new LBPIntegralHistogrom(); StrongClassifier strongClassifier = LoadClassifier(_classifierFileName); RectangularFilter rectangularFilters = LoadFilterSet(_rectangularFileName); List <int> listRectangularIndices = GetFilterIndex(strongClassifier); float[] score = new float[2]; double[] expScore = new double[2]; double[,] distanceMatrix = new double[nEl, nEl]; for (i = 0; i < nEl; i++) { lbpHist1.Create(listFilteredImage[i], lbpFilter.m_nFilterRange + 1); for (j = 0; j < i; j++) { lbpHist2.Create(listFilteredImage[j], lbpFilter.m_nFilterRange + 1); example = CreateFilterResponses(lbpHist1, lbpHist2, rectangularFilters, listRectangularIndices); score[0] = score[1] = 0; score = strongClassifier.Vote(example, score, _stage); expScore[0] = Math.Exp(Convert.ToDouble(score[0])); expScore[1] = Math.Exp(Convert.ToDouble(score[1])); distanceMatrix[i, j] = expScore[0] / (expScore[0] + expScore[1]) + 0.05; distanceMatrix[j, i] = distanceMatrix[i, j]; } } frontUIData.DistanceMatrix = distanceMatrix; }
/// <summary> /// Get the list of rectangular filter ID /// </summary> /// <param name="strongClassifier"></param> /// <returns></returns> private List <int> GetFilterIndex(StrongClassifier strongClassifier) { List <int> listRectangleIndex = new List <int>(); if (strongClassifier.Classifiers[0] is Feature) { foreach (Feature feature in strongClassifier.Classifiers) { if (!listRectangleIndex.Contains(feature.Nfilter)) { listRectangleIndex.Add(feature.Nfilter); } } } else { if (strongClassifier.Classifiers[0] is DecisionTree) { foreach (DecisionTree decisionTree in strongClassifier.Classifiers) { DecisionTree.SubTreeCollection treeNodeCollection = new DecisionTree.SubTreeCollection(decisionTree); foreach (DecisionTree treenode in treeNodeCollection) { if (treenode.Decision != null) { if (!listRectangleIndex.Contains(treenode.Decision.Nfilter)) { listRectangleIndex.Add(treenode.Decision.Nfilter); } } } } } } return(listRectangleIndex); }