更新说明文档,对模式区别和算法修改的部分进行了一定的说明

pull/1/head
lidapeng 5 years ago
parent f14a376ff8
commit 02e93543f3

@ -6,8 +6,8 @@
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="ImageMarket" />
<module name="myBrain" />
<module name="ImageMarket" />
</profile>
</annotationProcessing>
</component>

@ -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<Integer, Double> rightTagging = new HashMap<>();//分类标注
Map<Integer, Double> 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而是直接给一个整型的数字01,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一次。
因为学习是单线程无所谓,而检测是多线程,如果使用一个运算类,可能会造成线程安全问题
因为学习是单线程无所谓,而检测是多线程,如果使用一个运算类,可能会造成线程安全问题
#### 精准模式和速度模式的优劣
* 速度模式学习很快但是检测速度慢双核i3检测单张图片1200万像素单物体检测速度约800ms.
学习1200万像素的照片物体1000张需耗时1-2小时。
* 精准模式学习很慢但是检测速度快双核i3检测单张图片1200万像素单物体检测速度约100ms.
学习1200万像素的照片物体1000张需耗时5-7个小时。
#### 本包为性能优化而对AI算法的修改
* 本包对图像AI算法进行了修改为应对CPU部署。
* 卷积神经网络后的全连接层直接替换成了K均值算法进行聚类通过卷积结果与K均值矩阵欧式距离来进行判定。
* 物体的边框检测通过卷积后的特征向量进行多元线性回归获得检测边框的候选区并没有使用图像分割cpu对图像分割算法真是超慢
而是通过Frame类让用户自定义先验图框大小和先验图框每次移动的检测步长然后再通过多次检测的IOU来确定是否为同一物体。
* 所以添加定位模式用户要确定Frame的大小和步长来替代基于图像分割的候选区推荐算法。
* 速度模式是使用固定的边缘算子进行多次卷积核然后使用BP的多层神经网络进行强行拟合给出的结果它之所以学习快就是因为速度模式学习的是
全连接层的权重及阈值,而没有对卷积核进行学习)

@ -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<Integer, Double> rightTagging = new HashMap<>();//分类标注
Map<Integer, Double> 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地址图片,并转化成矩阵

Loading…
Cancel
Save