From 2a4dd3c46bf9091b8a7c18b56b1d43797446b269 Mon Sep 17 00:00:00 2001 From: lidapeng <794757862@qq.com> Date: Mon, 26 Oct 2020 17:32:15 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=B7=B1=E5=B1=82=E6=98=A0?= =?UTF-8?q?=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wlld/imageRecognition/Convolution.java | 17 +- .../org/wlld/imageRecognition/Operation.java | 77 ++++++- .../modelEntity/DeepMappingBody.java | 26 +++ .../segmentation/DimensionMappingStudy.java | 203 ++++++++++++------ .../segmentation/FeatureMapping.java | 8 +- src/main/java/org/wlld/param/Food.java | 11 +- src/test/java/coverTest/FoodTest.java | 95 +++++++- 7 files changed, 341 insertions(+), 96 deletions(-) create mode 100644 src/main/java/org/wlld/imageRecognition/modelEntity/DeepMappingBody.java diff --git a/src/main/java/org/wlld/imageRecognition/Convolution.java b/src/main/java/org/wlld/imageRecognition/Convolution.java index 058570f..390e560 100644 --- a/src/main/java/org/wlld/imageRecognition/Convolution.java +++ b/src/main/java/org/wlld/imageRecognition/Convolution.java @@ -135,7 +135,7 @@ public class Convolution extends Frequency { } public List getCenterTexture(ThreeChannelMatrix threeChannelMatrix, int size, TempleConfig templeConfig - , int sqNub) throws Exception { + , int sqNub, boolean isStudy) throws Exception { MeanClustering meanClustering = new MeanClustering(sqNub, templeConfig, true); Matrix matrixR = threeChannelMatrix.getMatrixR(); Matrix matrixG = threeChannelMatrix.getMatrixG(); @@ -184,6 +184,9 @@ public class Convolution extends Frequency { List features = new ArrayList<>(); for (int i = 0; i < sqNub; i++) { double[] rgb = rgbNorms.get(i).getRgb(); + if (!isStudy) { + rgb = rgbMapping(rgb, i, templeConfig); + } for (int j = 0; j < rgb.length; j++) { features.add(rgb[j]); } @@ -193,6 +196,18 @@ public class Convolution extends Frequency { return features; } + private double[] rgbMapping(double[] rgb, int index, TempleConfig templeConfig) {//进行映射 + double[] mapping = templeConfig.getFood().getMappingParameter(); + int size = rgb.length; + int allSize = mapping.length / 2; + double[] mappingFeature = new double[size]; + for (int i = 0; i < size; i++) { + int myIndex = size * index + i; + mappingFeature[i] = rgb[i] * mapping[myIndex] + mapping[allSize + myIndex]; + } + return mappingFeature; + } + private void normalization(Matrix matrix) throws Exception { for (int i = 0; i < matrix.getX(); i++) { for (int j = 0; j < matrix.getY(); j++) { diff --git a/src/main/java/org/wlld/imageRecognition/Operation.java b/src/main/java/org/wlld/imageRecognition/Operation.java index 0f5a584..3fa5093 100644 --- a/src/main/java/org/wlld/imageRecognition/Operation.java +++ b/src/main/java/org/wlld/imageRecognition/Operation.java @@ -7,7 +7,10 @@ import org.wlld.config.Classifier; import org.wlld.config.StudyPattern; import org.wlld.i.OutBack; import org.wlld.imageRecognition.border.*; -import org.wlld.imageRecognition.segmentation.*; +import org.wlld.imageRecognition.segmentation.RegionBody; +import org.wlld.imageRecognition.segmentation.RgbRegression; +import org.wlld.imageRecognition.segmentation.Specifications; +import org.wlld.imageRecognition.segmentation.Watershed; import org.wlld.nerveCenter.NerveManager; import org.wlld.nerveCenter.Normalization; import org.wlld.nerveEntity.SensoryNerve; @@ -88,13 +91,40 @@ public class Operation {//进行计算 int maxY = regionBody.getMaxY() - dif; int xSize = maxX - minX; int ySize = maxY - minY; + //convolution.imgNormalization(threeChannelMatrix); ThreeChannelMatrix threeChannelMatrix1 = convolution.getRegionMatrix(threeChannelMatrix, minX, minY, xSize, ySize); - List feature = convolution.getCenterTexture(threeChannelMatrix1, templeConfig.getFood().getRegionSize(), templeConfig, templeConfig.getFeatureNub()); - Knn knn = templeConfig.getFood().getDimensionMappingStudy().getKnn(); - knn.insertMatrix(MatrixOperation.listToRowVector(feature), tag); + // List feature = convolution.getCenterColor(threeChannelMatrix1, templeConfig, templeConfig.getFeatureNub()); + List feature = convolution.getCenterTexture(threeChannelMatrix1, templeConfig.getFood().getRegionSize(), templeConfig, templeConfig.getFeatureNub(), true); + if (templeConfig.isShowLog()) { + System.out.println(tag + ":" + feature); + } + int classifier = templeConfig.getClassifier(); + switch (classifier) { + case Classifier.DNN: + Map map = new HashMap<>(); + map.put(tag, 1.0); + if (templeConfig.getSensoryNerves().size() == templeConfig.getFeatureNub() * 3) { + intoDnnNetwork(1, feature, templeConfig.getSensoryNerves(), true, map, null); + } else { + throw new Exception("nerves number is not equal featureNub"); + } + break; + case Classifier.LVQ: + Matrix vector = MatrixOperation.listToRowVector(feature); + lvqStudy(tag, vector); + break; + case Classifier.VAvg: + Matrix vec = MatrixOperation.listToRowVector(feature); + avgStudy(tag, vec); + break; + case Classifier.KNN: + Matrix veck = MatrixOperation.listToRowVector(feature); + knnStudy(tag, veck); + break; + } + return regionBody; } else { - System.out.println("error=============================================error"); for (RegionBody regionBody : regionBodies) { int minX = regionBody.getMinX(); int minY = regionBody.getMinY(); @@ -103,7 +133,6 @@ public class Operation {//进行计算 System.out.println("异常:minX==" + minX + ",minY==" + minY + ",maxX==" + maxX + ",maxY==" + maxY + ",tag==" + tag + "url==" + url); } - System.out.println("error=============================================error"); throw new Exception("Parameter exception region size==" + regionBodies.size()); } } @@ -130,6 +159,7 @@ public class Operation {//进行计算 Watershed watershed = new Watershed(threeChannelMatrix, specificationsList, templeConfig); List regionList = watershed.rainfall(); for (RegionBody regionBody : regionList) { + MaxPoint maxPoint = new MaxPoint(); int minX = regionBody.getMinX() + dif; int minY = regionBody.getMinY() + dif; int maxX = regionBody.getMaxX() - dif; @@ -137,10 +167,37 @@ public class Operation {//进行计算 int xSize = maxX - minX; int ySize = maxY - minY; ThreeChannelMatrix threeChannelMatrix1 = convolution.getRegionMatrix(threeChannelMatrix, minX, minY, xSize, ySize); - List feature = convolution.getCenterTexture(threeChannelMatrix1, templeConfig.getFood().getRegionSize(), templeConfig, templeConfig.getFeatureNub()); - Matrix myMatrix2 = MatrixOperation.listToRowVector(feature); - DimensionMappingStudy dimensionMappingStudy = templeConfig.getFood().getDimensionMappingStudy(); - int id = dimensionMappingStudy.toClassification(myMatrix2); + //List feature = convolution.getCenterColor(threeChannelMatrix1, templeConfig, templeConfig.getFeatureNub()); + List feature = convolution.getCenterTexture(threeChannelMatrix1, templeConfig.getFood().getRegionSize(), templeConfig, templeConfig.getFeatureNub(), false); + + if (templeConfig.isShowLog()) { + System.out.println(feature); + } + int classifier = templeConfig.getClassifier(); + int id = 0; + switch (classifier) { + case Classifier.LVQ: + Matrix myMatrix = MatrixOperation.listToRowVector(feature); + id = getIdByLVQ(myMatrix); + break; + case Classifier.DNN: + if (templeConfig.getSensoryNerves().size() == templeConfig.getFeatureNub() * 3) { + intoDnnNetwork(IdCreator.get().nextId(), feature, templeConfig.getSensoryNerves(), false, null, maxPoint); + id = maxPoint.getId(); + } else { + throw new Exception("nerves number is not equal featureNub"); + } + break; + case Classifier.VAvg: + Matrix myMatrix1 = MatrixOperation.listToRowVector(feature); + id = getIdByVag(myMatrix1); + break; + case Classifier.KNN: + Matrix myMatrix2 = MatrixOperation.listToRowVector(feature); + Knn knn = templeConfig.getKnn(); + id = knn.getType(myMatrix2); + break; + } regionBody.setType(id); System.out.println("类别" + id); } diff --git a/src/main/java/org/wlld/imageRecognition/modelEntity/DeepMappingBody.java b/src/main/java/org/wlld/imageRecognition/modelEntity/DeepMappingBody.java new file mode 100644 index 0000000..b91c3de --- /dev/null +++ b/src/main/java/org/wlld/imageRecognition/modelEntity/DeepMappingBody.java @@ -0,0 +1,26 @@ +package org.wlld.imageRecognition.modelEntity; + +import org.wlld.imageRecognition.TempleConfig; +import org.wlld.imageRecognition.border.Knn; +import org.wlld.imageRecognition.segmentation.DimensionMappingStudy; + +import java.util.HashMap; +import java.util.Map; + +/** + * @param + * @DATA + * @Author LiDaPeng + * @Description深度映射 + */ +public class DeepMappingBody { + private DimensionMappingStudy dimensionAll; + private TempleConfig templeConfig; + private Map mappingMap = new HashMap<>(); + + public DeepMappingBody(TempleConfig templeConfig) throws Exception { + this.templeConfig = templeConfig; + dimensionAll = new DimensionMappingStudy(templeConfig); + dimensionAll.start(); + } +} diff --git a/src/main/java/org/wlld/imageRecognition/segmentation/DimensionMappingStudy.java b/src/main/java/org/wlld/imageRecognition/segmentation/DimensionMappingStudy.java index 2c2a98f..637a70a 100644 --- a/src/main/java/org/wlld/imageRecognition/segmentation/DimensionMappingStudy.java +++ b/src/main/java/org/wlld/imageRecognition/segmentation/DimensionMappingStudy.java @@ -1,7 +1,6 @@ package org.wlld.imageRecognition.segmentation; import org.wlld.MatrixTools.Matrix; -import org.wlld.MatrixTools.MatrixOperation; import org.wlld.imageRecognition.TempleConfig; import org.wlld.imageRecognition.border.Knn; import org.wlld.pso.PSO; @@ -16,11 +15,33 @@ import java.util.*; * @Description 维度映射 */ public class DimensionMappingStudy { - private Knn knn = new Knn(1);//一个knn分类器,决定进这一层哪个类别 - private int id;//类别id - private Map deepMappingMap = new HashMap<>(); + private TempleConfig templeConfig; + private Knn myKnn = new Knn(1); private double[] mappingSigma;//映射层 + public DimensionMappingStudy(TempleConfig templeConfig) throws Exception { + this.templeConfig = templeConfig; + //深度克隆 + myKnn.setFeatureMap(cloneFeature(templeConfig.getKnn().getFeatureMap())); + } + + public Knn getMyKnn() { + return myKnn; + } + + private Map> cloneFeature(Map> feature) throws Exception { + Map> realFeatures = new HashMap<>(); + for (Map.Entry> entry : feature.entrySet()) { + List matrixList = new ArrayList<>(); + List matrixAll = entry.getValue(); + for (Matrix matrix : matrixAll) { + matrixList.add(matrix.getRow(0)); + } + realFeatures.put(entry.getKey(), matrixList); + } + return realFeatures; + } + private double getDist(Matrix data1, Matrix data2) throws Exception { int size = data1.getY(); double sigma = 0; @@ -80,84 +101,124 @@ public class DimensionMappingStudy { return minSub; } - private void nextDeep(TempleConfig templeConfig) throws Exception {//对模型数据进行自检测 - Map> featureMap = knn.getFeatureMap(); - int nub = featureMap.size() / 2; - if (nub > 1) { - MinTypeSort minTypeSort = new MinTypeSort(); - Map> minMap = new HashMap<>();//保存与该类别最相似的类别,及距离值 - for (Map.Entry> entry : featureMap.entrySet()) { - int key = entry.getKey(); - List minTypes = new ArrayList<>(); - List myFeatures = entry.getValue(); - for (Map.Entry> entry2 : featureMap.entrySet()) { - int testKey = entry2.getKey(); - if (testKey != key) {//找出最小距离 - List features = entry2.getValue(); - MinType minType = new MinType(); - double minDist = getSub(myFeatures, features); - minType.minDist = minDist; - minType.type = testKey; - minTypes.add(minType); - } + public void selfTest(int nub) throws Exception {//对模型数据进行自检测 + Map> myFeatureMap = myKnn.getFeatureMap();//未映射的克隆的 + Map> featureMap = templeConfig.getKnn().getFeatureMap(); + MinTypeSort minTypeSort = new MinTypeSort(); + Map> minMap = new HashMap<>();//保存与该类别最相似的类别,及距离值 + for (Map.Entry> entry : featureMap.entrySet()) { + int key = entry.getKey(); + List minTypes = new ArrayList<>(); + List myFeatures = entry.getValue(); + for (Map.Entry> entry2 : featureMap.entrySet()) { + int testKey = entry2.getKey(); + if (testKey != key) {//找出最小距离 + List features = entry2.getValue(); + MinType minType = new MinType(); + double minDist = getSub(myFeatures, features); + minType.minDist = minDist; + minType.type = testKey; + minTypes.add(minType); } - Collections.sort(minTypes, minTypeSort); - int len = 0; - for (int i = 0; i < minTypes.size(); i++) { - if (minTypes.get(i).minDist < 0) { - len++; - } else { + } + Collections.sort(minTypes, minTypeSort); + minTypes = minTypes.subList(0, nub); + minMap.put(key, minTypes); + } + List cups = new ArrayList<>(); + for (Map.Entry> entry : minMap.entrySet()) { + System.out.println("类别===============================" + entry.getKey()); + int[] cup = new int[nub + 1]; + cup[0] = entry.getKey(); + List minTypeList = entry.getValue(); + for (int i = 0; i < minTypeList.size(); i++) { + cup[i + 1] = minTypeList.get(i).type; + } + cups.add(cup); + } + List> setList = getTypeSet(cups); + for (Set set : setList) { + DimensionMappingStudy dimensionMappingStudy = new DimensionMappingStudy(templeConfig); + for (int type : set) { + List features = myFeatureMap.get(type); + + } + } + } + + public List> getTypeSet(List t) { + //最终输入结果 + List> t1 = new ArrayList<>(); + //储存临时值 + Set s = new HashSet<>(); + //用来校验重复游标组 + List> k = new ArrayList<>(); + Boolean x = true;//对循环进行判断 + int num = 0;//循环游标初始值 + while (x) { + //校验重复游标 + List l = new ArrayList<>(); + //清楚临时存储值 + s.clear(); + //单个最终值 + Set s1 = new HashSet<>(); + for (int i = num; i < t.size(); i++) { + Boolean check = false; + //如果存在已经验证的数组,则跳过 + for (int j = num; j < k.size(); j++) { + if (k.get(j).contains(i)) { + check = true; break; } } - if (len < nub) { - minTypes = minTypes.subList(0, nub); - } else { - minTypes = minTypes.subList(0, len); - } - minMap.put(key, minTypes); - } - for (Map.Entry> entry : minMap.entrySet()) { - if (nub == 2 || nub == 3) { - System.out.println("类别===============================" + entry.getKey()); + if (check) { + continue; } - List minTypeList = entry.getValue(); - DimensionMappingStudy dimensionMappingStudy = new DimensionMappingStudy(); - Knn myKnn = dimensionMappingStudy.getKnn(); - for (MinType minType : minTypeList) { - if (nub == 2 || nub == 3) { - System.out.println("type==" + minType.type + ",dist==" + minType.minDist); - } - List featureList = featureMap.get(minType.type); - for (Matrix matrix : featureList) { - myKnn.insertMatrix(matrix, minType.type); + + //循环判断数组是否存在重复(当i=num时,给初始的s赋值) + //当S中包含重复值的时候,插入 + for (int info : t.get(i)) { + if (i == num) { + for (int info1 : t.get(i)) { + l.add(i); + k.add(l); + s.add(info1); + } + } else if (s.contains(info)) { + for (int info1 : t.get(i)) { + l.add(i); + k.add(l); + s.add(info1); + } + break; } } - deepMappingMap.put(entry.getKey(), dimensionMappingStudy); + } - for (Map.Entry entry : deepMappingMap.entrySet()) { - entry.getValue().start(templeConfig); + //如果临时s不为空,给s1赋值,并存入到最后输出的t1中 + if (!s.isEmpty()) { + for (Integer info : s) { + s1.add(info); + } + t1.add(s1); + } + num++; + //跳出循环 + if (num >= t.size()) { + x = false; } } + return t1; } - public int toClassification(Matrix feature) throws Exception {//进行识别 先映射 - feature = mapping(feature, mappingSigma); - int type = knn.getType(feature); - if (deepMappingMap.size() > 0 && deepMappingMap.containsKey(type)) {//继续下一层 - return deepMappingMap.get(type).toClassification(feature); - } else {//返回最后结果 - return type; - } - } - public void start(TempleConfig templeConfig) throws Exception { - Map> featureMap = knn.getFeatureMap(); + public void mappingStart() throws Exception { + Map> featureMap = templeConfig.getKnn().getFeatureMap(); FeatureMapping featureMapping = new FeatureMapping(featureMap); int dimensionNub = templeConfig.getFeatureNub() * 3 * 2;//PSO维度 //创建粒子群 PSO pso = new PSO(dimensionNub, null, null, 500, 100, - featureMapping, 0.8, 2, 2, true, 0.2, 0.01); + featureMapping, 0.9, 2, 2, true, 0.2, 0.01); List mappings = pso.start(); int size = mappings.size(); mappingSigma = new double[dimensionNub]; @@ -170,10 +231,14 @@ public class DimensionMappingStudy { for (int i = 0; i < mappingSigma.length; i++) { mappingSigma[i] = mappingSigma[i] / size; } + templeConfig.getFood().setMappingParameter(mappingSigma); //还要把所有已存在的knn特征完成映射 featureMapping(featureMap, mappingSigma, templeConfig); - //进行下一次映射选择 - nextDeep(templeConfig); + } + + public void start() throws Exception { + mappingStart(); + selfTest(3); } private void featureMapping(Map> featureMap, double[] mapping @@ -200,8 +265,4 @@ public class DimensionMappingStudy { } return matrix; } - - public Knn getKnn() { - return knn; - } } diff --git a/src/main/java/org/wlld/imageRecognition/segmentation/FeatureMapping.java b/src/main/java/org/wlld/imageRecognition/segmentation/FeatureMapping.java index fce16c6..b7189d9 100644 --- a/src/main/java/org/wlld/imageRecognition/segmentation/FeatureMapping.java +++ b/src/main/java/org/wlld/imageRecognition/segmentation/FeatureMapping.java @@ -123,10 +123,10 @@ public class FeatureMapping extends Frequency implements PsoFunction { featureDifferent.addAll(entry2.getValue()); } } - double sameMax = compareSame(myFeature);//同类最大值 - double differentMin = compareDifferent(myFeature, featureDifferent);//异类最小值 - double sub = differentMin - sameMax; - //double sub = getSub(myFeature, featureDifferent); +// double sameMax = compareSame(myFeature);//同类最大值 +// double differentMin = compareDifferent(myFeature, featureDifferent);//异类最小值 +// double sub = differentMin - sameMax; + double sub = getSub(myFeature, featureDifferent); sigma = sigma + sub; } return sigma; diff --git a/src/main/java/org/wlld/param/Food.java b/src/main/java/org/wlld/param/Food.java index ae2dda0..7c2adf6 100644 --- a/src/main/java/org/wlld/param/Food.java +++ b/src/main/java/org/wlld/param/Food.java @@ -1,6 +1,5 @@ package org.wlld.param; -import org.wlld.imageRecognition.segmentation.DimensionMappingStudy; import org.wlld.imageRecognition.segmentation.KNerveManger; import org.wlld.imageRecognition.segmentation.RgbRegression; @@ -25,10 +24,14 @@ public class Food { private int step = 1;//特征取样步长 private int speciesNub = 24;//种类数 private KNerveManger kNerveManger; - private DimensionMappingStudy dimensionMappingStudy = new DimensionMappingStudy(); + private double[] mappingParameter;//特征映射 - public DimensionMappingStudy getDimensionMappingStudy() { - return dimensionMappingStudy; + public double[] getMappingParameter() { + return mappingParameter; + } + + public void setMappingParameter(double[] mappingParameter) { + this.mappingParameter = mappingParameter; } public KNerveManger getkNerveManger() { diff --git a/src/test/java/coverTest/FoodTest.java b/src/test/java/coverTest/FoodTest.java index 70d3837..285963c 100644 --- a/src/test/java/coverTest/FoodTest.java +++ b/src/test/java/coverTest/FoodTest.java @@ -14,14 +14,96 @@ import org.wlld.param.Cutting; import org.wlld.param.Food; import org.wlld.tools.ArithUtil; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.util.*; public class FoodTest { public static void main(String[] args) throws Exception { - test(); + //test(); + int[] a = new int[]{1, 4, 5, 7, 31}; + int[] b = new int[]{4, 6, 7, 8, 21,}; + int[] c = new int[]{12, 42, 54, 9}; + int[] d = new int[]{63, 54, 99}; + int[] e = new int[]{991, 123, 456}; + + List t = new ArrayList<>(); + t.add(a); + t.add(b); + t.add(c); + t.add(d); + t.add(e); + ab(t); + } + + public static void ab(List t) { + + //最终输入结果 + List> t1 = new ArrayList<>(); + + //储存临时值 + Set s = new HashSet<>(); + //用来校验重复游标组 + List> k = new ArrayList<>(); + Boolean x = true;//对循环进行判断 + int num = 0;//循环游标初始值 + + while (x) { + //校验重复游标 + List l = new ArrayList<>(); + //清楚临时存储值 + s.clear(); + //单个最终值 + Set s1 = new HashSet<>(); + + for (int i = num; i < t.size(); i++) { + Boolean check = false; + //如果存在已经验证的数组,则跳过 + for (int j = num; j < k.size(); j++) { + if (k.get(j).contains(i)) { + check = true; + break; + + } + } + if (check) { + continue; + } + + //循环判断数组是否存在重复(当i=num时,给初始的s赋值) + //当S中包含重复值的时候,插入 + for (int info : t.get(i)) { + if (i == num) { + for (int info1 : t.get(i)) { + l.add(i); + k.add(l); + s.add(info1); + } + } else if (s.contains(info)) { + for (int info1 : t.get(i)) { + l.add(i); + k.add(l); + s.add(info1); + } + break; + } + } + + } + //如果临时s不为空,给s1赋值,并存入到最后输出的t1中 + if (!s.isEmpty()) { + for (Integer info : s) { + s1.add(info); + } + t1.add(s1); + } + num++; + //跳出循环 + if (num >= t.size()) { + x = false; + } + } + + System.out.println(t1); } public static void test2(TempleConfig templeConfig) throws Exception { @@ -153,8 +235,9 @@ public class FoodTest { operation.colorStudy(threeChannelMatrix23, 23, specificationsList, name); operation.colorStudy(threeChannelMatrix24, 24, specificationsList, name); } - DimensionMappingStudy dimensionMappingStudy = templeConfig.getFood().getDimensionMappingStudy(); - dimensionMappingStudy.start(templeConfig);//完成映射 + DimensionMappingStudy dimensionMappingStudy = new DimensionMappingStudy(templeConfig); + dimensionMappingStudy.start();//完成映射 + //dimensionMappingStudy.selfTest(6);//检查 //System.out.println("========================"); // kNerveManger.startStudy(); int i = 4;