diff --git a/src/main/java/org/wlld/App.java b/src/main/java/org/wlld/App.java index 67906ae..1dd9ac5 100644 --- a/src/main/java/org/wlld/App.java +++ b/src/main/java/org/wlld/App.java @@ -17,9 +17,7 @@ import java.util.Map; */ public class App { public static void main(String[] args) throws Exception { - //createNerveTest(); testPic(); - //test(); } public static void testPic() throws Exception { @@ -43,23 +41,21 @@ public class App { operation.study(right, rightTagging); operation.study(wrong, wrongTagging); } - Matrix right1 = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/test/a101.png"); - Matrix wrong1 = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/b/b1000.png"); - operation.look(right1, 3); - operation.look(wrong1, 4); - //开始处理模型参数 + //获取训练结束的模型参数,提取出来转化成JSON保存数据库,下次服务启动时不用学习 + //直接将模型参数注入 + //获取模型MODLE ModelParameter modelParameter = templeConfig.getModel(); + //将模型MODEL转化成JSON 字符串 String model = JSON.toJSONString(modelParameter); - System.out.println("一次提取:" + model); + //将JSON字符串转化为模型MODEL ModelParameter modelParameter1 = JSONObject.parseObject(model, ModelParameter.class); - + //初始化模型配置 TempleConfig templeConfig1 = getTemple(false); + //注入之前学习结果的模型MODEL到配置模版里面 templeConfig1.insertModel(modelParameter1); - ModelParameter modelParameter2 = templeConfig1.getModel(); - String model2 = JSON.toJSONString(modelParameter2); - System.out.println("二次提取:" + model2); + //将配置模板配置到运算类 Operation operation1 = new Operation(templeConfig1); - + //获取本地图片字节码转化成降纬后的灰度矩阵 Matrix right = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/test/a101.png"); Matrix wrong = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/b/b1000.png"); //进行图像检测 diff --git a/图像识别API文档.txt b/图像识别API文档.txt index a37564c..0d92898 100644 --- a/图像识别API文档.txt +++ b/图像识别API文档.txt @@ -1,47 +1,78 @@ -本包对图像进行训练及识别的轻量级面向小白的框架,功能在逐渐扩展中 -我们从HELLO WORLD 开始 -//初始化图像转矩阵类 +本包针对目的:本包对图像进行训练及识别的轻量级面向小白的框架,功能在逐渐扩展中 +本包目的是,低硬件成本,CPU可快速运行,面向jAVA开发的程序员简单API调用实现图像识别 +本包功能说明: +因为图像属于超大浮点运算,亿对亿级,任何一点操作都会被扩大一千万倍以上,所以目前市面上的框架大都针对GPU运算 +深度学习GPU价格昂贵,动则几万一块,这也是图像识别的费用门槛,而JAVA的用户一般都是使用CPU运算。 +很少会使用JCUDA 包的GPU浮点操作,目前的主流算法大都使用GPU运算(速度快)。 +为了保证用户对本包的使用性能,且降低部署成本,面向JAVA开发的程序员对图像的CPU快速处理,可以在CPU部署。 +所以本包对一些算法进行了部分功能阉割,部分精度忽略来保证速度,并且做到可CPU快速运算。 +阉割的代价,在某些精度上会有所下降,所以本包建议使用方案是对图像识别的分类 +比如你要分辨当前图像 是 苹果或是香蕉或是桃子,对图像进行判断分类,精准度更高 +对图像的切割,针对占比比较大的物体切割,定位。 +好的让我们从HELLO WORLD 开始 +testPic(); +getTemple(); +这有两个方法,testPic()是我们的入口 +public static void testPic() throws Exception { + //初始化图像转矩阵类 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);//对模板初始化 + TempleConfig templeConfig = getTemple(true); //初始化计算类 Operation operation = new Operation(templeConfig); - //标注主键为 第几种分类,值为标注 1 是TRUE 0是FALSE 详细说明看文档 说明1 + //标注主键为 第几种分类,值为标注 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地址图片,并转化成矩阵 详细说明见文档1 + //读取本地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"); + //获取训练结束的模型参数,提取出来转化成JSON保存数据库,下次服务启动时不用学习 + //直接将模型参数注入 + //获取模型MODLE + ModelParameter modelParameter = templeConfig.getModel(); + //将模型MODEL转化成JSON 字符串 + String model = JSON.toJSONString(modelParameter); + //将JSON字符串转化为模型MODEL + ModelParameter modelParameter1 = JSONObject.parseObject(model, ModelParameter.class); + //初始化模型配置 + TempleConfig templeConfig1 = getTemple(false); + //注入之前学习结果的模型MODEL到配置模版里面 + templeConfig1.insertModel(modelParameter1); + //将配置模板配置到运算类 + Operation operation1 = new Operation(templeConfig1); + //获取本地图片字节码转化成降纬后的灰度矩阵 + Matrix right = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/test/a101.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); + operation1.look(wrong, 3); + operation1.look(right, 2); + } + + public static TempleConfig getTemple(boolean isFirst) throws Exception { + TempleConfig templeConfig = new TempleConfig(); + //创建一个回调类 + Ma ma = new Ma();//创建一个回调类 + //注册输出结果回调类 必写 + templeConfig.setOutBack(ma); + //全连接层深度,默认为2 选填 + templeConfig.setDeep(2); + //要学习几种分类 默认为1 选填 + templeConfig.setClassificationNub(1); + //设置图像行列比例的行,默认为5 选填 + templeConfig.setRow(5); + //设置图像行列比例的列,默认为3 选填 + templeConfig.setColumn(3); + //对模版进行初始化 Ps:初始化一定要在所有参数设置完成后设置,否则设置无效。 + // 使用默认值(模型参数注入除外)若无需注入参数 选择TRU,若注入模型参数选择FALSE + //相似说明见 文档1 + templeConfig.initModelVision(isFirst);//对模板初始化 使用模板视觉 + return templeConfig; + } diff --git a/说明1.txt b/说明1.txt index 3c05cca..035ca26 100644 --- a/说明1.txt +++ b/说明1.txt @@ -51,6 +51,6 @@ picture.getImageMatrixByIo(inputStream)根据输入流 获取图像矩阵 6, templeConfig.initNerveManager(true);//对模板初始化 若第一次学习参数就是true,学习是很慢的,非常考验性能,目前该包没有引入JCUDA(java 显卡GPU运算包) 所以目前使用的是cpu版本,对cpu来说检测单张图片的性能是可以满足的 -学习就是学的模型参数,学完了要把模型参数拿出来,下次直接注入就可, -模型参数提取还没来得及封装,下一步封装,现在手动提取,有点麻烦 +学习就是学的模型参数,学完了要把模型参数类拿出来,序列化成JSON字符串,保存数据库 +下次服务启动,读取JSON字符串,反序列化为MODEL模型 直接注入就可,无需再次学习