/* ----------------------------------------------------------------------------- This source file is part of OpenSpace3D For the latest info, see http://www.openspace3d.com Copyright (c) 2012 I-maginer This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA, or go to http://www.gnu.org/copyleft/lesser.txt ----------------------------------------------------------------------------- */ struct PlugNN = [ NN_instance : PInstance, NN_mlp : ObjMl, NN_sDataFile : S, NN_sCurrentLabel : S, NN_bLearning : I ]mkPlugNN;; fun atofl(sl)= let nil -> lfloat in ( let strextr sl -> l in let sizelist l -> size in let 0 -> i in while (i < size) do ( let nth_list l i -> line in let sizelist line -> lsize in let 0 -> li in while (li < lsize) do ( let nth_list line li -> word in if (atof word) == nil then nil else set lfloat = (atof word)::lfloat; set li = li + 1; ); set i = i + 1; ); revertlist lfloat; );; fun atolvec(sl)= let nil -> lfloat in ( let strextr sl -> l in let sizelist l -> size in let 0 -> i in while (i < size) do ( let nil -> vec in ( let nth_list l i -> line in let sizelist line -> lsize in let 0 -> li in while (li < 3) do ( let nth_list line li -> word in let if (atof word) == nil then "0.0" else word -> word in set vec = lcat vec (atof word)::nil; set li = li + 1; ); set lfloat = [(hd vec) (hd tl vec) (hd tl tl vec)]::lfloat; ); set i = i + 1; ); revertlist lfloat; );; fun deleteOb(inst, mlstr)= _DSml mlstr.NN_mlp; 0;; fun cbTrainned(ml, mlstr)= _MlSaveData mlstr.NN_mlp _getmodifypack mlstr.NN_sDataFile; addLogMessage strcat "Trainned data saved to : " mlstr.NN_sDataFile; SendPluginEvent mlstr.NN_instance "Trainned" mlstr.NN_sCurrentLabel nil; 0;; fun cbDetect(ml, mlstr, catname)= addLogMessage strcat "Motion detected : " catname; SendPluginEvent mlstr.NN_instance "Detected" catname nil; SendPluginEvent mlstr.NN_instance catname nil nil; 0;; fun subFloatParams(l1, l2)= if ((sizelist l1) != (sizelist l2)) then l1 else let nil -> nl in ( let sizelist l1 -> size in let 0 -> i in while i < size do ( let nth_list l1 i -> elt1 in let nth_list l2 i -> elt2 in set nl = lcat nl (elt1 -. elt2)::nil; set i = i + 1; ); nl; );; fun mulFloatParams(l1, val)= let nil -> nl in ( let sizelist l1 -> size in let 0 -> i in while i < size do ( let nth_list l1 i -> elt1 in set nl = lcat nl (elt1 *. val)::nil; set i = i + 1; ); nl; );; fun divFloatParams(l1, val)= if (val == 0.0) then nil else let nil -> nl in ( let sizelist l1 -> size in let 0 -> i in while i < size do ( let nth_list l1 i -> elt1 in set nl = lcat nl (elt1 /. val)::nil; set i = i + 1; ); nl; );; fun normFloatParams(l1)= let nil -> nl in ( let sizelist l1 -> size in let 0 -> i in while i < size do ( let nth_list l1 i -> x in let nth_list l1 i+1 -> y in let sqrt ((x *. x) +. (y *. y)) -> sum in let if (sum == 0.0) then 1.0 else 1.0 /. sum -> coef in let [(x *. coef) (y *. coef)] -> [nx ny] in set nl = lcat nl nx::ny::nil; set i = i + 2; ); nl; );; fun angFloatParams(l1)= let nil -> nl in ( let sizelist l1 -> size in let 0 -> i in while i < size do ( let nth_list l1 i -> x in let nth_list l1 i+1 -> y in set nl = lcat nl ((atan2 x y) /. (PIf /. 180.0))::nil; set i = i + 2; ); nl; );; fun logFloatParams(l)= let "Input :" -> ret in ( let sizelist l -> size in let 0 -> i in while i < size do ( let nth_list l i -> [x y z] in set ret = strcatn ret::" | "::(ftoa x)::" "::(ftoa y)::" "::(ftoa z)::nil; set i = i + 1; ); addLogMessage ret; ); 0;; fun cbInputLearn(inst, from, action, param, rep, mlstr)= let atolvec param -> np in //let lcat np [(itof _tickcount) 0.0 0.0]::nil -> np in ( _MlAddTrainingData mlstr.NN_mlp np mlstr.NN_sCurrentLabel; ); 0;; fun cbInputDetect(inst, from, action, param, rep, mlstr)= let atolvec param -> np in //let lcat np [(itof _tickcount) 0.0 0.0]::nil -> np in ( _MlAddDetectionData mlstr.NN_mlp np; ); 0;; fun cbStartLearn(inst, from, action, param, rep, mlstr)= if (!mlstr.NN_bLearning) then nil else ( set mlstr.NN_sCurrentLabel = param; PluginRegisterAction inst "Input" mkfun6 @cbInputLearn mlstr; addLogMessage strcat "Start learn : " param; ); 0;; fun cbStopLearn(inst, from, action, param, rep, mlstr)= if (!mlstr.NN_bLearning) then nil else ( PluginRegisterAction inst "Input" nil; _MlTrain mlstr.NN_mlp; addLogMessage "Stop learn"; ); 0;; fun newOb(inst)= let (getPluginInstanceParam inst "path") -> datapath in let if (datapath == nil) || ((strlen datapath) == 0) then strcatn "tmp/ml/"::inst.INST_sName::".xlm"::nil else datapath -> datapath in let atoi (getPluginInstanceParam inst "nbfeatures") -> nbfeatures in let if nbfeatures == nil then 1 else nbfeatures -> nbfeatures in let atof (getPluginInstanceParam inst "threshold") -> threshold in let if threshold == nil then 0.5 else threshold -> threshold in let atoi (getPluginInstanceParam inst "detectmode") -> detectmode in let if detectmode == nil then 0 else detectmode -> detectmode in let atoi (getPluginInstanceParam inst "learnmode") -> learnmode in let if learnmode == nil then 0 else learnmode -> learnmode in let _CRml _channel detectmode nbfeatures threshold -> ml in let mkPlugNN [inst ml datapath nil learnmode] -> mlstr in ( if (learnmode) then ( _CBMlTrainingFinished mlstr.NN_mlp @cbTrainned mlstr; 0; ) else ( _MlLoadData mlstr.NN_mlp _checkpack datapath; _CBMlDetect mlstr.NN_mlp @cbDetect mlstr; PluginRegisterAction inst "Input" mkfun6 @cbInputDetect mlstr; 0; ); PluginRegisterAction inst "Start learn" mkfun6 @cbStartLearn mlstr; PluginRegisterAction inst "Stop learn" mkfun6 @cbStopLearn mlstr; setPluginInstanceCbDel inst mkfun2 @deleteOb mlstr; ); 0;; fun IniPlug(file)= PlugRegister @newOb nil; setPluginEditor @dynamicedit; 0;;