diff --git a/include/tkDNN/BoundingBox.h b/include/tkDNN/BoundingBox.h new file mode 100644 index 0000000..7f7449c --- /dev/null +++ b/include/tkDNN/BoundingBox.h @@ -0,0 +1,31 @@ +#ifndef BOUNDINGBOX_H +#define BOUNDINGBOX_H + +#include +#include "tkdnn.h" + +namespace tk { namespace dnn { +class BoundingBox : public tk::dnn::box +{ + float overlap(const float p1, const float l1, const float p2, const float l22); + float boxesIntersection(const BoundingBox &b); + float boxesUnion(const BoundingBox &b); + + public: + + int uniqueTruthIndex = -1; + int truthFlag = 0; + float maxIoU = 0; + + float IoU(const BoundingBox &b); + void clear(); + + friend std::ostream& operator<<(std::ostream& os, const BoundingBox& bb); +}; + +std::ostream& operator<<(std::ostream& os, const BoundingBox& bb); +bool boxComparison (const BoundingBox& a,const BoundingBox& b) ; + +}} +#endif /*BOUNDINGBOX_H*/ + diff --git a/src/BoundingBox.cpp b/src/BoundingBox.cpp new file mode 100644 index 0000000..b92b2d8 --- /dev/null +++ b/src/BoundingBox.cpp @@ -0,0 +1,56 @@ +#include "BoundingBox.h" + +namespace tk { namespace dnn { + +float BoundingBox::overlap(const float p1, const float d1, const float p2, const float d2){ + float l1 = p1 - d1/2; + float l2 = p2 - d2/2; + float left = l1 > l2 ? l1 : l2; + float r1 = p1 + d1/2; + float r2 = p2 + d2/2; + float right = r1 < r2 ? r1 : r2; + return right - left; +} + +float BoundingBox::boxesIntersection(const BoundingBox &b){ + float width = this->overlap(x, w, b.x, b.w); + float height = this->overlap(y, h, b.y, b.h); + if(width < 0 || height < 0) + return 0; + float area = width*height; + return area; +} + +float BoundingBox::boxesUnion(const BoundingBox &b){ + float i = this->boxesIntersection(b); + float u = w*h + b.w*b.h - i; + return u; +} + +float BoundingBox::IoU(const BoundingBox &b){ + float I = this->boxesIntersection(b); + float U = this->boxesUnion(b); + if (I == 0 || U == 0) + return 0; + return I / U; +} + +void BoundingBox::clear(){ + uniqueTruthIndex = -1; + truthFlag = 0; + maxIoU = 0; +} + +std::ostream& operator<<(std::ostream& os, const BoundingBox& bb){ + os <<"w: "<< bb.w << ", h: "<< bb.h << ", x: "<< bb.x << ", y: "<< bb.y << + ", cat: "<< bb.cl << ", conf: "<< bb.prob<< ", truth: "<< + bb.truthFlag<< ", assignedGT: "<< bb.uniqueTruthIndex<< + ", maxIoU: "<< bb.maxIoU<<"\n"; + return os; +} + +bool boxComparison (const BoundingBox& a,const BoundingBox& b) { + return (a.prob>b.prob); +} + +}} \ No newline at end of file