FLImaging 6.6.27.1
ComputationalGraphRegionProposalNetwork.h
1#pragma once
2
3#if _MSC_VER >= 1900 && defined(_M_X64)
4
5#include "DefinitionsAI.h"
6#include "ComputationalGraph.h"
7#include "Tensor.h"
8#include "BackendBCEWithLogistLoss.h"
9#include "BackendSmoothL1Loss.h"
10#include "BackendConcatenate.h"
11#include "BackendLabel.h"
12
13#include <vector>
14#include <utility>
15#include <functional>
16#include <map>
17
18//#define RPN_TEST
19
20namespace FLImaging
21{
22 namespace AI
23 {
24 template <typename T>
25 class FL_EXPORT CComputationalGraphRegionProposalNetwork : public CComputationalGraph<T>
26 {
27 private:
28 CComputationalGraphRegionProposalNetwork();
29
30 protected:
31 CComputationalGraphRegionProposalNetwork(const CComputationalGraphRegionProposalNetwork<T>& cg);
32
33 public:
34 CComputationalGraphRegionProposalNetwork(const CComputationalBase<T>& cbOperand, const std::vector<int64_t>* pAnchorSizeOrNull = nullptr, const std::vector<float>* pAspectRatioOrNull = nullptr);
35 CComputationalGraphRegionProposalNetwork(const std::initializer_list<const CComputationalBase<T>*>& cbOperands, const std::vector<int64_t>* pAnchorSizeOrNull = nullptr, const std::vector<float>* pAspectRatioOrNull = nullptr);
36 CComputationalGraphRegionProposalNetwork(const std::vector<const CComputationalBase<T>*>& vctOperands, const std::vector<int64_t>* pAnchorSizeOrNull = nullptr, const std::vector<float>* pAspectRatioOrNull = nullptr);
37
38 virtual ~CComputationalGraphRegionProposalNetwork();
39
40 virtual CTensor<T>& Forward() override;
41 virtual CTensor<T>* Backward() override;
42 virtual CComputationalBase<T>* Clone() const override;
43
44 virtual const std::vector<int64_t>& GetEstimatedShape(bool bRecursive = true) const override;
45
46 virtual const CResult SetForegroundIoUThreshold(T tThreshold);
47 virtual T GetForegroundIoUThreshold() const;
48
49 virtual const CResult SetBackgroundIoUThreshold(T tThreshold);
50 virtual T GetBackgroundIoUThreshold() const;
51
52 virtual const CResult SetLearningPreNMSTopN(int64_t i64PreNMSTopN);
53 virtual T GetLearningPreNMSTopN() const;
54 virtual const CResult SetLearningPostNMSTopN(int64_t i64PostNMSTopN);
55 virtual T GetLearningPostNMSTopN() const;
56
57 virtual const CResult SetInferencePreNMSTopN(int64_t i64PreNMSTopN);
58 virtual T GetInferencePreNMSTopN() const;
59 virtual const CResult SetInferencePostNMSTopN(int64_t i64PostNMSTopN);
60 virtual T GetInferencePostNMSTopN() const;
61
62 virtual const CResult SetNMSThreshold(T tNMSThreshold);
63 virtual T GetNMSThreshold() const;
64 virtual const CResult SetScoreThreshold(T tScoreThreshold);
65 virtual T GetScoreThreshold() const;
66
67 virtual const CResult SetAreaThreshold(T tAreaThreshold);
68 virtual T GetAreaThreshold() const;
69
70 virtual const CResult SetInputSize(const std::vector<int64_t>& vctInputSize);
71 virtual const std::vector<int64_t>& GetInputSize() const;
72
73 virtual const CResult SetAnchorSize(const std::vector<int64_t>& vctAnchorSize);
74 virtual const std::vector<int64_t>& GetAnchorSize() const;
75
76 virtual const CResult SetAspectRatio(const std::vector<float>& vctAspectRatio);
77 virtual const std::vector<float>& GetAspectRatio() const;
78
79 virtual const CResult EnableRevertAngle(bool bRevertAngle);
80 virtual bool IsRevertAngleEnable() const;
81
82 virtual const CResult EnableClipBox(bool bClipBox);
83 virtual bool IsClipBoxEnable() const;
84
85 virtual const std::vector<CTensor<T>>& GetTargetBoxes() const;
86 virtual const std::vector<CTensor<T>>& GetTargetLabels() const;
87 virtual const CResult SetAddGradientCount(int64_t i64AddGradientCount) override;
88
89 virtual T GetBoxLoss() const;
90 virtual T GetScoreLoss() const;
91
92 virtual int64_t GetFeatureCount() const;
93
94 #ifdef RPN_TEST
95 virtual CTensor<T>& GetFilterProposalResultBoxes();
96 #endif
97 virtual CTensor<T>& GetFilterProposalResultScores();
98 #ifdef RPN_TEST
99 virtual const CResult SetTargetBoxes(const std::vector<CTensor<T>>& tsrTraget);
100 virtual const CResult SetObjectnessTsr(const CTensor<T>* pTsrObjectness);
101 virtual const CResult SetProposalTsr(const CTensor<T>* pTsrProposal);
102 #endif
103 DeclareGetClassType();
104 SupportToDuplicateObjectWithoutCreateNewObject(CComputationalGraphRegionProposalNetwork, *this);
105
106 public:
107 virtual const CResult PrintNodeParamInfo() const;
108 virtual const CResult GetBinaryData(Base::CFLData& fldBinary, bool bSuperClass = false, int32_t i32Version = -1, bool bDumpMode = false) const override;
109 virtual const CResult GetBinaryData(Base::CFLData* pFldBinary, bool bSuperClass = false, int32_t i32Version = -1, bool bDumpMode = false) const override;
110
111 virtual const CResult SetBinaryData(const Base::CFLData& fldBinary, int64_t* pI64Offset = nullptr) override;
112 virtual const CResult SetBinaryData(const Base::CFLData* pFldBinary, int64_t* pI64Offset = nullptr) override;
113
114 virtual int64_t GetRequiredDedicatedMemory(bool bTraining = false, bool bRecursively = true, int64_t i64BatchSize = 1) const override;
115
116 protected:
117 virtual const CResult RPNConstructor(const std::vector<const CComputationalBase<T>*>& vctOperands);
118 virtual const CResult GenerateAnchors();
119 virtual const CResult ForwardOfAnchor();
120 virtual const CResult GenerateHead(const std::vector<const CComputationalBase<T>*>& vctOperands);
121 virtual const CResult ConcatBoxPredictionLayers(const std::vector<CComputationalBase<T>*>& vctObjectness, const std::vector<CComputationalBase<T>*>& vctPredictionBBoxDeltas, CTensor<T>* pTsrResultObjectness, CTensor<T>* pTsrResultBoxRegression);
122
123 virtual const CResult ConcatBoxPredictionLayersBackward(const CTensor<T>* pTsrConcatObjectnessDy, const CTensor<T>* pTsrConcatBBoxDeltasDy, std::vector<CComputationalBase<T>*>& vctObjectness, std::vector<CComputationalBase<T>*>& vctPredictionBBoxDeltas);
124
125 virtual const CResult FilterProposals(const CTensor<T>* pTsrProposals, const CTensor<T>* pTsrObjectness, const std::vector<std::pair<int64_t, int64_t>>& vctImageSizes, const std::vector<int64_t>& vctAnchors, CTensor<T>* pTsrResultBoxes, CTensor<T>* pTsrResultScores, CTensor<T>* pTsrBuffer);
126 virtual const CResult AssignTargetsToAnchors(const CTensor<T>* pTsrAnchor, const std::vector<CTensor<T>>& vctTsrTargets, CTensor<T>* pTsrResultMatchedLabel, CTensor<T>* pTsrResultAnchorMatchedTarget);
127 virtual const CResult ComputeLoss(const CTensor<T>* pTsrObjenctness, const CTensor<T>* pTsrPredBBoxDeltas, const CTensor<T>* pTsrLabel, const CTensor<T>* pTsrRegressionTargets);
128 virtual const CResult ComputeLossBackward(CTensor<T>* pTsrObjectness, CTensor<T>* pTsrPredBBoxDeltas, CTensor<T>* pTsrObjectnessDx, CTensor<T>* pTsrPredBBoxDeltasDx);
129
130 virtual const CResult IntializeMemberTensor();
131 virtual std::vector<int64_t> GetAnchorShape() const;
132
133 virtual const CResult CreateTargetBuffer();
134
135 virtual const CResult GetFeaturesVector(std::vector<CComputationalBase<T>*>& vctFeatures);
136
137 #ifdef RPN_TEST
138 public:
139 CTensor<T>* m_pTsrObjecntessPy;
140 CTensor<T>* m_pTsrProposalPy;
141 #else
142 protected:
143 #endif
144 T m_tForegroundIoUThreshold;
145 T m_tBackgroundIoUThreshold;
146 int64_t m_i64LearningPreNMSTopN;
147 int64_t m_i64LearningPostNMSTopN;
148 int64_t m_i64InferencePreNMSTopN;
149 int64_t m_i64InferencePostNMSTopN;
150
151 T m_tNMSThreshold;
152 T m_tScoreThreshold;
153 T m_tAreaThreshold;
154 bool m_bRevertAngle;
155 bool m_bClipBox;
156
157 std::vector<int64_t>& m_vctImageSize;
158 std::vector<int64_t>& m_vctAnchorSize;
159 std::vector<float>& m_vctAspectRatio;
160
161 std::vector<CTensor<T>>& m_vctTsrTargetBoxes;
162 std::vector<CTensor<T>>& m_vctTsrTargetLabels;
163
164 CTensor<T> m_tsrBaseAnchor;
165 CTensor<T> m_tsrAnchor;
166 CTensor<T> m_tsrConcatResultObjectness;
167 CTensor<T> m_tsrConcatResultBoxDeltas;
168 CTensor<T> m_tsrDecodeResultProposal;
169 CTensor<T> m_tsrFilterProposalResultScore;
170 #ifdef RPN_TEST
171 CTensor<T> m_tsrFilterProposalResultBoxes;
172 #endif
173 CTensor<T> m_tsrBuffer;
174 CTensor<T> m_tsrAssignTargetResultLabels;
175 CTensor<T> m_tsrAssignTargetResultGTBoxes;
176 CTensor<T> m_tsrEncodeResultRegressionTarget;
177
178 CBackendBCEWithLogistLoss<T> m_backendBCEWithLogistLoss;
179 CBackendSmoothL1Loss<T> m_backendSmoothL1Loss;
180 CBackendConcatenate<T> m_backendConcatenate;
181 CBackendLabel<T> m_backendLabel;
182
183 std::vector<uint32_t>& m_vctPositiveIndexes;
184 std::vector<uint32_t>& m_vctPositiveNegativeIndexes;
185
186 CTensor<T> m_tsrObjectnessSelected;
187 CTensor<T> m_tsrPredBBoxDeltasSelected;
188 CTensor<T> m_tsrLabelSelected;
189 CTensor<T> m_tsrTargetRegressionSelected;
190 CTensor<T> m_tsrObjectnessLoss;
191 CTensor<T> m_tsrBoxLoss;
192
193 CTensor<T> m_tsrTargetBuffer;
194
195 T m_tBoxLoss;
196 T m_tScoreLoss;
197
198 std::vector<CTensor<T>>& m_vctObjectnessPermute;
199 std::vector<CTensor<T>>& m_vctBBoxDeltasPermute;
200
201 public:
202 DeclareGetSignletonObject(CComputationalGraphRegionProposalNetwork);
203 };
204
205 #define CCGFRegionProposalNetwork(...) (*(new CComputationalGraphRegionProposalNetwork<float>(__VA_ARGS__)))
206 #define CCGDRegionProposalNetwork(...) (*(new CComputationalGraphRegionProposalNetwork<double>(__VA_ARGS__)))
207 #define CCGTRegionProposalNetwork(T, ...) (*(new CComputationalGraphRegionProposalNetwork<T>(__VA_ARGS__)))
208
209 }
210}
211
212#endif
Definition AlgorithmAIBase.h:16