Commit d838dc74c143c3e54a6573d80e19d9d8fa69520a

Authored by Josh Klontz
1 parent a9357c29

first draft of Likely trainable transform

openbr/plugins/core/likely.cpp
1 1 #include <openbr/plugins/openbr_internal.h>
  2 +#include <openbr/core/qtutils.h>
2 3  
3 4 #include <likely.h>
4 5 #include <likely/opencv.hpp>
... ... @@ -13,44 +14,76 @@ namespace br
13 14 * www.liblikely.org
14 15 * \author Josh Klontz \cite jklontz
15 16 */
16   -class LikelyTransform : public UntrainableTransform
  17 +class LikelyTransform : public Transform
17 18 {
18 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 29 ~LikelyTransform()
26 30 {
27 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 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 69 void project(const Template &src, Template &dst) const
42 70 {
43 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 73 dst = likelyToOpenCVMat(dstl);
46 74 likely_release_mat(dstl);
47 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)
... ...