From 2fb145beb069156ec5c9e7c8355c6e165da6ced1 Mon Sep 17 00:00:00 2001 From: lidapeng Date: Thu, 9 Jan 2020 21:53:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E5=9B=BE=E5=83=8F=E8=AF=86?= =?UTF-8?q?=E5=88=AB=E8=B6=85=E5=B8=82=20=E5=A2=9E=E5=8A=A0API=20=E8=AF=B4?= =?UTF-8?q?=E6=98=8E=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/wlld/App.java | 9 ++++-- 图像识别API文档.txt | 47 ++++++++++++++++++++++++++++ 说明1.txt | 54 +++++++++++++++++++++++++++++++++ 3 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 图像识别API文档.txt create mode 100644 说明1.txt diff --git a/src/main/java/org/wlld/App.java b/src/main/java/org/wlld/App.java index 64c2854..e729e21 100644 --- a/src/main/java/org/wlld/App.java +++ b/src/main/java/org/wlld/App.java @@ -36,25 +36,30 @@ public class App { //设置图像行列比例的列,默认为3 选填 templeConfig.setColumn(3); //对模版进行初始化 Ps:初始化一定要在所有参数设置完成后设置,否则设置无效。 - // 使用默认值(模型参数注入除外) + // 使用默认值(模型参数注入除外)若无需注入参数 选择TRU,若注入模型参数选择FALSE + //相似说明见 文档1 templeConfig.initNerveManager(true);//对模板初始化 //初始化计算类 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 < 999; 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"); + //将图像矩阵和标注加入进行学习, 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); diff --git a/图像识别API文档.txt b/图像识别API文档.txt new file mode 100644 index 0000000..a37564c --- /dev/null +++ b/图像识别API文档.txt @@ -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 rightTagging = new HashMap<>();//分类标注 + Map 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); diff --git a/说明1.txt b/说明1.txt new file mode 100644 index 0000000..97eac5e --- /dev/null +++ b/说明1.txt @@ -0,0 +1,54 @@ +1,public 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,让开发者知道是哪次事件的回调判断 +2,templeConfig.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 + 这个默认值是按照现在手机竖直的图片的长宽比,目前都是这个数值,横过来的话就是 3:5 + 如果不是手机竖直尺寸的图像,且并不确定比例,建议写5:5 + 因为算法会对进行图像进行压缩后,进入矩阵,压缩有会有一个默认的矩阵大小,最小压缩到5像素 + 所以设置这个,最好要有一个值写5,另外一个自定义,如果不知道就写 5:5 +5, Map 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来说检测单张图片的性能是可以满足的 +学习就是学的模型参数,学完了要把模型参数拿出来,下次直接注入就可, +模型参数提取还没来得及封装,下一步封装,现在手动提取,有点麻烦 +