Commit d838dc74c143c3e54a6573d80e19d9d8fa69520a

Authored by Josh Klontz
1 parent a9357c29

first draft of Likely trainable transform

openbr/plugins/core/likely.cpp
1 #include <openbr/plugins/openbr_internal.h> 1 #include <openbr/plugins/openbr_internal.h>
  2 +#include <openbr/core/qtutils.h>
2 3
3 #include <likely.h> 4 #include <likely.h>
4 #include <likely/opencv.hpp> 5 #include <likely/opencv.hpp>
@@ -13,44 +14,76 @@ namespace br @@ -13,44 +14,76 @@ namespace br
13 * www.liblikely.org 14 * www.liblikely.org
14 * \author Josh Klontz \cite jklontz 15 * \author Josh Klontz \cite jklontz
15 */ 16 */
16 -class LikelyTransform : public UntrainableTransform 17 +class LikelyTransform : public Transform
17 { 18 {
18 Q_OBJECT 19 Q_OBJECT
19 - Q_PROPERTY(QString kernel READ get_kernel WRITE set_kernel RESET reset_kernel STORED false)  
20 - BR_PROPERTY(QString, kernel, "") 20 + Q_PROPERTY(QString sourceFile READ get_sourceFile WRITE set_sourceFile RESET reset_sourceFile STORED false)
  21 + BR_PROPERTY(QString, sourceFile, "")
21 22
22 - likely_const_env env;  
23 - void *function; 23 + QByteArray bitcode;
  24 + likely_env env;
  25 +
  26 + typedef likely_mat (*Function)(likely_const_mat);
  27 + Function function;
24 28
25 ~LikelyTransform() 29 ~LikelyTransform()
26 { 30 {
27 likely_release_env(env); 31 likely_release_env(env);
28 } 32 }
29 33
30 - void init() 34 + void compile()
31 { 35 {
32 - likely_release_env(env);  
33 - const likely_ast ast = likely_lex_and_parse(qPrintable(kernel), likely_file_lisp);  
34 - const likely_const_env parent = likely_standard(likely_jit(false), NULL);  
35 - env = likely_eval(ast, parent, NULL, NULL); 36 + const likely_const_mat data = likely_new(likely_u8 | likely_multi_channel, bitcode.size(), 1, 1, 1, bitcode.data());
  37 + env = likely_precompiled(data, qPrintable(QFileInfo(sourceFile).baseName()));
  38 + function = (Function) likely_function(env->expr);
  39 + if (!function)
  40 + qFatal("Failed to compile: %s", qPrintable(sourceFile));
  41 + }
  42 +
  43 + void train(const TemplateList &)
  44 + {
  45 + QByteArray sourceCode;
  46 + QtUtils::readFile(sourceFile, sourceCode);
  47 +
  48 + // Pick settings to minimize code size
  49 + likely_settings settings;
  50 + settings.opt_level = 2;
  51 + settings.size_level = 2;
  52 + settings.multicore = false;
  53 + settings.heterogeneous = false;
  54 + settings.unroll_loops = false;
  55 + settings.vectorize_loops = false;
  56 + settings.verbose = false;
  57 +
  58 + likely_mat output;
  59 + const likely_const_env parent = likely_standard(settings, &output, likely_file_bitcode);
  60 + likely_release_env(likely_lex_parse_and_eval(sourceCode.data(), likely_guess_file_type(qPrintable(sourceFile)), parent));
36 likely_release_env(parent); 61 likely_release_env(parent);
37 - likely_release_ast(ast);  
38 - function = likely_function(env->expr); 62 +
  63 + bitcode = QByteArray(output->data, likely_bytes(output));
  64 + likely_release_mat(output);
  65 +
  66 + compile();
39 } 67 }
40 68
41 void project(const Template &src, Template &dst) const 69 void project(const Template &src, Template &dst) const
42 { 70 {
43 const likely_const_mat srcl = likelyFromOpenCVMat(src); 71 const likely_const_mat srcl = likelyFromOpenCVMat(src);
44 - const likely_const_mat dstl = reinterpret_cast<likely_mat (*)(likely_const_mat)>(function)(srcl); 72 + const likely_const_mat dstl = function(srcl);
45 dst = likelyToOpenCVMat(dstl); 73 dst = likelyToOpenCVMat(dstl);
46 likely_release_mat(dstl); 74 likely_release_mat(dstl);
47 likely_release_mat(srcl); 75 likely_release_mat(srcl);
48 } 76 }
49 77
50 -public:  
51 - LikelyTransform() 78 + void store(QDataStream &stream) const
  79 + {
  80 + stream << bitcode;
  81 + }
  82 +
  83 + void load(QDataStream &stream)
52 { 84 {
53 - env = NULL; 85 + stream >> bitcode;
  86 + compile();
54 } 87 }
55 }; 88 };
56 89
share/openbr/likely/cvt_gray.lisp 0 → 100644
  1 +convert-grayscale :=
  2 + src :->
  3 + {
  4 + (assume src.channels.(== 3))
  5 + dst := (new src.type.not-multi-channel 1 src.columns src.rows src.frames null)
  6 + src := (src.type.not-saturated src)
  7 + (dst src) :=>
  8 + dst :<- (bgr-to-y src.type (src 0) (src 1) (src 2))
  9 + }
  10 +
  11 +(extern u8XY "cvt_gray" u8CXY convert-grayscale)