Commit d838dc74c143c3e54a6573d80e19d9d8fa69520a
1 parent
a9357c29
first draft of Likely trainable transform
Showing
2 changed files
with
60 additions
and
16 deletions
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) |