创建图像识别超市 增加API 说明文档

pull/1/head
lidapeng 5 years ago
parent ae8bdcce71
commit 2fb145beb0

@ -36,25 +36,30 @@ public class App {
//设置图像行列比例的列默认为3 选填 //设置图像行列比例的列默认为3 选填
templeConfig.setColumn(3); templeConfig.setColumn(3);
//对模版进行初始化 Ps:初始化一定要在所有参数设置完成后设置,否则设置无效。 //对模版进行初始化 Ps:初始化一定要在所有参数设置完成后设置,否则设置无效。
// 使用默认值(模型参数注入除外) // 使用默认值(模型参数注入除外)若无需注入参数 选择TRU若注入模型参数选择FALSE
//相似说明见 文档1
templeConfig.initNerveManager(true);//对模板初始化 templeConfig.initNerveManager(true);//对模板初始化
//初始化计算类 //初始化计算类
Operation operation = new Operation(templeConfig); Operation operation = new Operation(templeConfig);
//初始化模板标注 //标注主键为 第几种分类,值为标注 1 是TRUE 0是FALSE
Map<Integer, Double> rightTagging = new HashMap<>();//分类标注 Map<Integer, Double> rightTagging = new HashMap<>();//分类标注
Map<Integer, Double> wrongTagging = new HashMap<>();//分类标注 Map<Integer, Double> wrongTagging = new HashMap<>();//分类标注
rightTagging.put(1, 1.0); rightTagging.put(1, 1.0);
wrongTagging.put(1, 0.0); wrongTagging.put(1, 0.0);
for (int i = 1; i < 999; i++) { for (int i = 1; i < 999; i++) {
System.out.println("开始学习1==" + i); System.out.println("开始学习1==" + i);
//读取本地URL地址图片,并转化成矩阵
Matrix right = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/c/c" + i + ".png"); Matrix right = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/c/c" + i + ".png");
Matrix wrong = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/b/b" + i + ".png"); Matrix wrong = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/b/b" + i + ".png");
//将图像矩阵和标注加入进行学习,
operation.study(right, rightTagging); operation.study(right, rightTagging);
operation.study(wrong, wrongTagging); operation.study(wrong, wrongTagging);
} }
Matrix right = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/c/c1000.png"); Matrix right = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/c/c1000.png");
Matrix wrong = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/b/b1000.png"); Matrix wrong = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/b/b1000.png");
ma.setNub(1); ma.setNub(1);
//进行图像检测
operation.look(right, 2); operation.look(right, 2);
ma.setNub(2); ma.setNub(2);
operation.look(wrong, 3); operation.look(wrong, 3);

@ -0,0 +1,47 @@
本包对图像进行训练及识别的轻量级面向小白的框架,功能在逐渐扩展中
我们从HELLO WORLD 开始
//初始化图像转矩阵类
Picture picture = new Picture();
//初始化配置模板类
TempleConfig templeConfig = new TempleConfig();
//创建一个回调类 详细说明 看 文档说明1
Ma ma = new Ma();//创建一个回调类
//注册输出结果回调类 必写
//说明,当进行图像判断的时候
templeConfig.setOutBack(ma);
//全连接层深度,默认为2 选填 详细说明看文档 说明1
templeConfig.setDeep(2);
//要学习几种分类 默认为1 选填 详细说明看文档 说明1
templeConfig.setClassificationNub(1);
//设置图像行列比例的行默认为5 选填 详细说明看文档 说明1
templeConfig.setRow(5);
//设置图像行列比例的列默认为3 选填
templeConfig.setColumn(3);
//对模版进行初始化 Ps:初始化一定要在所有参数设置完成后设置,否则设置无效。
// 使用默认值(模型参数注入除外)
templeConfig.initNerveManager(true);//对模板初始化
//初始化计算类
Operation operation = new Operation(templeConfig);
//标注主键为 第几种分类,值为标注 1 是TRUE 0是FALSE 详细说明看文档 说明1
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 < 999; i++) {
System.out.println("开始学习1==" + i);
//读取本地URL地址图片,并转化成矩阵 详细说明见文档1
Matrix right = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/c/c" + i + ".png");
Matrix wrong = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/b/b" + i + ".png");
//将图像矩阵和标注加入进行学习,
operation.study(right, rightTagging);
operation.study(wrong, wrongTagging);
}
Matrix right = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/c/c1000.png");
Matrix wrong = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/b/b1000.png");
//给输出结果加一个说明注释,就是再回调类里面注入
ma.setNub(1);
//进行图像检测
operation.look(right, 2);
ma.setNub(2);
operation.look(wrong, 3);

