From 8293d5659c27bf10c045d585c2a7cc63e72a94c7 Mon Sep 17 00:00:00 2001 From: Khari Jarrett Date: Mon, 8 Jan 2024 15:55:14 -0500 Subject: [PATCH 1/5] use nondeprecated constructor and weak deps --- services/mlmodel/mlmodel.go | 5 ++++ .../vision/colordetector/color_detector.go | 20 +++++++--------- .../detections_to_3dsegments.go | 24 +++++++++---------- services/vision/mlvision/ml_model.go | 24 +++++++++---------- .../vision/obstaclesdepth/obstacles_depth.go | 20 +++++++--------- .../obstaclesdistance/obstacles_distance.go | 19 +++++++-------- .../obstacles_pointcloud.go | 22 ++++++++--------- services/vision/vision.go | 12 +++++----- 8 files changed, 72 insertions(+), 74 deletions(-) diff --git a/services/mlmodel/mlmodel.go b/services/mlmodel/mlmodel.go index 200cf6f2098..7daf4d7ef3d 100644 --- a/services/mlmodel/mlmodel.go +++ b/services/mlmodel/mlmodel.go @@ -286,3 +286,8 @@ func Named(name string) resource.Name { func FromRobot(r robot.Robot, name string) (Service, error) { return robot.ResourceFromRobot[Service](r, Named(name)) } + +// FromDependencies is a helper for getting the named vision service from a collection of dependencies. +func FromDependencies(deps resource.Dependencies, name string) (Service, error) { + return resource.FromDependencies[Service](deps, Named(name)) +} diff --git a/services/vision/colordetector/color_detector.go b/services/vision/colordetector/color_detector.go index 468ad484c49..a35f3f92252 100644 --- a/services/vision/colordetector/color_detector.go +++ b/services/vision/colordetector/color_detector.go @@ -4,15 +4,14 @@ package colordetector import ( "context" + "go.viam.com/rdk/components/camera" "github.com/pkg/errors" "go.opencensus.io/trace" "go.viam.com/rdk/logging" "go.viam.com/rdk/resource" - "go.viam.com/rdk/robot" "go.viam.com/rdk/services/vision" - "go.viam.com/rdk/utils" objdet "go.viam.com/rdk/vision/objectdetection" ) @@ -20,18 +19,17 @@ var model = resource.DefaultModelFamily.WithModel("color_detector") func init() { resource.RegisterService(vision.API, model, resource.Registration[vision.Service, *objdet.ColorDetectorConfig]{ - DeprecatedRobotConstructor: func( - ctx context.Context, r any, c resource.Config, logger logging.Logger, + Constructor: func( + ctx context.Context, deps resource.Dependencies, c resource.Config, logger logging.Logger, ) (vision.Service, error) { attrs, err := resource.NativeConfig[*objdet.ColorDetectorConfig](c) if err != nil { return nil, err } - actualR, err := utils.AssertType[robot.Robot](r) - if err != nil { - return nil, err - } - return registerColorDetector(ctx, c.ResourceName(), attrs, actualR) + return registerColorDetector(ctx, c.ResourceName(), attrs, deps) + }, + WeakDependencies: []resource.Matcher{ + resource.SubtypeMatcher{Subtype: camera.SubtypeName}, }, }) } @@ -41,7 +39,7 @@ func registerColorDetector( ctx context.Context, name resource.Name, conf *objdet.ColorDetectorConfig, - r robot.Robot, + deps resource.Dependencies, ) (vision.Service, error) { _, span := trace.StartSpan(ctx, "service::vision::registerColorDetector") defer span.End() @@ -52,5 +50,5 @@ func registerColorDetector( if err != nil { return nil, errors.Wrapf(err, "error registering color detector %q", name) } - return vision.NewService(name, r, nil, nil, detector, nil) + return vision.NewService(name, deps, nil, nil, detector, nil) } diff --git a/services/vision/detectionstosegments/detections_to_3dsegments.go b/services/vision/detectionstosegments/detections_to_3dsegments.go index b7766578665..b6c48b3298f 100644 --- a/services/vision/detectionstosegments/detections_to_3dsegments.go +++ b/services/vision/detectionstosegments/detections_to_3dsegments.go @@ -4,6 +4,7 @@ package detectionstosegments import ( "context" + "go.viam.com/rdk/components/camera" "image" "github.com/pkg/errors" @@ -11,9 +12,7 @@ import ( "go.viam.com/rdk/logging" "go.viam.com/rdk/resource" - "go.viam.com/rdk/robot" "go.viam.com/rdk/services/vision" - "go.viam.com/rdk/utils" "go.viam.com/rdk/vision/objectdetection" "go.viam.com/rdk/vision/segmentation" ) @@ -22,18 +21,19 @@ var model = resource.DefaultModelFamily.WithModel("detector_3d_segmenter") func init() { resource.RegisterService(vision.API, model, resource.Registration[vision.Service, *segmentation.DetectionSegmenterConfig]{ - DeprecatedRobotConstructor: func( - ctx context.Context, r any, c resource.Config, logger logging.Logger, + Constructor: func( + ctx context.Context, deps resource.Dependencies, c resource.Config, logger logging.Logger, ) (vision.Service, error) { attrs, err := resource.NativeConfig[*segmentation.DetectionSegmenterConfig](c) if err != nil { return nil, err } - actualR, err := utils.AssertType[robot.Robot](r) - if err != nil { - return nil, err - } - return register3DSegmenterFromDetector(ctx, c.ResourceName(), attrs, actualR) + + return register3DSegmenterFromDetector(ctx, c.ResourceName(), attrs, deps) + }, + WeakDependencies: []resource.Matcher{ + resource.SubtypeMatcher{Subtype: camera.SubtypeName}, + resource.SubtypeMatcher{Subtype: vision.SubtypeName}, }, }) } @@ -43,14 +43,14 @@ func register3DSegmenterFromDetector( ctx context.Context, name resource.Name, conf *segmentation.DetectionSegmenterConfig, - r robot.Robot, + deps resource.Dependencies, ) (vision.Service, error) { _, span := trace.StartSpan(ctx, "service::vision::register3DSegmenterFromDetector") defer span.End() if conf == nil { return nil, errors.New("config for 3D segmenter made from a detector cannot be nil") } - detectorService, err := vision.FromRobot(r, conf.DetectorName) + detectorService, err := vision.FromDependencies(deps, conf.DetectorName) if err != nil { return nil, errors.Wrapf(err, "could not find necessary dependency, detector %q", conf.DetectorName) } @@ -65,5 +65,5 @@ func register3DSegmenterFromDetector( if err != nil { return nil, errors.Wrap(err, "cannot create 3D segmenter from detector") } - return vision.NewService(name, r, nil, nil, detector, segmenter) + return vision.NewService(name, deps, nil, nil, detector, segmenter) } diff --git a/services/vision/mlvision/ml_model.go b/services/vision/mlvision/ml_model.go index 8cbe13947f2..16995a9b86b 100644 --- a/services/vision/mlvision/ml_model.go +++ b/services/vision/mlvision/ml_model.go @@ -6,6 +6,7 @@ import ( "bufio" "context" "fmt" + "go.viam.com/rdk/components/camera" "math" "os" "path/filepath" @@ -20,10 +21,8 @@ import ( "go.viam.com/rdk/logging" "go.viam.com/rdk/ml" "go.viam.com/rdk/resource" - "go.viam.com/rdk/robot" "go.viam.com/rdk/services/mlmodel" "go.viam.com/rdk/services/vision" - "go.viam.com/rdk/utils" ) var model = resource.DefaultModelFamily.WithModel("mlmodel") @@ -40,18 +39,19 @@ const ( func init() { resource.RegisterService(vision.API, model, resource.Registration[vision.Service, *MLModelConfig]{ - DeprecatedRobotConstructor: func( - ctx context.Context, r any, c resource.Config, logger logging.Logger, + Constructor: func( + ctx context.Context, deps resource.Dependencies, c resource.Config, logger logging.Logger, ) (vision.Service, error) { attrs, err := resource.NativeConfig[*MLModelConfig](c) if err != nil { return nil, err } - actualR, err := utils.AssertType[robot.Robot](r) - if err != nil { - return nil, err - } - return registerMLModelVisionService(ctx, c.ResourceName(), attrs, actualR, logger) + + return registerMLModelVisionService(ctx, c.ResourceName(), attrs, deps, logger) + }, + WeakDependencies: []resource.Matcher{ + resource.SubtypeMatcher{Subtype: camera.SubtypeName}, + resource.SubtypeMatcher{Subtype: mlmodel.SubtypeName}, }, }) } @@ -73,13 +73,13 @@ func registerMLModelVisionService( ctx context.Context, name resource.Name, params *MLModelConfig, - r robot.Robot, + deps resource.Dependencies, logger logging.Logger, ) (vision.Service, error) { _, span := trace.StartSpan(ctx, "service::vision::registerMLModelVisionService") defer span.End() - mlm, err := mlmodel.FromRobot(r, params.ModelName) + mlm, err := mlmodel.FromDependencies(deps, params.ModelName) if err != nil { return nil, err } @@ -154,7 +154,7 @@ func registerMLModelVisionService( } // Don't return a close function, because you don't want to close the underlying ML service - return vision.NewService(name, r, nil, classifierFunc, detectorFunc, segmenter3DFunc) + return vision.NewService(name, deps, nil, classifierFunc, detectorFunc, segmenter3DFunc) } // getLabelsFromMetadata returns a slice of strings--the intended labels. diff --git a/services/vision/obstaclesdepth/obstacles_depth.go b/services/vision/obstaclesdepth/obstacles_depth.go index ed450b98d9b..3c01efc35c5 100644 --- a/services/vision/obstaclesdepth/obstacles_depth.go +++ b/services/vision/obstaclesdepth/obstacles_depth.go @@ -18,10 +18,8 @@ import ( "go.viam.com/rdk/rimage" "go.viam.com/rdk/rimage/depthadapter" "go.viam.com/rdk/rimage/transform" - "go.viam.com/rdk/robot" svision "go.viam.com/rdk/services/vision" "go.viam.com/rdk/spatialmath" - "go.viam.com/rdk/utils" vision "go.viam.com/rdk/vision" "go.viam.com/rdk/vision/segmentation" ) @@ -30,18 +28,18 @@ var model = resource.DefaultModelFamily.WithModel("obstacles_depth") func init() { resource.RegisterService(svision.API, model, resource.Registration[svision.Service, *ObsDepthConfig]{ - DeprecatedRobotConstructor: func( - ctx context.Context, r any, c resource.Config, logger logging.Logger, + Constructor: func( + ctx context.Context, deps resource.Dependencies, c resource.Config, logger logging.Logger, ) (svision.Service, error) { attrs, err := resource.NativeConfig[*ObsDepthConfig](c) if err != nil { return nil, err } - actualR, err := utils.AssertType[robot.Robot](r) - if err != nil { - return nil, err - } - return registerObstaclesDepth(ctx, c.ResourceName(), attrs, actualR, logger) + + return registerObstaclesDepth(ctx, c.ResourceName(), attrs, deps, logger) + }, + WeakDependencies: []resource.Matcher{ + resource.SubtypeMatcher{Subtype: camera.SubtypeName}, }, }) } @@ -67,7 +65,7 @@ func registerObstaclesDepth( ctx context.Context, name resource.Name, conf *ObsDepthConfig, - r robot.Robot, + deps resource.Dependencies, logger logging.Logger, ) (svision.Service, error) { _, span := trace.StartSpan(ctx, "service::vision::registerObstacleDepth") @@ -94,7 +92,7 @@ func registerObstaclesDepth( } segmenter := myObsDep.buildObsDepth(logger) // does the thing - return svision.NewService(name, r, nil, nil, nil, segmenter) + return svision.NewService(name, deps, nil, nil, nil, segmenter) } // BuildObsDepth will check for intrinsics and determine how to build based on that. diff --git a/services/vision/obstaclesdistance/obstacles_distance.go b/services/vision/obstaclesdistance/obstacles_distance.go index ef887e48275..e7fcb68559d 100644 --- a/services/vision/obstaclesdistance/obstacles_distance.go +++ b/services/vision/obstaclesdistance/obstacles_distance.go @@ -15,7 +15,6 @@ import ( "go.viam.com/rdk/logging" "go.viam.com/rdk/pointcloud" "go.viam.com/rdk/resource" - "go.viam.com/rdk/robot" svision "go.viam.com/rdk/services/vision" "go.viam.com/rdk/spatialmath" "go.viam.com/rdk/utils" @@ -35,18 +34,18 @@ type DistanceDetectorConfig struct { func init() { resource.RegisterService(svision.API, model, resource.Registration[svision.Service, *DistanceDetectorConfig]{ - DeprecatedRobotConstructor: func( - ctx context.Context, r any, c resource.Config, logger logging.Logger, + Constructor: func( + ctx context.Context, deps resource.Dependencies, c resource.Config, logger logging.Logger, ) (svision.Service, error) { attrs, err := resource.NativeConfig[*DistanceDetectorConfig](c) if err != nil { return nil, err } - actualR, err := utils.AssertType[robot.Robot](r) - if err != nil { - return nil, err - } - return registerObstacleDistanceDetector(ctx, c.ResourceName(), attrs, actualR) + + return registerObstacleDistanceDetector(ctx, c.ResourceName(), attrs, deps) + }, + WeakDependencies: []resource.Matcher{ + resource.SubtypeMatcher{Subtype: camera.SubtypeName}, }, }) } @@ -67,7 +66,7 @@ func registerObstacleDistanceDetector( ctx context.Context, name resource.Name, conf *DistanceDetectorConfig, - r robot.Robot, + deps resource.Dependencies, ) (svision.Service, error) { _, span := trace.StartSpan(ctx, "service::vision::registerObstacleDistanceDetector") defer span.End() @@ -113,7 +112,7 @@ func registerObstacleDistanceDetector( return toReturn, nil } - return svision.NewService(name, r, nil, nil, nil, segmenter) + return svision.NewService(name, deps, nil, nil, nil, segmenter) } func medianFromPointClouds(ctx context.Context, clouds []pointcloud.PointCloud) (r3.Vector, error) { diff --git a/services/vision/obstaclespointcloud/obstacles_pointcloud.go b/services/vision/obstaclespointcloud/obstacles_pointcloud.go index aaff39bc572..e0dde350d2b 100644 --- a/services/vision/obstaclespointcloud/obstacles_pointcloud.go +++ b/services/vision/obstaclespointcloud/obstacles_pointcloud.go @@ -4,15 +4,13 @@ package obstaclespointcloud import ( "context" - "github.com/pkg/errors" "go.opencensus.io/trace" + "go.viam.com/rdk/components/camera" "go.viam.com/rdk/logging" "go.viam.com/rdk/resource" - "go.viam.com/rdk/robot" "go.viam.com/rdk/services/vision" - "go.viam.com/rdk/utils" "go.viam.com/rdk/vision/segmentation" ) @@ -20,18 +18,18 @@ var model = resource.DefaultModelFamily.WithModel("obstacles_pointcloud") func init() { resource.RegisterService(vision.API, model, resource.Registration[vision.Service, *segmentation.ErCCLConfig]{ - DeprecatedRobotConstructor: func( - ctx context.Context, r any, c resource.Config, logger logging.Logger, + Constructor: func( + ctx context.Context, deps resource.Dependencies, c resource.Config, logger logging.Logger, ) (vision.Service, error) { attrs, err := resource.NativeConfig[*segmentation.ErCCLConfig](c) if err != nil { return nil, err } - actualR, err := utils.AssertType[robot.Robot](r) - if err != nil { - return nil, err - } - return registerOPSegmenter(ctx, c.ResourceName(), attrs, actualR) + + return registerOPSegmenter(ctx, c.ResourceName(), attrs, deps) + }, + WeakDependencies: []resource.Matcher{ + resource.SubtypeMatcher{Subtype: camera.SubtypeName}, }, }) } @@ -41,7 +39,7 @@ func registerOPSegmenter( ctx context.Context, name resource.Name, conf *segmentation.ErCCLConfig, - r robot.Robot, + deps resource.Dependencies, ) (vision.Service, error) { _, span := trace.StartSpan(ctx, "service::vision::registerObstaclesPointcloud") defer span.End() @@ -53,5 +51,5 @@ func registerOPSegmenter( return nil, errors.Wrap(err, "obstacles pointcloud segmenter config error") } segmenter := segmentation.Segmenter(conf.ErCCLAlgorithm) - return vision.NewService(name, r, nil, nil, nil, segmenter) + return vision.NewService(name, deps, nil, nil, nil, segmenter) } diff --git a/services/vision/vision.go b/services/vision/vision.go index 9efbe4ba59a..4f551dadfb9 100644 --- a/services/vision/vision.go +++ b/services/vision/vision.go @@ -75,7 +75,7 @@ func FromDependencies(deps resource.Dependencies, name string) (Service, error) type vizModel struct { resource.Named resource.AlwaysRebuild - r robot.Robot // in order to get access to all cameras + deps resource.Dependencies // in order to get access to all cameras closerFunc func(ctx context.Context) error // close the underlying model classifierFunc classification.Classifier detectorFunc objectdetection.Detector @@ -85,7 +85,7 @@ type vizModel struct { // NewService wraps the vision model in the struct that fulfills the vision service interface. func NewService( name resource.Name, - r robot.Robot, + d resource.Dependencies, c func(ctx context.Context) error, cf classification.Classifier, df objectdetection.Detector, @@ -97,7 +97,7 @@ func NewService( } return &vizModel{ Named: name.AsNamed(), - r: r, + deps: d, closerFunc: c, classifierFunc: cf, detectorFunc: df, @@ -130,7 +130,7 @@ func (vm *vizModel) DetectionsFromCamera( if vm.detectorFunc == nil { return nil, errors.Errorf("vision model %q does not implement a Detector", vm.Named.Name()) } - cam, err := camera.FromRobot(vm.r, cameraName) + cam, err := camera.FromDependencies(vm.deps, cameraName) if err != nil { return nil, errors.Wrapf(err, "could not find camera named %s", cameraName) } @@ -173,7 +173,7 @@ func (vm *vizModel) ClassificationsFromCamera( if vm.classifierFunc == nil { return nil, errors.Errorf("vision model %q does not implement a Classifier", vm.Named.Name()) } - cam, err := camera.FromRobot(vm.r, cameraName) + cam, err := camera.FromDependencies(vm.deps, cameraName) if err != nil { return nil, errors.Wrapf(err, "could not find camera named %s", cameraName) } @@ -196,7 +196,7 @@ func (vm *vizModel) GetObjectPointClouds(ctx context.Context, cameraName string, } ctx, span := trace.StartSpan(ctx, "service::vision::GetObjectPointClouds::"+vm.Named.Name().String()) defer span.End() - cam, err := camera.FromRobot(vm.r, cameraName) + cam, err := camera.FromDependencies(vm.deps, cameraName) if err != nil { return nil, err } From 97ab76e40c81480cf09beb9e1e6f2dd13cafb8ec Mon Sep 17 00:00:00 2001 From: Khari Jarrett Date: Tue, 9 Jan 2024 12:14:38 -0500 Subject: [PATCH 2/5] edit tests and lint --- .../vision/colordetector/color_detector.go | 3 +- .../colordetector/color_detector_test.go | 11 ++-- .../detections_to_3dsegments.go | 3 +- .../detections_to_3dsegments_test.go | 34 +++++------ services/vision/mlvision/ml_model.go | 2 +- services/vision/mlvision/ml_model_test.go | 9 ++- .../obstaclesdepth/obstacles_depth_test.go | 58 +++++-------------- .../obstacles_distance_test.go | 21 ++----- .../obstacles_pointcloud.go | 3 +- .../obstacles_pointcloud_test.go | 26 +++------ services/vision/vision_test.go | 4 +- 11 files changed, 63 insertions(+), 111 deletions(-) diff --git a/services/vision/colordetector/color_detector.go b/services/vision/colordetector/color_detector.go index a35f3f92252..245f4196b49 100644 --- a/services/vision/colordetector/color_detector.go +++ b/services/vision/colordetector/color_detector.go @@ -4,11 +4,10 @@ package colordetector import ( "context" - "go.viam.com/rdk/components/camera" - "github.com/pkg/errors" "go.opencensus.io/trace" + "go.viam.com/rdk/components/camera" "go.viam.com/rdk/logging" "go.viam.com/rdk/resource" "go.viam.com/rdk/services/vision" diff --git a/services/vision/colordetector/color_detector_test.go b/services/vision/colordetector/color_detector_test.go index eb68ad3b0c9..e8c46ef6394 100644 --- a/services/vision/colordetector/color_detector_test.go +++ b/services/vision/colordetector/color_detector_test.go @@ -3,13 +3,12 @@ package colordetector import ( "context" "testing" - "go.viam.com/test" "go.viam.com/utils/artifact" + "go.viam.com/rdk/resource" "go.viam.com/rdk/rimage" "go.viam.com/rdk/services/vision" - "go.viam.com/rdk/testutils/inject" "go.viam.com/rdk/vision/objectdetection" ) @@ -20,9 +19,9 @@ func TestColorDetector(t *testing.T) { DetectColorString: "#4F3815", } ctx := context.Background() - r := &inject.Robot{} + deps := make(resource.Dependencies) name := vision.Named("test_cd") - srv, err := registerColorDetector(ctx, name, &inp, r) + srv, err := registerColorDetector(ctx, name, &inp, deps) test.That(t, err, test.ShouldBeNil) test.That(t, srv.Name(), test.ShouldResemble, name) img, err := rimage.NewImageFromFile(artifact.MustPath("vision/objectdetection/detection_test.jpg")) @@ -40,10 +39,10 @@ func TestColorDetector(t *testing.T) { // with error - bad parameters inp.HueTolerance = 4.0 // value out of range - _, err = registerColorDetector(ctx, name, &inp, r) + _, err = registerColorDetector(ctx, name, &inp, deps) test.That(t, err.Error(), test.ShouldContainSubstring, "hue_tolerance_pct must be between") // with error - nil parameters - _, err = registerColorDetector(ctx, name, nil, r) + _, err = registerColorDetector(ctx, name, nil, deps) test.That(t, err.Error(), test.ShouldContainSubstring, "cannot be nil") } diff --git a/services/vision/detectionstosegments/detections_to_3dsegments.go b/services/vision/detectionstosegments/detections_to_3dsegments.go index b6c48b3298f..7dfee744937 100644 --- a/services/vision/detectionstosegments/detections_to_3dsegments.go +++ b/services/vision/detectionstosegments/detections_to_3dsegments.go @@ -4,12 +4,11 @@ package detectionstosegments import ( "context" - "go.viam.com/rdk/components/camera" "image" - "github.com/pkg/errors" "go.opencensus.io/trace" + "go.viam.com/rdk/components/camera" "go.viam.com/rdk/logging" "go.viam.com/rdk/resource" "go.viam.com/rdk/services/vision" diff --git a/services/vision/detectionstosegments/detections_to_3dsegments_test.go b/services/vision/detectionstosegments/detections_to_3dsegments_test.go index 9891b9ad5ae..2c501269d04 100644 --- a/services/vision/detectionstosegments/detections_to_3dsegments_test.go +++ b/services/vision/detectionstosegments/detections_to_3dsegments_test.go @@ -29,12 +29,15 @@ func (s *simpleDetector) Detect(context.Context, image.Image) ([]objectdetection } func Test3DSegmentsFromDetector(t *testing.T) { - r := &inject.Robot{} + deps := make(resource.Dependencies) + deps2 := make(resource.Dependencies) m := &simpleDetector{} name := vision.Named("testDetector") - svc, err := vision.NewService(name, r, nil, nil, m.Detect, nil) + + svc, err := vision.NewService(name, deps, nil, nil, m.Detect, nil) test.That(t, err, test.ShouldBeNil) - cam := &inject.Camera{} + + cam := inject.NewCamera("fakeCamera") cam.NextPointCloudFunc = func(ctx context.Context) (pc.PointCloud, error) { return nil, errors.New("no pointcloud") } @@ -44,44 +47,35 @@ func Test3DSegmentsFromDetector(t *testing.T) { cam.ProjectorFunc = func(ctx context.Context) (transform.Projector, error) { return &transform.ParallelProjection{}, nil } - r.ResourceNamesFunc = func() []resource.Name { - return []resource.Name{camera.Named("fakeCamera"), name} - } - r.ResourceByNameFunc = func(n resource.Name) (resource.Resource, error) { - switch n.Name { - case "fakeCamera": - return cam, nil - case "testDetector": - return svc, nil - default: - return nil, resource.NewNotFoundError(n) - } - } + // set up cams as dependencies + deps2[vision.Named("testDetector")] = svc + deps2[camera.Named("fakeCamera")] = cam + params := &segmentation.DetectionSegmenterConfig{ DetectorName: "testDetector", ConfidenceThresh: 0.2, } // bad registration, no parameters name2 := vision.Named("test_seg") - _, err = register3DSegmenterFromDetector(context.Background(), name2, nil, r) + _, err = register3DSegmenterFromDetector(context.Background(), name2, nil, deps2) test.That(t, err, test.ShouldNotBeNil) test.That(t, err.Error(), test.ShouldContainSubstring, "cannot be nil") // bad registration, no such detector params.DetectorName = "noDetector" - _, err = register3DSegmenterFromDetector(context.Background(), name2, params, r) + _, err = register3DSegmenterFromDetector(context.Background(), name2, params, deps2) test.That(t, err, test.ShouldNotBeNil) test.That(t, err.Error(), test.ShouldContainSubstring, "could not find necessary dependency") // successful registration params.DetectorName = "testDetector" name3 := vision.Named("test_rcs") - seg, err := register3DSegmenterFromDetector(context.Background(), name3, params, r) + seg, err := register3DSegmenterFromDetector(context.Background(), name3, params, deps2) test.That(t, err, test.ShouldBeNil) test.That(t, seg.Name(), test.ShouldResemble, name3) // fails on not finding camera _, err = seg.GetObjectPointClouds(context.Background(), "no_camera", map[string]interface{}{}) test.That(t, err, test.ShouldNotBeNil) - test.That(t, err.Error(), test.ShouldContainSubstring, "not found") + test.That(t, err.Error(), test.ShouldContainSubstring, "missing") // fails since camera cannot return images _, err = seg.GetObjectPointClouds(context.Background(), "fakeCamera", map[string]interface{}{}) diff --git a/services/vision/mlvision/ml_model.go b/services/vision/mlvision/ml_model.go index 16995a9b86b..f3c23c0807e 100644 --- a/services/vision/mlvision/ml_model.go +++ b/services/vision/mlvision/ml_model.go @@ -6,7 +6,6 @@ import ( "bufio" "context" "fmt" - "go.viam.com/rdk/components/camera" "math" "os" "path/filepath" @@ -18,6 +17,7 @@ import ( "go.opencensus.io/trace" "golang.org/x/exp/constraints" + "go.viam.com/rdk/components/camera" "go.viam.com/rdk/logging" "go.viam.com/rdk/ml" "go.viam.com/rdk/resource" diff --git a/services/vision/mlvision/ml_model_test.go b/services/vision/mlvision/ml_model_test.go index 037529b7323..ff30a929ee0 100644 --- a/services/vision/mlvision/ml_model_test.go +++ b/services/vision/mlvision/ml_model_test.go @@ -11,10 +11,10 @@ import ( "go.viam.com/utils/artifact" "go.viam.com/rdk/logging" + "go.viam.com/rdk/resource" "go.viam.com/rdk/rimage" "go.viam.com/rdk/services/mlmodel" "go.viam.com/rdk/services/mlmodel/tflitecpu" - "go.viam.com/rdk/testutils/inject" "go.viam.com/rdk/vision/classification" ) @@ -32,9 +32,11 @@ func BenchmarkAddMLVisionModel(b *testing.B) { test.That(b, out, test.ShouldNotBeNil) modelCfg := MLModelConfig{ModelName: name.Name} + deps := make(resource.Dependencies) + b.ResetTimer() for i := 0; i < b.N; i++ { - service, err := registerMLModelVisionService(ctx, name, &modelCfg, &inject.Robot{}, logging.NewLogger("benchmark")) + service, err := registerMLModelVisionService(ctx, name, &modelCfg, deps, logging.NewLogger("benchmark")) test.That(b, err, test.ShouldBeNil) test.That(b, service, test.ShouldNotBeNil) test.That(b, service.Name(), test.ShouldResemble, name) @@ -57,7 +59,8 @@ func BenchmarkUseMLVisionModel(b *testing.B) { test.That(b, out, test.ShouldNotBeNil) modelCfg := MLModelConfig{ModelName: name.Name} - service, err := registerMLModelVisionService(ctx, name, &modelCfg, &inject.Robot{}, logging.NewLogger("benchmark")) + deps := make(resource.Dependencies) + service, err := registerMLModelVisionService(ctx, name, &modelCfg, deps, logging.NewLogger("benchmark")) test.That(b, err, test.ShouldBeNil) test.That(b, service, test.ShouldNotBeNil) test.That(b, service.Name(), test.ShouldResemble, name) diff --git a/services/vision/obstaclesdepth/obstacles_depth_test.go b/services/vision/obstaclesdepth/obstacles_depth_test.go index a075bf04b9c..182ae98e386 100644 --- a/services/vision/obstaclesdepth/obstacles_depth_test.go +++ b/services/vision/obstaclesdepth/obstacles_depth_test.go @@ -16,7 +16,6 @@ import ( "go.viam.com/rdk/rimage/transform" "go.viam.com/rdk/services/vision" "go.viam.com/rdk/spatialmath" - "go.viam.com/rdk/testutils/inject" ) // testReader creates and serves a fake depth image for testing. @@ -68,10 +67,9 @@ func TestObstacleDepth(t *testing.T) { } ctx := context.Background() + deps := make(resource.Dependencies) testLogger := logging.NewLogger("test") - r := &inject.Robot{ResourceNamesFunc: func() []resource.Name { - return []resource.Name{camera.Named("testCam"), camera.Named("noIntrinsicsCam")} - }} + // camera with intrinsics fr := fullReader{} syst := transform.PinholeCameraModel{&someIntrinsics, nil} @@ -85,19 +83,13 @@ func TestObstacleDepth(t *testing.T) { test.That(t, err, test.ShouldBeNil) test.That(t, myCamSrcNoIntrinsics, test.ShouldNotBeNil) noIntrinsicsCam := camera.FromVideoSource(resource.Name{Name: "noIntrinsicsCam"}, myCamSrcNoIntrinsics, testLogger) - // set up the fake robot - r.ResourceByNameFunc = func(n resource.Name) (resource.Resource, error) { - switch n.Name { - case "testCam": - return myIntrinsicsCam, nil - case "noIntrinsicsCam": - return noIntrinsicsCam, nil - default: - return nil, resource.NewNotFoundError(n) - } - } + + // set up cams as dependencies + deps[camera.Named("testCam")] = myIntrinsicsCam + deps[camera.Named("noIntrinsicsCam")] = noIntrinsicsCam name := vision.Named("test") - srv, err := registerObstaclesDepth(ctx, name, &noIntrinsicsCfg, r, testLogger) + + srv, err := registerObstaclesDepth(ctx, name, &noIntrinsicsCfg, deps, testLogger) test.That(t, err, test.ShouldBeNil) test.That(t, srv.Name(), test.ShouldResemble, name) @@ -124,7 +116,7 @@ func TestObstacleDepth(t *testing.T) { }) t.Run("intrinsics version", func(t *testing.T) { // Now with intrinsics (and pointclouds)! - srv2, err := registerObstaclesDepth(ctx, name, &withIntrinsicsCfg, r, testLogger) + srv2, err := registerObstaclesDepth(ctx, name, &withIntrinsicsCfg, deps, testLogger) test.That(t, err, test.ShouldBeNil) test.That(t, srv2, test.ShouldNotBeNil) obs, err := srv2.GetObjectPointClouds(ctx, "testCam", nil) @@ -157,23 +149,14 @@ func BenchmarkObstacleDepthIntrinsics(b *testing.B) { ctx := context.Background() testLogger := logging.NewLogger("test") - r := &inject.Robot{ResourceNamesFunc: func() []resource.Name { - return []resource.Name{camera.Named("testCam")} - }} tr := fullReader{} syst := transform.PinholeCameraModel{&someIntrinsics, nil} myCamSrc, _ := camera.NewVideoSourceFromReader(ctx, tr, &syst, camera.DepthStream) myCam := camera.FromVideoSource(resource.Name{Name: "testCam"}, myCamSrc, testLogger) - r.ResourceByNameFunc = func(n resource.Name) (resource.Resource, error) { - switch n.Name { - case "testCam": - return myCam, nil - default: - return nil, resource.NewNotFoundError(n) - } - } + deps := make(resource.Dependencies) + deps[camera.Named("testCam")] = myCam name := vision.Named("test") - srv, _ := registerObstaclesDepth(ctx, name, &withIntrinsicsCfg, r, testLogger) + srv, _ := registerObstaclesDepth(ctx, name, &withIntrinsicsCfg, deps, testLogger) b.ResetTimer() for i := 0; i < b.N; i++ { @@ -183,25 +166,16 @@ func BenchmarkObstacleDepthIntrinsics(b *testing.B) { func BenchmarkObstacleDepthNoIntrinsics(b *testing.B) { noIntrinsicsCfg := ObsDepthConfig{} - ctx := context.Background() testLogger := logging.NewLogger("test") - r := &inject.Robot{ResourceNamesFunc: func() []resource.Name { - return []resource.Name{camera.Named("testCam")} - }} tr := fullReader{} myCamSrc, _ := camera.NewVideoSourceFromReader(ctx, tr, nil, camera.DepthStream) myCam := camera.FromVideoSource(resource.Name{Name: "testCam"}, myCamSrc, testLogger) - r.ResourceByNameFunc = func(n resource.Name) (resource.Resource, error) { - switch n.Name { - case "testCam": - return myCam, nil - default: - return nil, resource.NewNotFoundError(n) - } - } + deps := make(resource.Dependencies) + deps[camera.Named("testCam")] = myCam + name := vision.Named("test") - srv, _ := registerObstaclesDepth(ctx, name, &noIntrinsicsCfg, r, testLogger) + srv, _ := registerObstaclesDepth(ctx, name, &noIntrinsicsCfg, deps, testLogger) b.ResetTimer() for i := 0; i < b.N; i++ { diff --git a/services/vision/obstaclesdistance/obstacles_distance_test.go b/services/vision/obstaclesdistance/obstacles_distance_test.go index 8d250971d1a..0a0bd477769 100644 --- a/services/vision/obstaclesdistance/obstacles_distance_test.go +++ b/services/vision/obstaclesdistance/obstacles_distance_test.go @@ -31,25 +31,16 @@ func TestObstacleDist(t *testing.T) { NumQueries: 10, } ctx := context.Background() - r := &inject.Robot{} - cam := &inject.Camera{} + cam := inject.NewCamera("fakeCamera") cam.NextPointCloudFunc = func(ctx context.Context) (pc.PointCloud, error) { return nil, errors.New("no pointcloud") } - r.ResourceNamesFunc = func() []resource.Name { - return []resource.Name{camera.Named("fakeCamera")} - } - r.ResourceByNameFunc = func(n resource.Name) (resource.Resource, error) { - switch n.Name { - case "fakeCamera": - return cam, nil - default: - return nil, resource.NewNotFoundError(n) - } - } + deps := make(resource.Dependencies) + deps[camera.Named("fakeCamera")] = cam + name := vision.Named("test_odd") - srv, err := registerObstacleDistanceDetector(ctx, name, &inp, r) + srv, err := registerObstacleDistanceDetector(ctx, name, &inp, deps) test.That(t, err, test.ShouldBeNil) test.That(t, srv.Name(), test.ShouldResemble, name) img, err := rimage.NewImageFromFile(artifact.MustPath("vision/objectdetection/detection_test.jpg")) @@ -119,6 +110,6 @@ func TestObstacleDist(t *testing.T) { test.That(t, isPoint, test.ShouldBeTrue) // with error - nil parameters - _, err = registerObstacleDistanceDetector(ctx, name, nil, r) + _, err = registerObstacleDistanceDetector(ctx, name, nil, deps) test.That(t, err.Error(), test.ShouldContainSubstring, "cannot be nil") } diff --git a/services/vision/obstaclespointcloud/obstacles_pointcloud.go b/services/vision/obstaclespointcloud/obstacles_pointcloud.go index e0dde350d2b..23e57de556c 100644 --- a/services/vision/obstaclespointcloud/obstacles_pointcloud.go +++ b/services/vision/obstaclespointcloud/obstacles_pointcloud.go @@ -4,10 +4,11 @@ package obstaclespointcloud import ( "context" + "github.com/pkg/errors" "go.opencensus.io/trace" - "go.viam.com/rdk/components/camera" + "go.viam.com/rdk/components/camera" "go.viam.com/rdk/logging" "go.viam.com/rdk/resource" "go.viam.com/rdk/services/vision" diff --git a/services/vision/obstaclespointcloud/obstacles_pointcloud_test.go b/services/vision/obstaclespointcloud/obstacles_pointcloud_test.go index 6c79420d887..2568327e014 100644 --- a/services/vision/obstaclespointcloud/obstacles_pointcloud_test.go +++ b/services/vision/obstaclespointcloud/obstacles_pointcloud_test.go @@ -18,22 +18,14 @@ import ( ) func TestRadiusClusteringSegmentation(t *testing.T) { - r := &inject.Robot{} - cam := &inject.Camera{} + cam := inject.NewCamera("fakeCamera") cam.NextPointCloudFunc = func(ctx context.Context) (pc.PointCloud, error) { return nil, errors.New("no pointcloud") } - r.ResourceNamesFunc = func() []resource.Name { - return []resource.Name{camera.Named("fakeCamera")} - } - r.ResourceByNameFunc = func(n resource.Name) (resource.Resource, error) { - switch n.Name { - case "fakeCamera": - return cam, nil - default: - return nil, resource.NewNotFoundError(n) - } - } + // Set up dependencies + deps := make(resource.Dependencies) + deps[camera.Named("fakeCamera")] = cam + params := &segmentation.ErCCLConfig{ MinPtsInPlane: 100, MaxDistFromPlane: 10, @@ -45,24 +37,24 @@ func TestRadiusClusteringSegmentation(t *testing.T) { } // bad registration, no parameters name := vision.Named("test_rcs") - _, err := registerOPSegmenter(context.Background(), name, nil, r) + _, err := registerOPSegmenter(context.Background(), name, nil, deps) test.That(t, err, test.ShouldNotBeNil) test.That(t, err.Error(), test.ShouldContainSubstring, "cannot be nil") // bad registration, parameters out of bounds params.ClusteringRadius = -3 - _, err = registerOPSegmenter(context.Background(), name, params, r) + _, err = registerOPSegmenter(context.Background(), name, params, deps) test.That(t, err, test.ShouldNotBeNil) test.That(t, err.Error(), test.ShouldContainSubstring, "segmenter config error") // successful registration params.ClusteringRadius = 1 - seg, err := registerOPSegmenter(context.Background(), name, params, r) + seg, err := registerOPSegmenter(context.Background(), name, params, deps) test.That(t, err, test.ShouldBeNil) test.That(t, seg.Name(), test.ShouldResemble, name) // fails on not finding camera _, err = seg.GetObjectPointClouds(context.Background(), "no_camera", map[string]interface{}{}) test.That(t, err, test.ShouldNotBeNil) - test.That(t, err.Error(), test.ShouldContainSubstring, "not found") + test.That(t, err.Error(), test.ShouldContainSubstring, "missing") // fails since camera cannot generate point clouds _, err = seg.GetObjectPointClouds(context.Background(), "fakeCamera", map[string]interface{}{}) diff --git a/services/vision/vision_test.go b/services/vision/vision_test.go index 8f42c56666c..21eb3654c17 100644 --- a/services/vision/vision_test.go +++ b/services/vision/vision_test.go @@ -45,9 +45,9 @@ func (s *simpleDetector) Detect(context.Context, image.Image) ([]objectdetection } func TestNewService(t *testing.T) { - var r inject.Robot + var d resource.Dependencies var m simpleDetector - svc, err := vision.NewService(vision.Named("testService"), &r, nil, nil, m.Detect, nil) + svc, err := vision.NewService(vision.Named("testService"), d, nil, nil, m.Detect, nil) test.That(t, err, test.ShouldBeNil) test.That(t, svc, test.ShouldNotBeNil) result, err := svc.Detections(context.Background(), nil, nil) From 410dd05f7aa0b9b1ed536b5174331471296a9032 Mon Sep 17 00:00:00 2001 From: Khari Jarrett Date: Tue, 9 Jan 2024 12:26:17 -0500 Subject: [PATCH 3/5] quick edits --- services/mlmodel/mlmodel.go | 2 +- services/vision/colordetector/color_detector.go | 1 + services/vision/colordetector/color_detector_test.go | 1 + .../vision/detectionstosegments/detections_to_3dsegments.go | 2 +- .../detectionstosegments/detections_to_3dsegments_test.go | 2 -- services/vision/mlvision/ml_model.go | 1 - services/vision/obstaclesdepth/obstacles_depth.go | 1 - services/vision/obstaclesdistance/obstacles_distance.go | 1 - services/vision/obstaclespointcloud/obstacles_pointcloud.go | 1 - 9 files changed, 4 insertions(+), 8 deletions(-) diff --git a/services/mlmodel/mlmodel.go b/services/mlmodel/mlmodel.go index 7daf4d7ef3d..1f0515a5b6c 100644 --- a/services/mlmodel/mlmodel.go +++ b/services/mlmodel/mlmodel.go @@ -287,7 +287,7 @@ func FromRobot(r robot.Robot, name string) (Service, error) { return robot.ResourceFromRobot[Service](r, Named(name)) } -// FromDependencies is a helper for getting the named vision service from a collection of dependencies. +// FromDependencies is a helper for getting the named ML model service from a collection of dependencies. func FromDependencies(deps resource.Dependencies, name string) (Service, error) { return resource.FromDependencies[Service](deps, Named(name)) } diff --git a/services/vision/colordetector/color_detector.go b/services/vision/colordetector/color_detector.go index 245f4196b49..1b136b9e417 100644 --- a/services/vision/colordetector/color_detector.go +++ b/services/vision/colordetector/color_detector.go @@ -4,6 +4,7 @@ package colordetector import ( "context" + "github.com/pkg/errors" "go.opencensus.io/trace" diff --git a/services/vision/colordetector/color_detector_test.go b/services/vision/colordetector/color_detector_test.go index e8c46ef6394..9750e27d41e 100644 --- a/services/vision/colordetector/color_detector_test.go +++ b/services/vision/colordetector/color_detector_test.go @@ -3,6 +3,7 @@ package colordetector import ( "context" "testing" + "go.viam.com/test" "go.viam.com/utils/artifact" diff --git a/services/vision/detectionstosegments/detections_to_3dsegments.go b/services/vision/detectionstosegments/detections_to_3dsegments.go index 7dfee744937..d6e08c74820 100644 --- a/services/vision/detectionstosegments/detections_to_3dsegments.go +++ b/services/vision/detectionstosegments/detections_to_3dsegments.go @@ -5,6 +5,7 @@ package detectionstosegments import ( "context" "image" + "github.com/pkg/errors" "go.opencensus.io/trace" @@ -27,7 +28,6 @@ func init() { if err != nil { return nil, err } - return register3DSegmenterFromDetector(ctx, c.ResourceName(), attrs, deps) }, WeakDependencies: []resource.Matcher{ diff --git a/services/vision/detectionstosegments/detections_to_3dsegments_test.go b/services/vision/detectionstosegments/detections_to_3dsegments_test.go index 2c501269d04..6c918da2c7f 100644 --- a/services/vision/detectionstosegments/detections_to_3dsegments_test.go +++ b/services/vision/detectionstosegments/detections_to_3dsegments_test.go @@ -33,10 +33,8 @@ func Test3DSegmentsFromDetector(t *testing.T) { deps2 := make(resource.Dependencies) m := &simpleDetector{} name := vision.Named("testDetector") - svc, err := vision.NewService(name, deps, nil, nil, m.Detect, nil) test.That(t, err, test.ShouldBeNil) - cam := inject.NewCamera("fakeCamera") cam.NextPointCloudFunc = func(ctx context.Context) (pc.PointCloud, error) { return nil, errors.New("no pointcloud") diff --git a/services/vision/mlvision/ml_model.go b/services/vision/mlvision/ml_model.go index f3c23c0807e..29da355c652 100644 --- a/services/vision/mlvision/ml_model.go +++ b/services/vision/mlvision/ml_model.go @@ -46,7 +46,6 @@ func init() { if err != nil { return nil, err } - return registerMLModelVisionService(ctx, c.ResourceName(), attrs, deps, logger) }, WeakDependencies: []resource.Matcher{ diff --git a/services/vision/obstaclesdepth/obstacles_depth.go b/services/vision/obstaclesdepth/obstacles_depth.go index 3c01efc35c5..3bc186b08c6 100644 --- a/services/vision/obstaclesdepth/obstacles_depth.go +++ b/services/vision/obstaclesdepth/obstacles_depth.go @@ -35,7 +35,6 @@ func init() { if err != nil { return nil, err } - return registerObstaclesDepth(ctx, c.ResourceName(), attrs, deps, logger) }, WeakDependencies: []resource.Matcher{ diff --git a/services/vision/obstaclesdistance/obstacles_distance.go b/services/vision/obstaclesdistance/obstacles_distance.go index e7fcb68559d..cfbfcecdbe1 100644 --- a/services/vision/obstaclesdistance/obstacles_distance.go +++ b/services/vision/obstaclesdistance/obstacles_distance.go @@ -41,7 +41,6 @@ func init() { if err != nil { return nil, err } - return registerObstacleDistanceDetector(ctx, c.ResourceName(), attrs, deps) }, WeakDependencies: []resource.Matcher{ diff --git a/services/vision/obstaclespointcloud/obstacles_pointcloud.go b/services/vision/obstaclespointcloud/obstacles_pointcloud.go index 23e57de556c..660a8d97bd5 100644 --- a/services/vision/obstaclespointcloud/obstacles_pointcloud.go +++ b/services/vision/obstaclespointcloud/obstacles_pointcloud.go @@ -26,7 +26,6 @@ func init() { if err != nil { return nil, err } - return registerOPSegmenter(ctx, c.ResourceName(), attrs, deps) }, WeakDependencies: []resource.Matcher{ From 9707aa86be8c2e29ca2017b7be6dd364dacd5ab2 Mon Sep 17 00:00:00 2001 From: Khari Jarrett Date: Fri, 12 Jan 2024 09:46:52 -0500 Subject: [PATCH 4/5] reconfigurable --- services/vision/mlvision/ml_model.go | 1 + services/vision/obstaclesdepth/obstacles_depth.go | 1 + services/vision/vision.go | 2 +- vision/objectdetection/color_detector.go | 1 + vision/segmentation/detections_to_objects.go | 1 + vision/segmentation/er_ccl_clustering.go | 1 + 6 files changed, 6 insertions(+), 1 deletion(-) diff --git a/services/vision/mlvision/ml_model.go b/services/vision/mlvision/ml_model.go index 29da355c652..635e9b24770 100644 --- a/services/vision/mlvision/ml_model.go +++ b/services/vision/mlvision/ml_model.go @@ -57,6 +57,7 @@ func init() { // MLModelConfig specifies the parameters needed to turn an ML model into a vision Model. type MLModelConfig struct { + resource.TriviallyReconfigurable ModelName string `json:"mlmodel_name"` } diff --git a/services/vision/obstaclesdepth/obstacles_depth.go b/services/vision/obstaclesdepth/obstacles_depth.go index 3bc186b08c6..91d325789a1 100644 --- a/services/vision/obstaclesdepth/obstacles_depth.go +++ b/services/vision/obstaclesdepth/obstacles_depth.go @@ -46,6 +46,7 @@ func init() { // ObsDepthConfig specifies the parameters to be used for the obstacle depth service. type ObsDepthConfig struct { resource.TriviallyValidateConfig + resource.TriviallyReconfigurable MinPtsInPlane int `json:"min_points_in_plane"` MinPtsInSegment int `json:"min_points_in_segment"` MaxDistFromPlane float64 `json:"max_dist_from_plane_mm"` diff --git a/services/vision/vision.go b/services/vision/vision.go index 4f551dadfb9..db327351f11 100644 --- a/services/vision/vision.go +++ b/services/vision/vision.go @@ -74,7 +74,7 @@ func FromDependencies(deps resource.Dependencies, name string) (Service, error) // vizModel wraps the vision model with all the service interface methods. type vizModel struct { resource.Named - resource.AlwaysRebuild + resource.TriviallyReconfigurable deps resource.Dependencies // in order to get access to all cameras closerFunc func(ctx context.Context) error // close the underlying model classifierFunc classification.Classifier diff --git a/vision/objectdetection/color_detector.go b/vision/objectdetection/color_detector.go index 5ac1f896d3f..5bf0b9fac7a 100644 --- a/vision/objectdetection/color_detector.go +++ b/vision/objectdetection/color_detector.go @@ -12,6 +12,7 @@ import ( // ColorDetectorConfig specifies the fields necessary for creating a color detector. type ColorDetectorConfig struct { resource.TriviallyValidateConfig + resource.TriviallyReconfigurable SegmentSize int `json:"segment_size_px"` HueTolerance float64 `json:"hue_tolerance_pct"` SaturationCutoff float64 `json:"saturation_cutoff_pct,omitempty"` diff --git a/vision/segmentation/detections_to_objects.go b/vision/segmentation/detections_to_objects.go index d6c0c5646a5..6298aa72e88 100644 --- a/vision/segmentation/detections_to_objects.go +++ b/vision/segmentation/detections_to_objects.go @@ -20,6 +20,7 @@ import ( // DetectionSegmenterConfig are the optional parameters to turn a detector into a segmenter. type DetectionSegmenterConfig struct { resource.TriviallyValidateConfig + resource.TriviallyReconfigurable DetectorName string `json:"detector_name"` ConfidenceThresh float64 `json:"confidence_threshold_pct"` MeanK int `json:"mean_k"` diff --git a/vision/segmentation/er_ccl_clustering.go b/vision/segmentation/er_ccl_clustering.go index c4da20c7e1f..94ec1ea57d5 100644 --- a/vision/segmentation/er_ccl_clustering.go +++ b/vision/segmentation/er_ccl_clustering.go @@ -30,6 +30,7 @@ const ( // connected components based clustering algo. type ErCCLConfig struct { resource.TriviallyValidateConfig + resource.TriviallyReconfigurable MinPtsInPlane int `json:"min_points_in_plane"` MinPtsInSegment int `json:"min_points_in_segment"` MaxDistFromPlane float64 `json:"max_dist_from_plane_mm"` From 3067208a53144240e7f4e48d54891ec6a885e7c7 Mon Sep 17 00:00:00 2001 From: Khari Jarrett Date: Wed, 17 Jan 2024 15:52:35 -0500 Subject: [PATCH 5/5] print test statements --- services/vision/colordetector/color_detector.go | 10 +++++++++- services/vision/mlvision/ml_model.go | 6 ++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/services/vision/colordetector/color_detector.go b/services/vision/colordetector/color_detector.go index 1b136b9e417..05f56bb3d0d 100644 --- a/services/vision/colordetector/color_detector.go +++ b/services/vision/colordetector/color_detector.go @@ -4,7 +4,7 @@ package colordetector import ( "context" - + "fmt" "github.com/pkg/errors" "go.opencensus.io/trace" @@ -26,6 +26,7 @@ func init() { if err != nil { return nil, err } + return registerColorDetector(ctx, c.ResourceName(), attrs, deps) }, WeakDependencies: []resource.Matcher{ @@ -43,6 +44,13 @@ func registerColorDetector( ) (vision.Service, error) { _, span := trace.StartSpan(ctx, "service::vision::registerColorDetector") defer span.End() + + fmt.Println("Printing COL DETECTOR DEPS") + for _, d := range deps { + fmt.Println(d) + fmt.Println() + } + if conf == nil { return nil, errors.New("object detection config for color detector cannot be nil") } diff --git a/services/vision/mlvision/ml_model.go b/services/vision/mlvision/ml_model.go index 635e9b24770..5bd5ac0b379 100644 --- a/services/vision/mlvision/ml_model.go +++ b/services/vision/mlvision/ml_model.go @@ -79,6 +79,12 @@ func registerMLModelVisionService( _, span := trace.StartSpan(ctx, "service::vision::registerMLModelVisionService") defer span.End() + fmt.Println("Printing ML MODEL DEPS") + for _, d := range deps { + fmt.Println(d) + fmt.Println() + } + mlm, err := mlmodel.FromDependencies(deps, params.ModelName) if err != nil { return nil, err