From 02e93543f350d76ea9cfa973725d6cae81dcac5b Mon Sep 17 00:00:00 2001 From: lidapeng Date: Sun, 2 Feb 2020 10:09:15 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=AF=B4=E6=98=8E=E6=96=87?= =?UTF-8?q?=E6=A1=A3=EF=BC=8C=E5=AF=B9=E6=A8=A1=E5=BC=8F=E5=8C=BA=E5=88=AB?= =?UTF-8?q?=E5=92=8C=E7=AE=97=E6=B3=95=E4=BF=AE=E6=94=B9=E7=9A=84=E9=83=A8?= =?UTF-8?q?=E5=88=86=E8=BF=9B=E8=A1=8C=E4=BA=86=E4=B8=80=E5=AE=9A=E7=9A=84?= =?UTF-8?q?=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/compiler.xml | 2 +- README.md | 41 ++++++++++++++++---------- src/test/java/org/wlld/HelloWorld.java | 5 ---- 3 files changed, 27 insertions(+), 21 deletions(-) diff --git a/.idea/compiler.xml b/.idea/compiler.xml index d280c68..6aa88ff 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -6,8 +6,8 @@ - + diff --git a/README.md b/README.md index fbba7c0..a3c26b9 100644 --- a/README.md +++ b/README.md @@ -140,22 +140,18 @@ Picture picture = new Picture(); TempleConfig templeConfig = getTemple(true, StudyPattern.Accuracy_Pattern); Operation operation = new Operation(templeConfig); - //标注主键为 第几种分类,值为标注 1 是TRUE 0是FALSE - Map rightTagging = new HashMap<>();//分类标注 - Map wrongTagging = new HashMap<>();//分类标注 - rightTagging.put(1, 1.0); - wrongTagging.put(1, 0.0); for (int i = 1; i < 2; i++) { System.out.println("开始学习1==" + 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 模式 要学习两次 - //这里使用learning方法,前两个参数与SPEED模式相同,多了一个第三个参数 - //第一次学习的时候 这个参数必须是 false - //最后一个参数id - operation.learning(right, rightTagging, false); - operation.learning(wrong, wrongTagging, false); + //这里使用learning方法,第一个参数没变,第二个参数是标注参数,learning的标注 + //不再使用MAP而是直接给一个整型的数字,0,1,2,3...作为它的分类id,注意我们约定 + //id 为0的分类为全FALSE分类,即背景 + //第三个参数,第一次学习的时候 这个参数必须是 false + operation.learning(right, 1, false); + operation.learning(wrong, 0, false); } for (int i = 1; i < 2; i++) {//神经网络学习 System.out.println("开始学习2==" + i); @@ -169,10 +165,12 @@ } Matrix right = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/test/a101.png"); Matrix wrong = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/b/b1000.png"); - //进行图像识别,Accuracy_Pattern 模式学习结果获取和注入,跟SPEED模式一致 - //若有疑问可以参考一下 testModel()方法 - operation.look(right, 2); - operation.look(wrong, 3); + //精准模式检测单张图片将直接返回分类id,而不是通过回调来获取分类概率 + //不是使用look,而是使用toSee + int rightId = operation.toSee(right); + int wrongId = operation.toSee(wrong); + System.out.println("该图是菜单:" + rightId); + System.out.println("该图是桌子:" + wrongId); } 回调输出类: public class Ma implements OutBack { @@ -196,4 +194,17 @@ * TempleConfig():配置模版类,一定要静态在内存中长期持有,检测的时候不要每次都NEW, 一直就使用一个配置类就可以了。 * Operation():运算类,除了学习可以使用一个以外,用户每检测一次都要NEW一次。 -因为学习是单线程无所谓,而检测是多线程,如果使用一个运算类,可能会造成线程安全问题 \ No newline at end of file +因为学习是单线程无所谓,而检测是多线程,如果使用一个运算类,可能会造成线程安全问题 +#### 精准模式和速度模式的优劣 +* 速度模式学习很快,但是检测速度慢,双核i3检测单张图片(1200万像素)单物体检测速度约800ms. +学习1200万像素的照片物体,1000张需耗时1-2小时。 +* 精准模式学习很慢,但是检测速度快,双核i3检测单张图片(1200万像素)单物体检测速度约100ms. +学习1200万像素的照片物体,1000张需耗时5-7个小时。 +#### 本包为性能优化而对AI算法的修改 +* 本包对图像AI算法进行了修改,为应对CPU部署。 +* 卷积神经网络后的全连接层直接替换成了K均值算法进行聚类,通过卷积结果与K均值矩阵欧式距离来进行判定。 +* 物体的边框检测通过卷积后的特征向量进行多元线性回归获得,检测边框的候选区并没有使用图像分割(cpu对图像分割算法真是超慢), +而是通过Frame类让用户自定义先验图框大小和先验图框每次移动的检测步长,然后再通过多次检测的IOU来确定是否为同一物体。 +* 所以添加定位模式,用户要确定Frame的大小和步长,来替代基于图像分割的候选区推荐算法。 +* 速度模式是使用固定的边缘算子进行多次卷积核,然后使用BP的多层神经网络进行强行拟合给出的结果(它之所以学习快,就是因为速度模式学习的是 +全连接层的权重及阈值,而没有对卷积核进行学习) diff --git a/src/test/java/org/wlld/HelloWorld.java b/src/test/java/org/wlld/HelloWorld.java index 4fd46a6..c1f344c 100644 --- a/src/test/java/org/wlld/HelloWorld.java +++ b/src/test/java/org/wlld/HelloWorld.java @@ -206,11 +206,6 @@ public class HelloWorld { TempleConfig templeConfig = getTemple(true, StudyPattern.Accuracy_Pattern, false); Ma ma = new Ma(); Operation operation = new Operation(templeConfig, ma); - //标注主键为 第几种分类,值为标注 1 是TRUE 0是FALSE - Map rightTagging = new HashMap<>();//分类标注 - Map wrongTagging = new HashMap<>();//分类标注 - rightTagging.put(1, 1.0); - wrongTagging.put(1, 0.0); for (int i = 1; i < 100; i++) { System.out.println("开始学习1==" + i); //读取本地URL地址图片,并转化成矩阵