@ -0,0 +1,54 @@
1public class Ma implements OutBack {
private int nub;
public void setNub(int nub) {
this.nub = nub;
}
@Override
public void getBack(double out, int id, long eventId) {
System.out.println("id==" + id + ",out==" + out + ",nub==" + nub);
}
}
回调类实现OUTBACK 接口 当检测结果输出的时候 会回调getBack方法
回调第一个参数是输出值 指的是 这个分类的概率 该数值是0-1之间的浮点
第二个参数是 分类的id 判断是训练的哪个分类的ID
第三个参数是 事件ID,一次判断事件 使用一个ID,让开发者知道是哪次事件的回调判断
2templeConfig.setDeep(2); 全连接层深度说明
这就像人类大脑的意识深度原理一样,深度学习越深,训练结果越准,但是训练量成几何倍数增加
比如默认深度是2 需要 正负模板各一千+张照片进行训练。识别率70%(只是举个例子,不是真实识别率)
当深度改成3则需要正负模板各三千+张照片进行训练,识别率 80%
深度4八千+90%
以此类推,,内存允许的情况下,深度无限 识别率无限接近与百分之百
但是有极限,即超过某个深度,即使再增加深度,识别率反而会下降。需要具体不断尝试找到 合适的深度
注意:若深度提升,训练量没有成倍增长,则准确度反而更低!
3, templeConfig.setClassificationNub(1);设置有几种分类
如果你只要识别一种分类 例如 一个苹果那么就写1
如果是 一个苹果 还有香蕉,两种分类 就写2
4,
//设置图像行列比例的行默认为5 选填
templeConfig.setRow(5);
//设置图像行列比例的列默认为3 选填
templeConfig.setColumn(3);
图片长宽比不写默认是row 5, column 3
这个默认值是按照现在手机竖直的图片的长宽比,目前都是这个数值,横过来的话就是 35
如果不是手机竖直尺寸的图像且并不确定比例建议写55
因为算法会对进行图像进行压缩后进入矩阵压缩有会有一个默认的矩阵大小最小压缩到5像素
所以设置这个最好要有一个值写5另外一个自定义如果不知道就写 55
5, Map<Integer, Double> rightTagging = new HashMap<>();//分类标注
rightTagging.put(1, 1.0);
rightTagging.put(2, 0.0);
给训练图像进行标注健是分类的ID,对应的就是输出结果的ID值值要么写0要么写1
1就是 是这种分类0就是不是这种分类
例如上面的标注了 该标注是 第一种分类 true,第二种分类FALSE
将图像转化成矩阵
注意目前版本该框架只识别当前图像的灰度图像对RGB图像进行了降维
对颜色失去一定的敏感度,所以主要针对物体形状,边缘,若对颜色敏感,请等待后续版本
Matrix right = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/c/c" + i + ".png");
拿到这个矩阵之后,进行下一步计算
6, templeConfig.initNerveManager(true);//对模板初始化
若第一次学习参数就是true,学习是很慢的,非常考验性能目前该包没有引入JCUDA(java 显卡GPU运算包)
所以目前使用的是cpu版本,对cpu来说检测单张图片的性能是可以满足的
学习就是学的模型参数,学完了要把模型参数拿出来,下次直接注入就可,
模型参数提取还没来得及封装,下一步封装,现在手动提取,有点麻烦
Loading…
Cancel
Save