1 #ifndef _NNDEPLOY_DETECT_CLASSIFIER_OCR_OCR_H_
2 #define _NNDEPLOY_DETECT_CLASSIFIER_OCR_OCR_H_
47 std::vector<int> cls_image_shape_ = {3, 48, 192};
50 bool normalize_ =
true;
51 float scale_[3] = {1.0f / 255.0f, 1.0f / 255.0f, 1.0f / 255.0f};
52 float mean_[3] = {0.0f, 0.0f, 0.0f};
53 float std_[3] = {1.0f, 1.0f, 1.0f};
64 rapidjson::Value &json,
65 rapidjson::Document::AllocatorType &allocator)
override {
67 json.AddMember(
"src_pixel_type_",
68 rapidjson::Value(src_pixel_type_str.c_str(), allocator),
71 json.AddMember(
"dst_pixel_type_",
72 rapidjson::Value(dst_pixel_type_str.c_str(), allocator),
75 json.AddMember(
"interp_type_",
76 rapidjson::Value(interp_type_str.c_str(), allocator),
79 json.AddMember(
"data_type_",
80 rapidjson::Value(data_type_str.c_str(), allocator),
83 json.AddMember(
"data_format_",
84 rapidjson::Value(data_format_str.c_str(), allocator),
86 json.AddMember(
"h_", h_, allocator);
87 json.AddMember(
"w_", w_, allocator);
88 json.AddMember(
"normalize_", normalize_, allocator);
90 rapidjson::Value cls_image_shape(rapidjson::kArrayType);
91 for (
int i = 0; i < 3; i++) {
92 cls_image_shape.PushBack(cls_image_shape_[i], allocator);
94 json.AddMember(
"cls_image_shape_", cls_image_shape, allocator);
96 rapidjson::Value scale_array(rapidjson::kArrayType);
97 rapidjson::Value mean_array(rapidjson::kArrayType);
98 rapidjson::Value std_array(rapidjson::kArrayType);
99 for (
int i = 0; i < 3; i++) {
100 scale_array.PushBack(scale_[i], allocator);
101 mean_array.PushBack(mean_[i], allocator);
102 std_array.PushBack(std_[i], allocator);
104 json.AddMember(
"scale_", scale_array, allocator);
105 json.AddMember(
"mean_", mean_array, allocator);
106 json.AddMember(
"std_", std_array, allocator);
109 json.AddMember(
"border_type_",
110 rapidjson::Value(border_type_str.c_str(), allocator),
112 json.AddMember(
"top_", top_, allocator);
113 json.AddMember(
"bottom_", bottom_, allocator);
114 json.AddMember(
"left_", left_, allocator);
115 json.AddMember(
"right_", right_, allocator);
117 rapidjson::Value border_val_array(rapidjson::kArrayType);
118 for (
int i = 0; i < 4; i++) {
119 border_val_array.PushBack(border_val_.
val_[i], allocator);
121 json.AddMember(
"border_val_", border_val_array, allocator);
128 if (json.HasMember(
"src_pixel_type_") &&
129 json[
"src_pixel_type_"].IsString()) {
133 if (json.HasMember(
"dst_pixel_type_") &&
134 json[
"dst_pixel_type_"].IsString()) {
138 if (json.HasMember(
"interp_type_") && json[
"interp_type_"].IsString()) {
141 if (json.HasMember(
"data_type_") && json[
"data_type_"].IsString()) {
144 if (json.HasMember(
"data_format_") && json[
"data_format_"].IsString()) {
147 if (json.HasMember(
"h_") && json[
"h_"].IsInt()) {
148 h_ = json[
"h_"].GetInt();
150 if (json.HasMember(
"w_") && json[
"w_"].IsInt()) {
151 w_ = json[
"w_"].GetInt();
153 if (json.HasMember(
"normalize_") && json[
"normalize_"].IsBool()) {
154 normalize_ = json[
"normalize_"].GetBool();
157 if (json.HasMember(
"cls_image_shape_") &&
158 json[
"cls_image_shape_"].IsArray()) {
159 const rapidjson::Value &cls_image_shape_array = json[
"cls_image_shape_"];
160 for (
int i = 0; i < 3 && i < cls_image_shape_array.Size(); i++) {
161 if (cls_image_shape_array[i].IsInt()) {
162 cls_image_shape_[i] = cls_image_shape_array[i].GetInt();
167 if (json.HasMember(
"scale_") && json[
"scale_"].IsArray()) {
168 const rapidjson::Value &scale_array = json[
"scale_"];
169 for (
int i = 0; i < 3 && i < scale_array.Size(); i++) {
170 if (scale_array[i].IsFloat()) {
171 scale_[i] = scale_array[i].GetFloat();
175 if (json.HasMember(
"mean_") && json[
"mean_"].IsArray()) {
176 const rapidjson::Value &mean_array = json[
"mean_"];
177 for (
int i = 0; i < 3 && i < mean_array.Size(); i++) {
178 if (mean_array[i].IsFloat()) {
179 mean_[i] = mean_array[i].GetFloat();
183 if (json.HasMember(
"std_") && json[
"std_"].IsArray()) {
184 const rapidjson::Value &std_array = json[
"std_"];
185 for (
int i = 0; i < 3 && i < std_array.Size(); i++) {
186 if (std_array[i].IsFloat()) {
187 std_[i] = std_array[i].GetFloat();
192 if (json.HasMember(
"border_type_") && json[
"border_type_"].IsString()) {
195 if (json.HasMember(
"top_") && json[
"top_"].IsInt()) {
196 top_ = json[
"top_"].GetInt();
198 if (json.HasMember(
"bottom_") && json[
"bottom_"].IsInt()) {
199 bottom_ = json[
"bottom_"].GetInt();
201 if (json.HasMember(
"left_") && json[
"left_"].IsInt()) {
202 left_ = json[
"left_"].GetInt();
204 if (json.HasMember(
"right_") && json[
"right_"].IsInt()) {
205 right_ = json[
"right_"].GetInt();
208 if (json.HasMember(
"border_val_") && json[
"border_val_"].IsArray()) {
209 const rapidjson::Value &border_val_array = json[
"border_val_"];
210 for (
int i = 0; i < 4 && i < border_val_array.Size(); i++) {
211 if (border_val_array[i].IsFloat()) {
212 border_val_.
val_[i] = border_val_array[i].GetFloat();
224 key_ =
"nndeploy::ocr::ClassifierPreProcess";
226 "ocr classify preprocess cv::Mat to "
227 "device::Tensor[resize->pad->normalize->transpose]";
228 param_ = std::make_shared<ClassifierPreProcessParam>();
229 this->setInputTypeInfo<OCRResult>();
230 this->setOutputTypeInfo<device::Tensor>();
233 std::vector<dag::Edge *> outputs)
234 : dag::Node(name, inputs, outputs) {
235 key_ =
"nndeploy::ocr::ClassifierPreProcess";
237 "ocr classify preprocess cv::Mat to "
238 "device::Tensor[resize->pad->normalize->transpose]";
239 param_ = std::make_shared<ClassifierPreProcessParam>();
240 this->setInputTypeInfo<OCRResult>();
241 this->setOutputTypeInfo<device::Tensor>();
251 float cls_thresh_ = 0.9;
255 rapidjson::Document::AllocatorType &allocator);
263 key_ =
"nndeploy::ocr::ClassifierPostProcess";
264 desc_ =
"PPOcrClsv2 postprocess[device::Tensor->OcrResult]";
265 param_ = std::make_shared<ClassifierPostParam>();
266 this->setInputTypeInfo<device::Tensor>();
267 this->setOutputTypeInfo<OCRResult>();
270 std::vector<dag::Edge *> inputs,
271 std::vector<dag::Edge *> outputs)
272 : dag::Node(name, inputs, outputs) {
273 key_ =
"nndeploy::ocr::ClassifierPostProcess";
274 desc_ =
"PPOcrClsv2 postprocess[device::Tensor->OcrResult]";
275 param_ = std::make_shared<ClassifierPostParam>();
276 this->setInputTypeInfo<device::Tensor>();
277 this->setOutputTypeInfo<OCRResult>();
310 key_ =
"nndeploy::ocr::ClassifierGraph";
312 "PPOcrClsV2 graph[cv::Mat->preprocess->infer->postprocess->OcrResult]";
313 this->setInputTypeInfo<OCRResult>();
314 this->setOutputTypeInfo<OCRResult>();
316 this->createNode<ClassifierPreProcess>(
"preprocess"));
318 dynamic_cast<infer::Infer *
>(this->createNode<infer::Infer>(
"infer"));
320 this->createNode<ClassifierPostProcess>(
"postprocess"));
324 std::vector<dag::Edge *> outputs)
325 : dag::Graph(name, inputs, outputs) {
326 key_ =
"nndeploy::ocr::ClassifierGraph";
328 "PPOcrClsV2 graph[cv::Mat->preprocess->infer->postprocess->OcrResult]";
329 this->setInputTypeInfo<OCRResult>();
330 this->setOutputTypeInfo<OCRResult>();
332 this->createNode<ClassifierPreProcess>(
"preprocess"));
334 dynamic_cast<infer::Infer *
>(this->createNode<infer::Infer>(
"infer"));
336 this->createNode<ClassifierPostProcess>(
"postprocess"));
345 this->setNodeDesc(pre_, pre_desc);
346 this->setNodeDesc(infer_, infer_desc);
347 this->setNodeDesc(post_, post_desc);
348 this->defaultParam();
349 base::Status status = infer_->setInferenceType(inference_type);
373 base::Status status = infer_->setInferenceType(inference_type);
382 std::vector<std::string> &model_value) {
385 param->model_type_ = model_type;
386 param->is_path_ = is_path;
387 param->model_value_ = model_value;
409 std::vector<dag::Edge *>
forward(std::vector<dag::Edge *> inputs) {
410 inputs = (*pre_)(inputs);
411 inputs = (*infer_)(inputs);
412 std::vector<dag::Edge *> outputs = (*post_)(inputs);
virtual base::Status deserialize(rapidjson::Value &json)
virtual std::string serialize()
Template class for a 4-element vector. Scalar_ and Scalar can be used just as typical 4-element vecto...
Directed Acyclic Graph Node.
InferenceParam is the base class of all inference param.
base::DeviceType device_type_
virtual ~ClassifierGraph()
base::Status make(const dag::NodeDesc &pre_desc, const dag::NodeDesc &infer_desc, base::InferenceType inference_type, const dag::NodeDesc &post_desc)
std::vector< dag::Edge * > forward(std::vector< dag::Edge * > inputs)
base::Status setVersion(int version)
base::Status setInferParam(base::DeviceType device_type, base::ModelType model_type, bool is_path, std::vector< std::string > &model_value)
base::Status setInferenceType(base::InferenceType inference_type)
virtual base::Status defaultParam()
Set default parameters.
base::Status setClsThresh(float threshold)
ClassifierGraph(const std::string &name)
base::Status setSrcPixelType(base::PixelType pixel_type)
ClassifierGraph(const std::string &name, std::vector< dag::Edge * > inputs, std::vector< dag::Edge * > outputs)
virtual base::Status serialize(rapidjson::Value &json, rapidjson::Document::AllocatorType &allocator)
virtual base::Status deserialize(rapidjson::Value &json)
PostProcessor util_post_processor_
ClassifierPostProcess(const std::string &name)
ClassifierPostProcess(const std::string &name, std::vector< dag::Edge * > inputs, std::vector< dag::Edge * > outputs)
virtual ~ClassifierPostProcess()
virtual base::Status run()
Run node (pure virtual function)
virtual base::Status serialize(rapidjson::Value &json, rapidjson::Document::AllocatorType &allocator) override
base::InterpType interp_type_
base::PixelType src_pixel_type_
std::vector< int > cls_image_shape_
base::PixelType dst_pixel_type_
virtual base::Status deserialize(rapidjson::Value &json) override
virtual ~ClassifierPreProcess()
ClassifierPreProcess(const std::string &name)
virtual base::Status run()
Run node (pure virtual function)
ClassifierPreProcess(const std::string &name, std::vector< dag::Edge * > inputs, std::vector< dag::Edge * > outputs)
#define NNDEPLOY_LOGE(fmt,...)
#define NNDEPLOY_CC_API
api
std::string dataFormatToString(DataFormat data_format)
PixelType stringToPixelType(const std::string &pixel_type_str)
BorderType stringToBorderType(const std::string &border_type_str)
DataType stringToDataType(const std::string &str)
DataFormat stringToDataFormat(const std::string &str)
std::string borderTypeToString(BorderType border_type)
std::string dataTypeToString(DataType data_type)
DataType dataTypeOf< float >()
std::string pixelTypeToString(PixelType pixel_type)
std::string interpTypeToString(InterpType interp_type)
InterpType stringToInterpType(const std::string &interp_type_str)