github.com/instill-ai/component@v0.16.0-beta/pkg/connector/instill/v0/keypoint_detection.go (about) 1 package instill 2 3 import ( 4 "context" 5 "fmt" 6 7 "google.golang.org/grpc/metadata" 8 "google.golang.org/protobuf/encoding/protojson" 9 "google.golang.org/protobuf/types/known/structpb" 10 11 "github.com/instill-ai/component/pkg/base" 12 modelPB "github.com/instill-ai/protogen-go/model/model/v1alpha" 13 ) 14 15 func (e *execution) executeKeyPointDetection(grpcClient modelPB.ModelPublicServiceClient, modelName string, inputs []*structpb.Struct) ([]*structpb.Struct, error) { 16 if len(inputs) <= 0 { 17 return nil, fmt.Errorf("invalid input: %v for model: %s", inputs, modelName) 18 } 19 taskInputs := []*modelPB.TaskInput{} 20 for _, input := range inputs { 21 inputJSON, err := protojson.Marshal(input) 22 if err != nil { 23 return nil, err 24 } 25 keypointInput := &modelPB.KeypointInput{} 26 err = protojson.UnmarshalOptions{DiscardUnknown: true}.Unmarshal(inputJSON, keypointInput) 27 if err != nil { 28 return nil, err 29 } 30 keypointInput.Type = &modelPB.KeypointInput_ImageBase64{ 31 ImageBase64: base.TrimBase64Mime(keypointInput.GetImageBase64()), 32 } 33 34 taskInput := &modelPB.TaskInput_Keypoint{ 35 Keypoint: keypointInput, 36 } 37 taskInputs = append(taskInputs, &modelPB.TaskInput{Input: taskInput}) 38 } 39 40 req := modelPB.TriggerUserModelRequest{ 41 Name: modelName, 42 TaskInputs: taskInputs, 43 } 44 ctx := metadata.NewOutgoingContext(context.Background(), getRequestMetadata(e.SystemVariables)) 45 res, err := grpcClient.TriggerUserModel(ctx, &req) 46 if err != nil || res == nil { 47 return nil, err 48 } 49 taskOutputs := res.GetTaskOutputs() 50 if len(taskOutputs) <= 0 { 51 return nil, fmt.Errorf("invalid output: %v for model: %s", taskOutputs, modelName) 52 } 53 outputs := []*structpb.Struct{} 54 for idx := range inputs { 55 keyPointOutput := taskOutputs[idx].GetKeypoint() 56 if keyPointOutput == nil { 57 return nil, fmt.Errorf("invalid output: %v for model: %s", keyPointOutput, modelName) 58 } 59 outputJSON, err := protojson.MarshalOptions{ 60 UseProtoNames: true, 61 EmitUnpopulated: true, 62 }.Marshal(keyPointOutput) 63 if err != nil { 64 return nil, err 65 } 66 output := &structpb.Struct{} 67 err = protojson.Unmarshal(outputJSON, output) 68 if err != nil { 69 return nil, err 70 } 71 outputs = append(outputs, output) 72 73 } 74 75 return outputs, nil 76 }