diff --git a/sdk/plugins/compare.cpp b/sdk/plugins/compare.cpp index 62b52d5..5deb254 100644 --- a/sdk/plugins/compare.cpp +++ b/sdk/plugins/compare.cpp @@ -42,7 +42,7 @@ public: INF, L1, L2, - CosineSimilarity }; + Cosine }; private: BR_PROPERTY(Metric, metric, L2) @@ -76,8 +76,8 @@ private: case L2: result = norm(a, b, NORM_L2); break; - case CosineSimilarity: - result = cosineSimilarity(a, b); + case Cosine: + result = cosine(a, b); break; default: qFatal("Invalid metric"); @@ -89,33 +89,29 @@ private: return -log(result+1); } - static float cosineSimilarity(const Mat &a, const Mat &b) + static float cosine(const Mat &a, const Mat &b) { - assert((a.type() == CV_32FC1) && (b.type() == CV_32FC1)); - assert((a.rows == b.rows) && (a.cols == b.cols)); - - float denom = 0; - float tnum = 0; - float qnum = 0; + float dot = 0; + float magA = 0; + float magB = 0; for (int row=0; row(row,col); - float query = b.at(row,col); + const float target = a.at(row,col); + const float query = b.at(row,col); - denom += target * query; - tnum += target * target; - qnum += query * query; + dot += target * query; + magA += target * target; + magB += query * query; } } - return denom / (sqrt(tnum)*sqrt(qnum)); + return dot / (sqrt(magA)*sqrt(magB)); } }; BR_REGISTER(Distance, Dist) - /*! * \ingroup distances * \brief Fast 8-bit L1 distance diff --git a/sdk/plugins/regions.cpp b/sdk/plugins/regions.cpp index 9d9086e..561fc74 100644 --- a/sdk/plugins/regions.cpp +++ b/sdk/plugins/regions.cpp @@ -79,23 +79,29 @@ BR_REGISTER(Transform, ByRow) class Cat : public UntrainableMetaTransform { Q_OBJECT + Q_PROPERTY(int partitions READ get_partitions WRITE set_partitions RESET reset_partitions) + BR_PROPERTY(int, partitions, 1) void project(const Template &src, Template &dst) const { - int vals = 0; - foreach (const cv::Mat &m, src) - vals += m.total() * m.channels(); - - Mat cat(1, (int)vals, CV_32FC1); - int offset = 0; - foreach (const cv::Mat &m, src) { - size_t size = m.total() * m.elemSize(); - memcpy(&cat.data[offset], m.ptr(), size); - offset += size; - } - dst.file = src.file; - dst = cat; + + if (src.size() % partitions != 0) + qFatal("Cat %d partitions does not evenly divide %d matrices.", partitions, src.size()); + QVector sizes(partitions, 0); + for (int i=0; i offsets(partitions, 0); + for (int i=0; i