diff --git a/openbr/plugins/core/likely.cpp b/openbr/plugins/core/likely.cpp index edd5157..5c0854f 100644 --- a/openbr/plugins/core/likely.cpp +++ b/openbr/plugins/core/likely.cpp @@ -1,4 +1,5 @@ #include +#include #include #include @@ -13,44 +14,76 @@ namespace br * www.liblikely.org * \author Josh Klontz \cite jklontz */ -class LikelyTransform : public UntrainableTransform +class LikelyTransform : public Transform { Q_OBJECT - Q_PROPERTY(QString kernel READ get_kernel WRITE set_kernel RESET reset_kernel STORED false) - BR_PROPERTY(QString, kernel, "") + Q_PROPERTY(QString sourceFile READ get_sourceFile WRITE set_sourceFile RESET reset_sourceFile STORED false) + BR_PROPERTY(QString, sourceFile, "") - likely_const_env env; - void *function; + QByteArray bitcode; + likely_env env; + + typedef likely_mat (*Function)(likely_const_mat); + Function function; ~LikelyTransform() { likely_release_env(env); } - void init() + void compile() { - likely_release_env(env); - const likely_ast ast = likely_lex_and_parse(qPrintable(kernel), likely_file_lisp); - const likely_const_env parent = likely_standard(likely_jit(false), NULL); - env = likely_eval(ast, parent, NULL, NULL); + const likely_const_mat data = likely_new(likely_u8 | likely_multi_channel, bitcode.size(), 1, 1, 1, bitcode.data()); + env = likely_precompiled(data, qPrintable(QFileInfo(sourceFile).baseName())); + function = (Function) likely_function(env->expr); + if (!function) + qFatal("Failed to compile: %s", qPrintable(sourceFile)); + } + + void train(const TemplateList &) + { + QByteArray sourceCode; + QtUtils::readFile(sourceFile, sourceCode); + + // Pick settings to minimize code size + likely_settings settings; + settings.opt_level = 2; + settings.size_level = 2; + settings.multicore = false; + settings.heterogeneous = false; + settings.unroll_loops = false; + settings.vectorize_loops = false; + settings.verbose = false; + + likely_mat output; + const likely_const_env parent = likely_standard(settings, &output, likely_file_bitcode); + likely_release_env(likely_lex_parse_and_eval(sourceCode.data(), likely_guess_file_type(qPrintable(sourceFile)), parent)); likely_release_env(parent); - likely_release_ast(ast); - function = likely_function(env->expr); + + bitcode = QByteArray(output->data, likely_bytes(output)); + likely_release_mat(output); + + compile(); } void project(const Template &src, Template &dst) const { const likely_const_mat srcl = likelyFromOpenCVMat(src); - const likely_const_mat dstl = reinterpret_cast(function)(srcl); + const likely_const_mat dstl = function(srcl); dst = likelyToOpenCVMat(dstl); likely_release_mat(dstl); likely_release_mat(srcl); } -public: - LikelyTransform() + void store(QDataStream &stream) const + { + stream << bitcode; + } + + void load(QDataStream &stream) { - env = NULL; + stream >> bitcode; + compile(); } }; diff --git a/share/openbr/likely/cvt_gray.lisp b/share/openbr/likely/cvt_gray.lisp new file mode 100644 index 0000000..a989386 --- /dev/null +++ b/share/openbr/likely/cvt_gray.lisp @@ -0,0 +1,11 @@ +convert-grayscale := + src :-> + { + (assume src.channels.(== 3)) + dst := (new src.type.not-multi-channel 1 src.columns src.rows src.frames null) + src := (src.type.not-saturated src) + (dst src) :=> + dst :<- (bgr-to-y src.type (src 0) (src 1) (src 2)) + } + +(extern u8XY "cvt_gray" u8CXY convert-grayscale)