| 21 | namespace data { |
| 22 | |
| 23 | void COCOParser::Parse(BatchType& batch_data, user_op::KernelComputeContext* ctx) { |
| 24 | user_op::Tensor* image_tensor = ctx->Tensor4ArgNameAndIndex("image", 0); |
| 25 | CHECK_NOTNULL(image_tensor); |
| 26 | user_op::Tensor* image_id_tensor = ctx->Tensor4ArgNameAndIndex("image_id", 0); |
| 27 | user_op::Tensor* image_size_tensor = ctx->Tensor4ArgNameAndIndex("image_size", 0); |
| 28 | user_op::Tensor* bbox_tensor = ctx->Tensor4ArgNameAndIndex("gt_bbox", 0); |
| 29 | user_op::Tensor* label_tensor = ctx->Tensor4ArgNameAndIndex("gt_label", 0); |
| 30 | user_op::Tensor* segm_tensor = ctx->Tensor4ArgNameAndIndex("gt_segm", 0); |
| 31 | user_op::Tensor* segm_index_tensor = ctx->Tensor4ArgNameAndIndex("gt_segm_index", 0); |
| 32 | |
| 33 | MultiThreadLoop(batch_data.size(), [&](size_t i) { |
| 34 | TensorBuffer* image_buffer = image_tensor->mut_dptr<TensorBuffer>() + i; |
| 35 | COCOImage& image = batch_data[i]; |
| 36 | image_buffer->Swap(image.data); |
| 37 | if (image_size_tensor) { |
| 38 | auto* image_size_ptr = image_size_tensor->mut_dptr<int32_t>() + i * 2; |
| 39 | image_size_ptr[0] = meta_->GetImageHeight(image.index); |
| 40 | image_size_ptr[1] = meta_->GetImageWidth(image.index); |
| 41 | } |
| 42 | if (image_id_tensor) { |
| 43 | auto* image_id_ptr = image_id_tensor->mut_dptr<int64_t>(); |
| 44 | image_id_ptr[i] = image.id; |
| 45 | } |
| 46 | if (bbox_tensor) { |
| 47 | TensorBuffer* bbox_buffer = bbox_tensor->mut_dptr<TensorBuffer>() + i; |
| 48 | const auto& bbox_vec = meta_->GetBboxVec<float>(image.index); |
| 49 | CHECK_EQ(bbox_vec.size() % 4, 0); |
| 50 | int64_t num_bboxes = bbox_vec.size() / 4; |
| 51 | bbox_buffer->Resize(Shape({num_bboxes, 4}), DataType::kFloat); |
| 52 | std::copy(bbox_vec.begin(), bbox_vec.end(), bbox_buffer->mut_data<float>()); |
| 53 | } |
| 54 | if (label_tensor) { |
| 55 | TensorBuffer* label_buffer = label_tensor->mut_dptr<TensorBuffer>() + i; |
| 56 | const auto& label_vec = meta_->GetLabelVec<int32_t>(image.index); |
| 57 | label_buffer->Resize(Shape({static_cast<int64_t>(label_vec.size())}), DataType::kInt32); |
| 58 | std::copy(label_vec.begin(), label_vec.end(), label_buffer->mut_data<int32_t>()); |
| 59 | } |
| 60 | if (segm_tensor && segm_index_tensor) { |
| 61 | TensorBuffer* segm_buffer = segm_tensor->mut_dptr<TensorBuffer>() + i; |
| 62 | TensorBuffer* segm_index_buffer = segm_index_tensor->mut_dptr<TensorBuffer>() + i; |
| 63 | meta_->ReadSegmentationsToTensorBuffer<float>(image.index, segm_buffer, segm_index_buffer); |
| 64 | } |
| 65 | }); |
| 66 | // dynamic batch size |
| 67 | if (image_tensor->shape_view().elem_cnt() != batch_data.size()) { |
| 68 | CHECK_EQ(image_tensor->shape_view().NumAxes(), 1); |
| 69 | image_tensor->mut_shape_view().Set(0, batch_data.size()); |
| 70 | } |
| 71 | if (image_id_tensor && image_id_tensor->shape_view().At(0) != batch_data.size()) { |
| 72 | image_id_tensor->mut_shape_view().Set(0, batch_data.size()); |
| 73 | } |
| 74 | if (image_size_tensor && image_size_tensor->shape_view().At(0) != batch_data.size()) { |
| 75 | image_size_tensor->mut_shape_view().Set(0, batch_data.size()); |
| 76 | } |
| 77 | if (bbox_tensor && bbox_tensor->shape_view().elem_cnt() != batch_data.size()) { |
| 78 | CHECK_EQ(bbox_tensor->shape_view().NumAxes(), 1); |
| 79 | bbox_tensor->mut_shape_view().Set(0, batch_data.size()); |
| 80 | } |
no test coverage detected