chromium/components/optimization_guide/proto/visual_search_model_metadata.proto

// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

syntax = "proto2";

option optimize_for = LITE_RUNTIME;
option java_package = "org.chromium.components.optimization_guide.proto";
option java_outer_classname = "VisualSearchModelMetadataProto";

package optimization_guide.proto;

message FeatureLibrary {
  // Next id: 16
  enum ImageLevelFeatureName {
    IMAGE_LEVEL_UNSPECIFIED = 0;

    // Features of the original image.
    IMAGE_ORIGINAL_AREA = 1;
    IMAGE_ORIGINAL_ASPECT_RATIO = 2;
    IMAGE_ORIGINAL_HEIGHT = 11;
    IMAGE_ORIGINAL_WIDTH = 12;

    // Features of the image as scaled on the page. Not all of the area may
    // be visible.
    IMAGE_ONPAGE_AREA = 3;
    IMAGE_ONPAGE_HEIGHT = 9;
    IMAGE_ONPAGE_WIDTH = 10;
    IMAGE_ONPAGE_ASPECT_RATIO = 4;

    // The actually visible area of the image on the page.
    IMAGE_VISIBLE_AREA = 5;

    // Fraction of image that is in viewport. Computed as
    // IMAGE_VISIBLE_AREA / IMAGE_ONPAGE_AREA.
    IMAGE_FRACTION_VISIBLE = 6;

    // The Euclidean distance of the center of the image to the
    // center of the viewport.
    IMAGE_DISTANCE_TO_VIEWPORT_CENTER = 13;

    // Scores of the shopping, sens, natural world, and public figures
    // classifiers.
    SHOPPING_CLASSIFIER_SCORE = 7;
    SENS_CLASSIFIER_SCORE = 8;
    NAT_WORLD_CLASSIFIER_SCORE = 14;
    PUB_FIGURES_CLASSIFIER_SCORE = 15;
  }

  // Enum listing the ways in which we can normalize a feature.
  enum NormalizingOp {
    NORMALIZE_UNSPECIFIED = 0;
    // Normalize by the size of the viewport area.
    BY_VIEWPORT_AREA = 1;
    // Normalize by the max value of the feature.
    BY_MAX_VALUE = 2;
  }

  // Enum listing the types of thresholding operators.
  enum ThresholdingOp {
    THRESHOLDING_UNSPECIFIED = 0;
    // Greater than.
    GT = 1;
    // Less than.
    LT = 2;
  }

  // Enum listing the order in which the final list of eligible images is
  // sorted.
  enum SortingOrder {
    SORT_UNSPECIFIED = 0;
    SORT_ASCENDING = 1;
    SORT_DESCENDING = 2;
  }
}

// A rule that applies a threshold on a feature. The rule is satisfied if the
// value of the feature with /feature_type/ passes the /threshold/ according to
// the given /op/. Eg. suppose feature_type = IMAGE_ORIGINAL_AREA, op = GT, and
// threshold = 5. Then the rule is satisfied if the original area of the image
// is greater than 5.
message ThresholdingRule {
  optional FeatureLibrary.ImageLevelFeatureName feature_name = 1;
  // The normalizing_op is not required.
  optional FeatureLibrary.NormalizingOp normalizing_op = 2;
  optional FeatureLibrary.ThresholdingOp thresholding_op = 3;
  optional float threshold = 4;
}

// An OR-of-thresholding-rules is satisfied if any of the thresholding rules it
// contains are satisfied.
message OrOfThresholdingRules {
  repeated ThresholdingRule rules = 1;
}

// Specifies a feature by whose value we need to sort the final eligible images.
message SortingClause {
  optional FeatureLibrary.ImageLevelFeatureName feature_name = 1;
  optional FeatureLibrary.SortingOrder sorting_order = 2;
}

// Contains any additional options for cheap pruning that cannot be neatly
// expressed as an OrOfThresholdingRules.
message AdditionalCheapPruningOptions {
  // Providing a value for this setting enables filtering out overlapping
  // images by using the z-index setting (when available). When the
  // overlap of the images is >= to the provided fraction (eg. 0.99),
  // and there is a z-index value present, we will filter out the image
  // with a lower z-index value.
  optional float z_index_overlap_fraction = 1;
}

// Overall spec for the whole module.
message EligibilitySpec {
  // List of light-weight thresholding rules that we use in the first-cut run to
  // cheaply prune ineligible images. All of the eligibility rules must be
  // satisfied for an image to be considered eligible.
  repeated OrOfThresholdingRules cheap_pruning_rules = 1;
  optional AdditionalCheapPruningOptions additional_cheap_pruning_options = 5;

  // These are thresholding rules that depend on more expensive-to-compute
  // inputs such as the sensitivity and intent classifications.
  repeated OrOfThresholdingRules classifier_score_rules = 2;
  // Before running these rules, normalizing features are recomputed only over
  // the images that remain after the second pass.
  repeated OrOfThresholdingRules post_renormalization_rules = 3;

  // The final list of eligible images are sorted according to these clauses.
  // The clauses are applied in the order in which they are provided here, eg,
  // we may choose to first sort by image area and then by shoppy score.
  repeated SortingClause sorting_clauses = 4;
}

// The message contains a set of params to config visual search classification.
message VisualSearchModelMetadata {
  optional EligibilitySpec eligibility_spec = 1;

  // Keep track of the version to ensure the client-side has been updated to
  // handle new fields that may appear in the config protos.
  optional int64 metadata_version = 2;
}