mirror of
https://gitee.com/dromara/easyAi.git
synced 2024-12-02 11:48:08 +08:00
提速阉割版卷积
This commit is contained in:
parent
7f7841c5c4
commit
c4964086ff
@ -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");
|
||||||
//进行图像检测
|
//进行图像检测
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
4
说明1.txt
4
说明1.txt
@ -51,6 +51,6 @@ picture.getImageMatrixByIo(inputStream)根据输入流 获取图像矩阵
|
|||||||
6, templeConfig.initNerveManager(true);//对模板初始化
|
6, templeConfig.initNerveManager(true);//对模板初始化
|
||||||
若第一次学习参数就是true,学习是很慢的,非常考验性能,目前该包没有引入JCUDA(java 显卡GPU运算包)
|
若第一次学习参数就是true,学习是很慢的,非常考验性能,目前该包没有引入JCUDA(java 显卡GPU运算包)
|
||||||
所以目前使用的是cpu版本,对cpu来说检测单张图片的性能是可以满足的
|
所以目前使用的是cpu版本,对cpu来说检测单张图片的性能是可以满足的
|
||||||
学习就是学的模型参数,学完了要把模型参数拿出来,下次直接注入就可,
|
学习就是学的模型参数,学完了要把模型参数类拿出来,序列化成JSON字符串,保存数据库
|
||||||
模型参数提取还没来得及封装,下一步封装,现在手动提取,有点麻烦
|
下次服务启动,读取JSON字符串,反序列化为MODEL模型 直接注入就可,无需再次学习
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user