Merge pull request !5807 from wangzhe/mastertags/v1.0.0
| @@ -33,6 +33,8 @@ typedef struct DetectionPostProcessParameter { | |||||
| bool use_regular_nms_; | bool use_regular_nms_; | ||||
| bool out_quantized_; | bool out_quantized_; | ||||
| float *anchors_; | |||||
| void *decoded_boxes_; | void *decoded_boxes_; | ||||
| void *nms_candidate_; | void *nms_candidate_; | ||||
| void *selected_; | void *selected_; | ||||
| @@ -44,15 +44,15 @@ float IntersectionOverUnion(const BboxCorner *a, const BboxCorner *b) { | |||||
| const float h = ymax - ymin > 0.0f ? ymax - ymin : 0.0f; | const float h = ymax - ymin > 0.0f ? ymax - ymin : 0.0f; | ||||
| const float w = xmax - xmin > 0.0f ? xmax - xmin : 0.0f; | const float w = xmax - xmin > 0.0f ? xmax - xmin : 0.0f; | ||||
| const float inter = h * w; | const float inter = h * w; | ||||
| return inter / (area_a + area_b - inter + 1e-8); | |||||
| return inter / (area_a + area_b - inter); | |||||
| } | } | ||||
| void DecodeBoxes(const int num_boxes, const float *input_boxes, const float *anchors, const BboxCenter scaler, | void DecodeBoxes(const int num_boxes, const float *input_boxes, const float *anchors, const BboxCenter scaler, | ||||
| float *decoded_boxes) { | float *decoded_boxes) { | ||||
| for (int i = 0; i < num_boxes; ++i) { | for (int i = 0; i < num_boxes; ++i) { | ||||
| BboxCenter *box = (BboxCenter *)(input_boxes + i * 4); | |||||
| BboxCenter *anchor = (BboxCenter *)(anchors + i * 4); | |||||
| BboxCorner *decoded_box = (BboxCorner *)(decoded_boxes + i * 4); | |||||
| BboxCenter *box = (BboxCenter *)(input_boxes) + i; | |||||
| BboxCenter *anchor = (BboxCenter *)(anchors) + i; | |||||
| BboxCorner *decoded_box = (BboxCorner *)(decoded_boxes) + i; | |||||
| float y_center = box->y / scaler.y * anchor->h + anchor->y; | float y_center = box->y / scaler.y * anchor->h + anchor->y; | ||||
| float x_center = box->x / scaler.x * anchor->w + anchor->x; | float x_center = box->x / scaler.x * anchor->w + anchor->x; | ||||
| float h_half = 0.5f * expf(box->h / scaler.h) * anchor->h; | float h_half = 0.5f * expf(box->h / scaler.h) * anchor->h; | ||||
| @@ -137,7 +137,7 @@ int NmsMultiClassesRegular(const int num_boxes, const int num_classes_with_bg, c | |||||
| const int class_index = score_with_index_all[i].index - box_index * num_classes_with_bg - first_class_index; | const int class_index = score_with_index_all[i].index - box_index * num_classes_with_bg - first_class_index; | ||||
| *((BboxCorner *)(output_boxes) + i) = *((BboxCorner *)(decoded_boxes) + box_index); | *((BboxCorner *)(output_boxes) + i) = *((BboxCorner *)(decoded_boxes) + box_index); | ||||
| output_classes[i] = (float)class_index; | output_classes[i] = (float)class_index; | ||||
| output_scores[i] = score_with_index_all[i].score;; | |||||
| output_scores[i] = score_with_index_all[i].score; | |||||
| } else { | } else { | ||||
| ((BboxCorner *)(output_boxes) + i)->ymin = 0; | ((BboxCorner *)(output_boxes) + i)->ymin = 0; | ||||
| ((BboxCorner *)(output_boxes) + i)->xmin = 0; | ((BboxCorner *)(output_boxes) + i)->xmin = 0; | ||||
| @@ -26,7 +26,32 @@ using mindspore::lite::RET_OK; | |||||
| using mindspore::schema::PrimitiveType_DetectionPostProcess; | using mindspore::schema::PrimitiveType_DetectionPostProcess; | ||||
| namespace mindspore::kernel { | namespace mindspore::kernel { | ||||
| int DetectionPostProcessCPUKernel::Init() { return RET_OK; } | |||||
| int DetectionPostProcessCPUKernel::Init() { | |||||
| MS_ASSERT(context_->allocator != nullptr); | |||||
| auto anchor_tensor = in_tensors_.at(2); | |||||
| DetectionPostProcessParameter *parameter = reinterpret_cast<DetectionPostProcessParameter *>(op_parameter_); | |||||
| if (anchor_tensor->data_type() == kNumberTypeUInt8) { | |||||
| const auto quant_params = anchor_tensor->GetQuantParams(); | |||||
| const double scale = quant_params.at(0).scale; | |||||
| const int32_t zp = quant_params.at(0).zeroPoint; | |||||
| auto anchor_uint8 = reinterpret_cast<uint8_t *>(anchor_tensor->Data()); | |||||
| auto anchor_fp32 = | |||||
| reinterpret_cast<float *>(context_->allocator->Malloc(anchor_tensor->ElementsNum() * sizeof(float))); | |||||
| for (int i = 0; i < anchor_tensor->ElementsNum(); ++i) { | |||||
| *(anchor_fp32 + i) = static_cast<float>((static_cast<int>(anchor_uint8[i]) - zp) * scale); | |||||
| } | |||||
| parameter->anchors_ = anchor_fp32; | |||||
| } else if (anchor_tensor->data_type() == kNumberTypeFloat32) { | |||||
| auto anchor_fp32 = reinterpret_cast<float *>(anchor_tensor->Data()); | |||||
| for (int i = 0; i < anchor_tensor->ElementsNum(); ++i) { | |||||
| parameter->anchors_[i] = anchor_fp32[i]; | |||||
| } | |||||
| } else { | |||||
| MS_LOG(ERROR) << "unsupported anchor data type " << anchor_tensor->data_type(); | |||||
| return RET_ERROR; | |||||
| } | |||||
| return RET_OK; | |||||
| } | |||||
| int DetectionPostProcessCPUKernel::ReSize() { return RET_OK; } | int DetectionPostProcessCPUKernel::ReSize() { return RET_OK; } | ||||
| @@ -38,7 +63,6 @@ int DetectionPostProcessCPUKernel::Run() { | |||||
| } | } | ||||
| auto input_boxes = reinterpret_cast<float *>(in_tensors_.at(0)->Data()); | auto input_boxes = reinterpret_cast<float *>(in_tensors_.at(0)->Data()); | ||||
| auto input_scores = reinterpret_cast<float *>(in_tensors_.at(1)->Data()); | auto input_scores = reinterpret_cast<float *>(in_tensors_.at(1)->Data()); | ||||
| auto input_anchors = reinterpret_cast<float *>(in_tensors_.at(2)->Data()); | |||||
| // output_classes and output_num use float type now | // output_classes and output_num use float type now | ||||
| auto output_boxes = reinterpret_cast<float *>(out_tensors_.at(0)->Data()); | auto output_boxes = reinterpret_cast<float *>(out_tensors_.at(0)->Data()); | ||||
| @@ -61,7 +85,7 @@ int DetectionPostProcessCPUKernel::Run() { | |||||
| parameter->score_with_class_all_ = | parameter->score_with_class_all_ = | ||||
| context_->allocator->Malloc((num_boxes * parameter->num_classes_) * sizeof(ScoreWithIndex)); | context_->allocator->Malloc((num_boxes * parameter->num_classes_) * sizeof(ScoreWithIndex)); | ||||
| } | } | ||||
| DetectionPostProcess(num_boxes, num_classes_with_bg, input_boxes, input_scores, input_anchors, output_boxes, | |||||
| DetectionPostProcess(num_boxes, num_classes_with_bg, input_boxes, input_scores, parameter->anchors_, output_boxes, | |||||
| output_classes, output_scores, output_num, parameter); | output_classes, output_scores, output_num, parameter); | ||||
| context_->allocator->Free(parameter->decoded_boxes_); | context_->allocator->Free(parameter->decoded_boxes_); | ||||
| context_->allocator->Free(parameter->nms_candidate_); | context_->allocator->Free(parameter->nms_candidate_); | ||||
| @@ -56,9 +56,13 @@ void DetectionPostProcessTestInit(std::vector<lite::tensor::Tensor *> *inputs_, | |||||
| std::string input_anchors_path = "./test_data/detectionPostProcess/input_anchors.bin"; | std::string input_anchors_path = "./test_data/detectionPostProcess/input_anchors.bin"; | ||||
| size_t input_anchors_size; | size_t input_anchors_size; | ||||
| auto input_anchors_data = | auto input_anchors_data = | ||||
| reinterpret_cast<float *>(mindspore::lite::ReadFile(input_anchors_path.c_str(), &input_anchors_size)); | |||||
| reinterpret_cast<uint8_t *>(mindspore::lite::ReadFile(input_anchors_path.c_str(), &input_anchors_size)); | |||||
| auto *input_anchors = new lite::tensor::Tensor; | auto *input_anchors = new lite::tensor::Tensor; | ||||
| input_anchors->set_data_type(kNumberTypeFloat32); | |||||
| lite::tensor::QuantArg quant_arg; | |||||
| quant_arg.zeroPoint = 0; | |||||
| quant_arg.scale = 0.00645306; | |||||
| input_anchors->AddQuantParam(quant_arg); | |||||
| input_anchors->set_data_type(kNumberTypeUInt8); | |||||
| input_anchors->SetFormat(schema::Format_NHWC); | input_anchors->SetFormat(schema::Format_NHWC); | ||||
| input_anchors->set_shape({1917, 4}); | input_anchors->set_shape({1917, 4}); | ||||
| input_anchors->MallocData(); | input_anchors->MallocData(); | ||||