提速阉割版卷积

This commit is contained in:
lidapeng 2020-01-12 22:08:47 +08:00
parent 7f7841c5c4
commit c4964086ff
3 changed files with 71 additions and 44 deletions

View File

@ -17,9 +17,7 @@ import java.util.Map;
*/ */
public class App { public class App {
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
//createNerveTest();
testPic(); testPic();
//test();
} }
public static void testPic() throws Exception { public static void testPic() throws Exception {
@ -43,23 +41,21 @@ public class App {
operation.study(right, rightTagging); operation.study(right, rightTagging);
operation.study(wrong, wrongTagging); operation.study(wrong, wrongTagging);
} }
Matrix right1 = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/test/a101.png"); //获取训练结束的模型参数提取出来转化成JSON保存数据库下次服务启动时不用学习
Matrix wrong1 = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/b/b1000.png"); //直接将模型参数注入
operation.look(right1, 3); //获取模型MODLE
operation.look(wrong1, 4);
//开始处理模型参数
ModelParameter modelParameter = templeConfig.getModel(); ModelParameter modelParameter = templeConfig.getModel();
//将模型MODEL转化成JSON 字符串
String model = JSON.toJSONString(modelParameter); String model = JSON.toJSONString(modelParameter);
System.out.println("一次提取:" + model); //将JSON字符串转化为模型MODEL
ModelParameter modelParameter1 = JSONObject.parseObject(model, ModelParameter.class); ModelParameter modelParameter1 = JSONObject.parseObject(model, ModelParameter.class);
//初始化模型配置
TempleConfig templeConfig1 = getTemple(false); TempleConfig templeConfig1 = getTemple(false);
//注入之前学习结果的模型MODEL到配置模版里面
templeConfig1.insertModel(modelParameter1); templeConfig1.insertModel(modelParameter1);
ModelParameter modelParameter2 = templeConfig1.getModel(); //将配置模板配置到运算类
String model2 = JSON.toJSONString(modelParameter2);
System.out.println("二次提取:" + model2);
Operation operation1 = new Operation(templeConfig1); Operation operation1 = new Operation(templeConfig1);
//获取本地图片字节码转化成降纬后的灰度矩阵
Matrix right = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/test/a101.png"); Matrix right = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/test/a101.png");
Matrix wrong = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/b/b1000.png"); Matrix wrong = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/b/b1000.png");
//进行图像检测 //进行图像检测

View File

@ -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(); Picture picture = new Picture();
//初始化配置模板类 //初始化配置模板类
TempleConfig templeConfig = new TempleConfig(); TempleConfig templeConfig = getTemple(true);
//创建一个回调类 详细说明 看 文档说明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); Operation operation = new Operation(templeConfig);
//标注主键为 第几种分类,值为标注 1 是TRUE 0是FALSE 详细说明看文档 说明1 //标注主键为 第几种分类,值为标注 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地址图片,并转化成矩阵 详细说明见文档1 //读取本地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);
} }
//获取训练结束的模型参数提取出来转化成JSON保存数据库下次服务启动时不用学习
Matrix right = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/c/c1000.png"); //直接将模型参数注入
//获取模型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"); Matrix wrong = picture.getImageMatrixByLocal("/Users/lidapeng/Desktop/myDocment/b/b1000.png");
//给输出结果加一个说明注释,就是再回调类里面注入
ma.setNub(1);
//进行图像检测 //进行图像检测
operation.look(right, 2); operation1.look(wrong, 3);
ma.setNub(2); operation1.look(right, 2);
operation.look(wrong, 3); }
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;
}

View File

@ -51,6 +51,6 @@ picture.getImageMatrixByIoinputStream根据输入流 获取图像矩阵
6, templeConfig.initNerveManager(true);//对模板初始化 6, templeConfig.initNerveManager(true);//对模板初始化
若第一次学习参数就是true,学习是很慢的,非常考验性能目前该包没有引入JCUDA(java 显卡GPU运算包) 若第一次学习参数就是true,学习是很慢的,非常考验性能目前该包没有引入JCUDA(java 显卡GPU运算包)
所以目前使用的是cpu版本,对cpu来说检测单张图片的性能是可以满足的 所以目前使用的是cpu版本,对cpu来说检测单张图片的性能是可以满足的
学习就是学的模型参数,学完了要把模型参数拿出来,下次直接注入就可, 学习就是学的模型参数,学完了要把模型参数类拿出来序列化成JSON字符串保存数据库
模型参数提取还没来得及封装,下一步封装,现在手动提取,有点麻烦 下次服务启动读取JSON字符串反序列化为MODEL模型 直接注入就可,无需再次学习