精准模式算法调整,在卷积层结束后没有接全连接层,直接进行了聚类来进行提速,并同时修改了POSITION

pull/1/head
lidapeng 5 years ago
parent 139acaf74b
commit f14a376ff8

@ -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()) {

@ -84,7 +84,6 @@ public class Operation {//进行计算
if (templeConfig.isHavePosition() && tagging > 0) {
border.end(myMatrix, tagging);
}
//System.out.println(myMatrix.getString());
//进行聚类
Map<Integer, KMatrix> 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<Double> 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<Integer, KMatrix> kMatrixMap = templeConfig.getkMatrixMap();
for (Map.Entry<Integer, KMatrix> 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<Integer, KMatrix> kMatrixMap = templeConfig.getkMatrixMap();
for (Map.Entry<Integer, KMatrix> 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<Double> sub(Matrix matrix) throws Exception {//
List<Double> list = new ArrayList<>();
int x = matrix.getX() - 1;
@ -318,17 +318,6 @@ public class Operation {//进行计算
return list;
}
private List<Double> getFeatureList(Matrix matrix) throws Exception {//
List<Double> 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<Double> featureList, List<SensoryNerve> sensoryNerveList
, boolean isStudy, Map<Integer, Double> map, OutBack imageBack) throws Exception {
for (int i = 0; i < sensoryNerveList.size(); i++) {

@ -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<Double> getFeatureList(Matrix matrix) throws Exception {//
List<Double> 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<Double> 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<Integer, List<Double>> matrixMap = new HashMap<>();
for (Map.Entry<Integer, KMatrix> entry : kMatrixMap.entrySet()) {
List<Double> 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<Integer, KMatrix> kMatrixs = modelParameter.getkMatrixMap();
Map<Integer, List<Double>> kMatrixs = modelParameter.getkMatrixList();
if (kMatrixs != null && kMatrixs.size() == kMatrixMap.size()) {
kMatrixMap = modelParameter.getkMatrixMap();
for (Map.Entry<Integer, KMatrix> 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);

@ -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;
}

@ -22,19 +22,19 @@ public class ModelParameter {
private List<DymNerveStudy> dymNerveStudies = new ArrayList<>();//动态神经元隐层
private DymNerveStudy dymOutNerveStudy = new DymNerveStudy();//动态神经元输出层
private Map<Integer, BorderBody> borderBodyMap = new HashMap<>();//border特征集合
private Map<Integer, KMatrix> kMatrixMap = new HashMap<>();//K均值矩阵集合
private Map<Integer, List<Double>> kMatrixList = new HashMap<>();//K均值矩阵集合
private Frame frame;//先验边框
public Map<Integer, BorderBody> getBorderBodyMap() {
return borderBodyMap;
public Map<Integer, List<Double>> getkMatrixList() {
return kMatrixList;
}
public Map<Integer, KMatrix> getkMatrixMap() {
return kMatrixMap;
public void setkMatrixList(Map<Integer, List<Double>> kMatrixList) {
this.kMatrixList = kMatrixList;
}
public void setkMatrixMap(Map<Integer, KMatrix> kMatrixMap) {
this.kMatrixMap = kMatrixMap;
public Map<Integer, BorderBody> getBorderBodyMap() {
return borderBodyMap;
}
public void setBorderBodyMap(Map<Integer, BorderBody> borderBodyMap) {

@ -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 {

Loading…
Cancel
Save