From 52f4923da6c5c1a7481265f1dbc7a846f0451395 Mon Sep 17 00:00:00 2001 From: "794757862@qq.com" <6205194max> Date: Fri, 9 Jun 2023 10:54:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=B5=8B=E8=AF=95=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/easyAi.html | 607 --------------------------------- 1 file changed, 607 deletions(-) delete mode 100644 src/main/resources/easyAi.html diff --git a/src/main/resources/easyAi.html b/src/main/resources/easyAi.html deleted file mode 100644 index 1a968a5..0000000 --- a/src/main/resources/easyAi.html +++ /dev/null @@ -1,607 +0,0 @@ - - - -
-easyAI是用来简易快速开发人工智能应用的JAVA引擎,也同时可以深度开发定制需求。本文档详细讲述本框架的所有即时更新版本内容, - 详述所有内置API,内置参数,各种模式及应用,对于深度学习easyAI开发人员提供帮助。同时可以让企业低成本部署,快速应用落地,并降低人才门槛及费用。 - 点击可查看easyAi视频教程, - easyAi-1.0.6Maven包下载地址 -
-Config config = new Config();//配置文件类;-
配置文件类,这是一个用来保存学习过程中需要的各种参数,各种分类器参数及各种需要初始化的内部类。
-config.setTypeNub(2);//设置训练种类数-
config.setBoxSize(125);//设置物体大致大小 单位像素 即 125*125 的矩形-
config.setPictureNumber(5);//设置每个种类训练图片数量 某个类别有几张照片,注意所有种类照片数量要保持一致-
config.setPth(0.7);//设置可信概率,只有超过可信概率阈值,得出的结果才是可信的 数值为0-1之间-
config.setShowLog(true);//输出学习时打印数据-
图片解析与图片训练
-Picture picture = new Picture();//图片解析类,用于将图片解析为三通道像素矩阵-
Distinguish distinguish = new Distinguish(config);//创建识别类-
distinguish.setBackGround(picture.getThreeMatrix("E:\\ls\\fp15\\back.jpg"));//设置识别的背景图片(该api为固定背景)-
读取训练图片,进行图像训练
-- List<FoodPicture> foodPictures = new ArrayList<>();//所有识别物体的标注集合 - for (int i = 1; i < 3; i++) {//加载图片全过程 - FoodPicture foodPicture = new FoodPicture(); - foodPictures.add(foodPicture); - List<PicturePosition> picturePositionList = new ArrayList<>(); - foodPicture.setId(i + 1);//该图片类别 - foodPicture.setPicturePositionList(picturePositionList); - for (int j = 1; j < 6; j++) { - String name; - if (i == 1) { - name = "a"; - } else { - name = "b"; - } - PicturePosition picturePosition = new PicturePosition(); - picturePosition.setUrl("E:\\ls\\fp15\\" + name + i + ".jpg"); - picturePosition.setNeedCut(false);//是否需要剪切,充满全图不需要 - picturePositionList.add(picturePosition); - } - } - distinguish.studyImage(foodPictures);//进行学习 耗时较长-
学习完成提取模型,并将模型myModel序列化为JSON字符串形式保存
-Model model = distinguish.getModel();String myModel= JSON.toJSONString(model);-
服务启动初始化静态配置,并注入学习模型
-- Config config = new Config();//配置文件 - config.setTypeNub(2);//设置类别数量 - config.setBoxSize(125);//设置物体大小 单位像素 - config.setPictureNumber(5);//设置每个种类训练图片数量 - config.setPth(0.7);//设置可信概率,只有超过可信概率阈值,得出的结果才是可信的 - config.setShowLog(false);//输出学习时打印数据 - Distinguish distinguish = new Distinguish(config);//识别类 - distinguish.insertModel(JSONObject.parseObject(ModelData.DATA, Model.class));//将之前训练时保存的训练模型反序列化为实体类后,注入模型 - //注意:完成后请单例Distinguish类,即完成系统启动时初始化过程-
识别过程
-Distinguish distinguish
此识别类为系统启动时已经单例初始化的,要获取从单例初始化已经完成,并注入模型后的Distinguish类,识别过程请不要 "new" 这个类。
- - Picture picture = new Picture();//图片解析类 - for (int i = 1; i < 8; i++) { - System.out.println("i====" + i); - ThreeChannelMatrix t = picture.getThreeMatrix("E:\\ls\\fp15\\t" + i + ".jpg");//将识别图片转化为矩阵 - Map<Integer, Double> map = distinguish.distinguish(t);//识别结果 - for (Map.Entry<Integer, Double> entry : map.entrySet()) { - System.out.println(entry.getKey() + ":" + entry.getValue());//识别结果打印 - } - }-
识别结果打印控制台
-- i====1//第一张图 结果为 橘子,出现2:代表类别。:0.8874306751020916,带表该类别权重,权重越高说明该类别的物品在当前 图片中数量越多或者面积越大。 - 2:0.8874306751020916 说明(图1有橘子,权重为:0.8874306751020916) - i====2 - 2:0.8878192183606407 - i====3 - 3:0.7233916245920673说明(图3有苹果,权重为:0.7233916245920673) - i====4 - 2:0.9335699571468958说明(图4有橘子,权重为:0.9335699571468958) - 3:0.7750825597199661说明(图4有苹果,权重为:0.7750825597199661) - i====5 - 3:0.8481590575557582 - i====6 - 2:0.7971025523095067 - i====7 - 2:1.5584968376080388(图7有橘子,权重为:1.5584968376080388) - 3:0.8754957897385587(图7有苹果,权重为:0.8754957897385587)-
图片摘要
-第一个参数:threeChannelMatrix
图像三通道矩阵,通过Picture
类读取本地文件或输入流获取,
- 前文代码有注释说明。
第二个参数:boxSize
将一张图片横纵各分为几个区域提取特征,该值越大,生成的摘要id敏感度越高
第三个参数:regionSize
相似特征区域分区种类数量,该值越大,生成的摘要id敏感度越高
最终返回id
即为该图片摘要id,通过id逐位对比即可对比相似程度
-FastPictureExcerpt fastPictureExcerpt = new FastPictureExcerpt(); -String id = fastPictureExcerpt.creatImageName(threeChannelMatrix, 5, 10);-
id敏感度越高,对图片变化越敏感,越适合越大的检索区域匹配,即特征越细致,但缺点id长度越长。
-id敏感度越低,对图片变化越不敏感,越适合越小的检索区域匹配,特征越粗,优点是id长度越短。
-对语言训练模板进行初始化并学习
--WordTemple wordTemple = new WordTemple(); -Tokenizer tokenizer = new Tokenizer(wordTemple);//学习类 -Map<Integer, List<String>> model = new HashMap<>();//训练模板 主键为类别id,值为该类别id的语句集合 -tokenizer.start(model); //开始训练-
最好不要将标点符号带入训练语句,在训练量不足的时候可以展现更好的效果
-包含数字的语句用统一的占位符代替 例如 35,3,36% 变为 #,#,#%
-wordTemple
初始化语言模版,该语言模板要进行单例化,在内存中长期持有。
对用户输入的语句进行语义分类
--Talk talk = new Talk(wordTemple); -List<Integer> list = talk.talk("空调坏了,帮我修一修"); -System.out.println(list); -}-
list
返回的集合中每个值代表了输入语句在每个标点符号前语句的分类id
Talk
的构造参数wordTemple
是初始化并训练时,内存中单例保存的wordTemple
纯切词模式
-wordTemple.setSplitWord(true)
将模板设置成纯切词模式
- -wordTemple.setSplitWord(true); -List<List<String>> lists = talk.getSplitWord("空调坏了,帮我修一修"); -for (List<String> list : lists) { -System.out.println(list); -}-
捕捉用户输入语句的关键词
--CatchKeyWord catchKeyWord = new CatchKeyWord(); -List<KeyWordForSentence> keyWordForSentenceList = new ArrayList<>(); - for (Sentence sentence : sentences) { - String word = sentence.getWord();//模板中的用户语句 - String keyWord = sentence.getNoun();//该用户语句中的关键词 - if (keyWord != null && keyWord.length() > 0) {//关键词必须存在 - KeyWordForSentence keyWordForSentence = new KeyWordForSentence(); - keyWordForSentence.setSentence(word);//输入语句 - keyWordForSentence.setKeyWord(keyWord);//输入关键词 - keyWordForSentenceList.add(keyWordForSentence); - } - } -catchKeyWord.study(keyWordForSentenceList);//进行关键词训练 -KeyWordModel keyWordModel = catchKeyWord.getModel();//训练完毕获取模型并将其序列化以JSON字符串形式保存-
keyWord
必须完全包含于语句code
内才有效
-catchKeyWord
需要在服务启动的时候进行单例化。
对获取关键词类进行服务启动初始化
-- CatchKeyWord catchKeyWord = new CatchKeyWord(); - catchKeyWord.insertModel(keyWordModel);//注入训练时的模型(通过JSON反序列化)-
对用户输入语句的关键词进行捕捉
-List<String> keyWords=catchKeyWord.getKeyWord(sen);//返回关键词集合-
catchKeyWord
从上文服务器初始化中单例的CatchKeyWord获取
- 对用户输入的语句进行延伸
--List<String> sentenceList = new ArrayList<>();//模板中所有语句集合 - static{ - 将模板中所有语句集合注入到sentenceList当中 - } -SentenceCreator creator =new SentenceCreator();//词句延伸类 需要服务启动时单例化 -WordTemple wordTemple = new WordTemple();//同上文模板类需要服务启动时单例化 -creator.initFirst(sentenceList, wordTemple); -creator.study();//进行训练 -String myModel = JSONObject.toJSONString(creator.getModel());//训练完成将模型反序列化为JSON字符串保存 --
creator
词句延伸类,需要服务启动时单例化保存
- - 对语句延伸类进行初始化
--CreatorSentenceModel model = JSONObject.parseObject(readPaper(file), CreatorSentenceModel.class); -creator.initModel(wordTemple, model);//注入语句延伸模型-
CreatorSentenceModel
模型注入到creator
语句延伸类并单例化,
- 并将CreatorSentenceModel
单例保存
- 若用户语句拆词数量过少,则对用户语句进行延伸生成新的语句
-- List<String> words = talk.getSplitWord(sen).get(0);//对该词进行拆词 - if (words.size() < 3) {//拆词数量小于3,则对语句进行补全 - String fillName = beanMangerOnly.sentenceCreator().fill(sen, talk);//补全语句 - type = talk.talk(fillName).get(0);//对补全后的语句进行识别 - } else { - type = talk.talk(sen).get(0);//对原句进行识别 - } --
- //创建一个DNN神经网络管理器 - /** - * 初始化神经元参数 - * - * @param sensoryNerveNub 输入神经元个数 - * @param hiddenNerveNub 隐层神经元个数 - * @param outNerveNub 输出神经元个数 - * @param hiddenDepth 隐层深度 - * @param activeFunction 激活函数 - * @param isDynamic 是否是动态神经元 - * @param isAccurate 是否保留精度 - * @param rzType 正则函数 - * @param lParam 正则系数 - * @throws Exception 如果参数错误则抛异常 - */ - public NerveManager(int sensoryNerveNub, int hiddenNerveNub, int outNerveNub, int hiddenDepth, ActiveFunction activeFunction, boolean isDynamic, boolean isAccurate, - double studyPoint, int rzType, double lParam) - /** - * 初始化 - * - * @param initPower 是否是第一次注入 - * @param isMatrix 参数是否是一个矩阵 - * @param isShowLog 是否打印学习参数 - * @param isSoftMax 最后一层是否用softMax激活 - * @throws Exception - */ - public void init(boolean initPower, boolean isMatrix, boolean isShowLog, boolean isSoftMax)//深度神经网络初始化 - nerveManager.getSensoryNerves()获取感知神经元集合 - //eventId:事件ID - //parameter:输入特征值 - //isStudy:是否是学习 - //E:特征标注 - //OutBack 回调类 - SensoryNerv.postMessage(long eventId, double parameter, boolean isStudy, Map<Integer, Double> E, OutBack outBack) - //每一次输出结果都会返回给回调类,通过回调类拿取输出结果,并通过eventId来对应事件 --
OutBack
,通过OutBack实现类获取对应神经元返回参数。
- - //创建一个内存中的数据表 - DataTable dataTable = new DataTable(column); - //构造参数是列名集合 - public DataTable(Set<String> key) - //指定主列名集合中该表的主键 - dataTable.setKey("point"); - //创建一片随机森林 - RandomForest randomForest = new RandomForest(7); - //构造参数为森林里的树木数量 - public RandomForest(int treeNub); - //唤醒随机森林里的树木 - randomForest.init(dataTable); - //将加入数据的实体类一条条插入森林中 - randomForest.insert(Object object); - //森林进行学习 - randomForest.study(); - //插入特征数据,森林对该数据的最终分类结果进行判断 - int type = randomForest.forest(Object objcet); --
- public Knn(int nub);//构造参数,有几个人参与投票 - public void insertMatrix(Matrix vector, int tag);//参数分别是特征向量和类别,注入进KNN当中 - public int getType(Matrix vector);//输入特征向量,返回类别 - public void removeType(int type);//移除一个分类 --
- public LVQ(int typeNub, int lvqNub, double studyPoint);//类别数量,循环次数,学习率,注意lvq的递增类别id必须从0开始 - public void insertMatrixBody(MatrixBody matrixBody);//注入特征向量 - public void start();//执行学习 --
- public MeanClustering(int speciesQuantity);//聚多少个类 - public void setColor(double[] color);//输入特征数组 - public void start();//开始聚类 - public List<RGBNorm> getMatrices();//聚类结束时,获取聚类实体 --
- 适应函数类需要实现适应函数接口,并实现生成返回值
-- public interface PsoFunction {//粒子群回调函数 - //根据参数返回函数值 - double getResult(double[] parameter,int id) throws Exception; -}-
构造例子群类
-- /** - * 初始化 - * - * @param dimensionNub 维度 - * @param minBorder 最小边界 - * @param maxBorder 最大边界 - * @param times 迭代次数 - * @param particleNub 粒子数量 - * @param psoFunction 适应函数 - * @param inertialFactor 惯性因子 - * @param selfStudyFactor 个体学习因子 - * @param socialStudyFactor 社会学习因子 - * @param isMax 最大值是否为最优 - * @param maxSpeed 最大速度 - * @param initSpeed 初始速度 - * @throws Exception - */ - public PSO(int dimensionNub, int[] minBorder, int[] maxBorder, - int times, int particleNub, PsoFunction psoFunction, - double inertialFactor, double selfStudyFactor, double socialStudyFactor - , boolean isMax, double maxSpeed, double initSpeed) - public void start()//粒子群开始进行迭代 - public double[] getAllBest()//迭代结束获取全局最优解 --
动态规划类:DynamicProgramming
,
- 动作函数要继承动作抽象类Action
,并重写以下方法
-public abstract class Action {//动作 - private int actionId;//动作id - - public int getActionId() {//返回该动作id - return actionId; - } - - public void setActionId(int actionId) {//设置该动作id - this.actionId = actionId; - } - - public int[] action(int[] stateId) {//stateId状态进行该动作后生成新的状态 - return new int[0]; - } - - public int[] actionTest(int[] stateId) {//stateId状态进行该动作后生成新的测试状态 - return new int[0]; - } - - protected int getProfit(int[] stateId) {//stateId的状态进行该动作后所获得的收益 - return 0; - } -} - Map<Integer, Action> actionMap = dynamicProgramming.getActionMap();//从dynamicProgramming获取内部动作集合 -}-
状态类:DynamicState
-public class DynamicState { - private int[] stateId;//状态id - private boolean isFinish = false;//是否是终结态 - public void setFinish(boolean finish) { - isFinish = finish; - } - public DynamicState(int[] stateId) {//设置状态id - this.stateId = stateId; - } - List<DynamicState> dynamicStateList = dynamicProgramming.getDynamicStateList();//从dynamicProgramming获取内部状态集合 -}-
启动开始动态规划的策略迭代,并生成价值函数,api调用如下:
-- dynamicProgramming.setMaxTimes(int maxTimes)//策略改进最大迭代次数 - dynamicProgramming.setValueTh(double valueTh);//设置策略改进价值阈值 - dynamicProgramming.setGaMa(double gaMa);//设置贴现因子 - dynamicProgramming.gameStart();//开始策略迭代生成价值函数 - dynamicProgramming.getValueFunction();//返回价值函数 - dynamicProgramming.getBestAction(int[] stateId);//获取当前最优动作集合 --
矩阵类:Matrix
- 1,Matrix matrix = new Matrix(int x, int y);//初始化构造一个行为x,列为y的矩阵类 - 2,Matrix matrix= new Matrix(int x, int y, String matr);//初始化构造一个行为x,列为y,内部数据为 matr 的矩阵 - 3,int getX();//获取行数 - 4,int getY();//获取列数 - 5,void setState(int x, int y);//设置矩阵属性,根据x,y的数值大小,属性分别是0矩阵,行矩阵,列矩阵 - 6,double getAVG();//获取当前矩阵中所有数值的平均值 - 7,boolean isRowVector();//该矩阵是否是一个行矩阵 - 8,boolean isVector();该矩阵是否为一个向量 - 9,boolean isZero();该矩阵是否为一个0矩阵 - 10,void clear();//清除矩阵数据 - 11, double getDet();//求该矩阵的行列式 - 12,Matrix getSonOfMatrix(int x, int y, int xSize, int ySize);//求该矩阵的分块矩阵 - 13,Matrix getRow(int x);//求该矩阵指定一行的行向量 - 14,Matrix getColumn(int y);//求该矩阵指定一列的列向量 - 15,String getString();//返回字符串形式的该矩阵 - 16,String getPositionString();//返回带坐标的该矩阵字符串 - 17,void setNub(int x, int y, double number);//向该矩阵指定xy的位置输入一个数值 - 18,double getNumber(int x, int y);//向该矩阵指定xy的位置获取一个数值 --
2,Matrix matrix= new Matrix(int x, int y, String matr)
示例:
- Matrix matrix = new Matrix(2, 2, "[1,2]#[3,4]")
,构造一个行为2,列为2,第一行数据为[1,2],第二行数据为[3,4]的矩阵。
矩阵运算类:MatrixOperation
- static Matrix add(Matrix matrix1, Matrix matrix2);//矩阵相加 - static Matrix sub(Matrix matrix1, Matrix matrix2);//矩阵相减 - static Matrix getLinearRegression(Matrix parameter, Matrix out);//多元线性回归 - static double getEDistByMatrix(Matrix matrix1, Matrix matrix2);//矩阵相似度(欧氏距离) - static double getEDist(Matrix matrix1, Matrix matrix2);//两个向量之间欧式距离的平方 - static Matrix pushVector(Matrix myMatrix, Matrix matrix, boolean addRow);//向一个矩阵里合并一个行向量或者列向量到矩阵行或者列的末尾 - static Matrix push(Matrix matrix, double nub, boolean isRow);//向一个向量里PUSH一个值 - static Matrix matrixToVector(Matrix matrix, boolean isRow);//将一个矩阵转成行向量 - static double innerProduct(Matrix matrix1, Matrix matrix2);//求两个向量的内积 - static double getNorm(Matrix matrix);//求向量范数 - static double getNormCos(Matrix matrix1, Matrix matrix2);//求两个向量之间的余弦 - static Matrix transPosition(Matrix matrix);//矩阵转置 - static int inverseNumber(double[] myInverse);//逆序数奇偶性判定 - static Matrix getInverseMatrixs(Matrix matrix);//矩阵求逆 - static Matrix adjointMatrix(Matrix matrix);//求伴随矩阵 - static double algebraicCofactor(Matrix matrix, int row, int column);//求矩阵代数余子式 - static Matrix mulMatrix(Matrix matrix1, Matrix matrix2);//矩阵相乘 - static void mathMul(Matrix matrix, double nub);//矩阵数乘 - static void mathSub(Matrix matrix, double nub);//矩阵数减 - static void mathDiv(Matrix matrix, double nub);//矩阵数除 - static List<Double> matrixToList(Matrix matrix);//矩阵转list集合 - static Matrix listToRowVector(List<Double> list);//list集合转行向量 - static Matrix im2col(Matrix matrix, int kernLen, int step);//卷积im2col - static Matrix reverseIm2col(Matrix matrix, int kernLen, int step, int xSize, int ySize);//逆向im2col --
所有的矩阵运算,返回矩阵都是一个新的实例化矩阵,对参与运算的所有原矩阵原数值不产生任何影响
-图像解析类:Picture
- Picture picture = new Picture();//实例化一个图像解析类 - ThreeChannelMatrix getThreeMatrix(String fileURL);//根据本地图片url返回一个RGB三通道矩阵类 - ThreeChannelMatrix getThreeMatrix(InputStream file);//根据一个输入流返回一个RGB三通道矩阵类-
ThreeChannelMatrix
,所有像素值都为归一化后的0-1之间的值!
- RGB三通道矩阵:ThreeChannelMatrix
- Matrix getMatrixR();//返回R矩阵 - Matrix getMatrixG();//返回G矩阵 - Matrix getMatrixB();//返回B矩阵 - Matrix getH();//返回灰度矩阵-