From f14a376ff8ccef446ee4a51c76b3a29799539727 Mon Sep 17 00:00:00 2001 From: lidapeng Date: Sat, 1 Feb 2020 18:52:40 +0800 Subject: [PATCH] =?UTF-8?q?=E7=B2=BE=E5=87=86=E6=A8=A1=E5=BC=8F=E7=AE=97?= =?UTF-8?q?=E6=B3=95=E8=B0=83=E6=95=B4=EF=BC=8C=E5=9C=A8=E5=8D=B7=E7=A7=AF?= =?UTF-8?q?=E5=B1=82=E7=BB=93=E6=9D=9F=E5=90=8E=E6=B2=A1=E6=9C=89=E6=8E=A5?= =?UTF-8?q?=E5=85=A8=E8=BF=9E=E6=8E=A5=E5=B1=82=EF=BC=8C=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E4=BA=86=E8=81=9A=E7=B1=BB=E6=9D=A5=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E6=8F=90=E9=80=9F=EF=BC=8C=E5=B9=B6=E5=90=8C=E6=97=B6?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86POSITION?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/wlld/imageRecognition/KMatrix.java | 12 +++++ .../org/wlld/imageRecognition/Operation.java | 49 +++++++------------ .../wlld/imageRecognition/TempleConfig.java | 40 +++++++++++++-- .../imageRecognition/border/FrameBody.java | 7 +++ .../org/wlld/nerveEntity/ModelParameter.java | 14 +++--- src/test/java/org/wlld/HelloWorld.java | 38 +++++++------- 6 files changed, 100 insertions(+), 60 deletions(-) diff --git a/src/main/java/org/wlld/imageRecognition/KMatrix.java b/src/main/java/org/wlld/imageRecognition/KMatrix.java index 3958f85..6a2ff48 100644 --- a/src/main/java/org/wlld/imageRecognition/KMatrix.java +++ b/src/main/java/org/wlld/imageRecognition/KMatrix.java @@ -18,6 +18,18 @@ public class KMatrix { sigmaMatrix = new Matrix(x, y); } + public boolean isFinish() { + return isFinish; + } + + public void setFinish(boolean finish) { + isFinish = finish; + } + + public Matrix getSigmaMatrix() { + return sigmaMatrix; + } + public double getEDist(Matrix matrix) throws Exception {//返回欧式距离 if (isFinish && matrix.getX() == sigmaMatrix.getX() && matrix.getY() == sigmaMatrix.getY()) { diff --git a/src/main/java/org/wlld/imageRecognition/Operation.java b/src/main/java/org/wlld/imageRecognition/Operation.java index aaac164..4159e95 100644 --- a/src/main/java/org/wlld/imageRecognition/Operation.java +++ b/src/main/java/org/wlld/imageRecognition/Operation.java @@ -84,7 +84,6 @@ public class Operation {//进行计算 if (templeConfig.isHavePosition() && tagging > 0) { border.end(myMatrix, tagging); } - //System.out.println(myMatrix.getString()); //进行聚类 Map kMatrixMap = templeConfig.getkMatrixMap(); if (kMatrixMap.containsKey(tagging)) { @@ -93,7 +92,6 @@ public class Operation {//进行计算 } else { throw new Exception("not find tag"); } - //intoNerve(1, featureList, templeConfig.getSensoryNerves(), true, tagging, outBack); } } else { throw new Exception("pattern is wrong"); @@ -142,10 +140,8 @@ public class Operation {//进行计算 Matrix myMatrix = matrixBack.getMatrix(); //卷积层输出即边框回归的输入的特征向量 frameBody.setEndMatrix(myMatrix); - List list = sub(myMatrix); - imageBack.setFrameBody(frameBody); - //进入神经网络判断 - intoNerve(eventId, list, templeConfig.getSensoryNerves(), false, null, imageBack); + int id = getClassificationId(myMatrix); + frameBody.setId(id); } return toPosition(frameBodies, frame.getWidth(), frame.getHeight()); } else { @@ -284,24 +280,28 @@ public class Operation {//进行计算 intoNerve2(2, matrix, templeConfig.getConvolutionNerveManager().getSensoryNerves(), false, -1, matrixBack); Matrix myMatrix = matrixBack.getMatrix(); - int id = 0; - double distEnd = 0; - Map kMatrixMap = templeConfig.getkMatrixMap(); - for (Map.Entry entry : kMatrixMap.entrySet()) { - int key = entry.getKey(); - KMatrix kMatrix = entry.getValue(); - double dist = kMatrix.getEDist(myMatrix); - if (distEnd == 0 || dist < distEnd) { - id = key; - distEnd = dist; - } - } - return id; + return getClassificationId(myMatrix); } else { throw new Exception("pattern is wrong"); } } + private int getClassificationId(Matrix myMatrix) throws Exception { + int id = 0; + double distEnd = 0; + Map kMatrixMap = templeConfig.getkMatrixMap(); + for (Map.Entry entry : kMatrixMap.entrySet()) { + int key = entry.getKey(); + KMatrix kMatrix = entry.getValue(); + double dist = kMatrix.getEDist(myMatrix); + if (distEnd == 0 || dist < distEnd) { + id = key; + distEnd = dist; + } + } + return id; + } + private List sub(Matrix matrix) throws Exception {// List list = new ArrayList<>(); int x = matrix.getX() - 1; @@ -318,17 +318,6 @@ public class Operation {//进行计算 return list; } - private List getFeatureList(Matrix matrix) throws Exception {// - List list = new ArrayList<>(); - for (int i = 0; i < matrix.getX(); i++) { - for (int j = 0; j < matrix.getY(); j++) { - double nub = matrix.getNumber(i, j); - list.add(nub); - } - } - return list; - } - private void intoNerve(long eventId, List featureList, List sensoryNerveList , boolean isStudy, Map map, OutBack imageBack) throws Exception { for (int i = 0; i < sensoryNerveList.size(); i++) { diff --git a/src/main/java/org/wlld/imageRecognition/TempleConfig.java b/src/main/java/org/wlld/imageRecognition/TempleConfig.java index 8edeb56..e6213e4 100644 --- a/src/main/java/org/wlld/imageRecognition/TempleConfig.java +++ b/src/main/java/org/wlld/imageRecognition/TempleConfig.java @@ -12,6 +12,7 @@ import org.wlld.nerveEntity.ModelParameter; import org.wlld.nerveEntity.SensoryNerve; import org.wlld.tools.ArithUtil; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -188,19 +189,44 @@ public class TempleConfig { } convolutionNerveManager = new NerveManager(1, 1, 1, deep - 1, new ReLu(), true); - //initNerveManager(initPower, width * height, 2); - convolutionNerveManager.setMatrixMap(matrixMap);//给卷积网络管理器注入期望矩阵 convolutionNerveManager.init(initPower, true); } + private List getFeatureList(Matrix matrix) throws Exception {// + List list = new ArrayList<>(); + for (int i = 0; i < matrix.getX(); i++) { + for (int j = 0; j < matrix.getY(); j++) { + double nub = matrix.getNumber(i, j); + list.add(nub); + } + } + return list; + } + + private void insertKMatrix(Matrix matrix, List list) throws Exception { + int x = matrix.getX(); + int y = matrix.getY(); + for (int i = 0; i < x; i++) { + for (int j = 0; j < y; j++) { + int nub = i * y + j; + matrix.setNub(i, j, list.get(nub)); + } + } + } + public ModelParameter getModel() throws Exception {//获取模型参数 ModelParameter modelParameter = new ModelParameter(); if (studyPattern == StudyPattern.Accuracy_Pattern) { ModelParameter modelParameter1 = convolutionNerveManager.getModelParameter(); modelParameter.setDymNerveStudies(modelParameter1.getDymNerveStudies()); modelParameter.setDymOutNerveStudy(modelParameter1.getDymOutNerveStudy()); - //modelParameter.setkMatrixMap(kMatrixMap); + Map> matrixMap = new HashMap<>(); + for (Map.Entry entry : kMatrixMap.entrySet()) { + List list = getFeatureList(entry.getValue().getSigmaMatrix()); + matrixMap.put(entry.getKey(), list); + } + modelParameter.setkMatrixList(matrixMap); } else if (studyPattern == StudyPattern.Speed_Pattern) { ModelParameter modelParameter1 = nerveManager.getModelParameter(); modelParameter.setDepthNerves(modelParameter1.getDepthNerves()); @@ -247,9 +273,13 @@ public class TempleConfig { public void insertModel(ModelParameter modelParameter) throws Exception { if (studyPattern == StudyPattern.Accuracy_Pattern) { convolutionNerveManager.insertModelParameter(modelParameter); - Map kMatrixs = modelParameter.getkMatrixMap(); + Map> kMatrixs = modelParameter.getkMatrixList(); if (kMatrixs != null && kMatrixs.size() == kMatrixMap.size()) { - kMatrixMap = modelParameter.getkMatrixMap(); + for (Map.Entry entry : kMatrixMap.entrySet()) { + KMatrix kMatrix = entry.getValue(); + insertKMatrix(kMatrix.getSigmaMatrix(), kMatrixs.get(entry.getKey())); + kMatrix.setFinish(true); + } } } else if (studyPattern == StudyPattern.Speed_Pattern) { nerveManager.insertModelParameter(modelParameter); diff --git a/src/main/java/org/wlld/imageRecognition/border/FrameBody.java b/src/main/java/org/wlld/imageRecognition/border/FrameBody.java index 63af0ab..9aa2b3d 100644 --- a/src/main/java/org/wlld/imageRecognition/border/FrameBody.java +++ b/src/main/java/org/wlld/imageRecognition/border/FrameBody.java @@ -59,6 +59,13 @@ public class FrameBody { return id; } + public void setId(int id) { + if (id > 0) { + this.id = id; + point = 1; + } + } + public double getPoint() { return point; } diff --git a/src/main/java/org/wlld/nerveEntity/ModelParameter.java b/src/main/java/org/wlld/nerveEntity/ModelParameter.java index 10e9903..cf3eea8 100644 --- a/src/main/java/org/wlld/nerveEntity/ModelParameter.java +++ b/src/main/java/org/wlld/nerveEntity/ModelParameter.java @@ -22,19 +22,19 @@ public class ModelParameter { private List dymNerveStudies = new ArrayList<>();//动态神经元隐层 private DymNerveStudy dymOutNerveStudy = new DymNerveStudy();//动态神经元输出层 private Map borderBodyMap = new HashMap<>();//border特征集合 - private Map kMatrixMap = new HashMap<>();//K均值矩阵集合 + private Map> kMatrixList = new HashMap<>();//K均值矩阵集合 private Frame frame;//先验边框 - public Map getBorderBodyMap() { - return borderBodyMap; + public Map> getkMatrixList() { + return kMatrixList; } - public Map getkMatrixMap() { - return kMatrixMap; + public void setkMatrixList(Map> kMatrixList) { + this.kMatrixList = kMatrixList; } - public void setkMatrixMap(Map kMatrixMap) { - this.kMatrixMap = kMatrixMap; + public Map getBorderBodyMap() { + return borderBodyMap; } public void setBorderBodyMap(Map borderBodyMap) { diff --git a/src/test/java/org/wlld/HelloWorld.java b/src/test/java/org/wlld/HelloWorld.java index df86e44..4fd46a6 100644 --- a/src/test/java/org/wlld/HelloWorld.java +++ b/src/test/java/org/wlld/HelloWorld.java @@ -28,33 +28,35 @@ public class HelloWorld { public static void test() throws Exception { Picture picture = new Picture(); TempleConfig templeConfig = new TempleConfig(); - ModelParameter modelParameter = JSONObject.parseObject(ModelData.DATA, ModelParameter.class); + ModelParameter modelParameter = JSONObject.parseObject(ModelData.DATA2, ModelParameter.class); templeConfig.init(StudyPattern.Accuracy_Pattern, true, 3204, 4032, 1); templeConfig.insertModel(modelParameter); Operation operation = new Operation(templeConfig); - for (int i = 1; i < 120; i++) {//神经网络学习 - System.out.println("study==" + i); - //读取本地URL地址图片,并转化成矩阵 - Matrix right = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/c/c" + i + ".png"); - Matrix wrong = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/b/b" + i + ".png"); - //将图像矩阵和标注加入进行学习,Accuracy_Pattern 模式 进行第二次学习 - //第二次学习的时候,第三个参数必须是 true - operation.learning(right, 1, true); - operation.learning(wrong, 0, true); - } - templeConfig.clustering();//进行聚类 - +// for (int i = 1; i < 10; i++) {//faster rcnn神经网络学习 +// System.out.println("study==" + i); +// //读取本地URL地址图片,并转化成矩阵 +// Matrix right = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/c/c" + i + ".png"); +// Matrix wrong = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/b/b" + i + ".png"); +// //将图像矩阵和标注加入进行学习,Accuracy_Pattern 模式 进行第二次学习 +// //第二次学习的时候,第三个参数必须是 true +// operation.learning(right, 1, true); +// operation.learning(wrong, 0, true); +// } + //templeConfig.clustering();//进行聚类 +// ModelParameter modelParameter1 = templeConfig.getModel(); +// String a = JSON.toJSONString(modelParameter1); +// System.out.println(a); + + //测试集图片,进行识别测试 for (int j = 121; j < 140; j++) { Matrix right = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/c/c" + j + ".png"); Matrix wrong = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/b/b" + j + ".png"); int rightId = operation.toSee(right); int wrongId = operation.toSee(wrong); - System.out.println("right==" + rightId); - System.out.println("wrong==" + wrongId); + System.out.println("该图是菜单:" + rightId); + System.out.println("该图是桌子:" + wrongId); } - ModelParameter modelParameter1 = templeConfig.getModel(); - String a = JSON.toJSONString(modelParameter1); - System.out.println(a); + } public static void testPic() throws Exception {