// Copyright 2019 The MediaPipe Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. syntax = "proto2"; package mediapipe; import "mediapipe/util/tracking/tone_models.proto"; // Capture tone change between two frames and per-frame tone statistics. // The estimated tone change describes the transformation of color intensities // from the current to the previous frame. // Next tag: 16 message ToneChange { optional GainBiasModel gain_bias = 1; optional AffineToneModel affine = 2; optional MixtureGainBiasModel mixture_gain_bias = 3; optional MixtureAffineToneModel mixture_affine = 4; // TODO: Implement. optional float mixture_domain_sigma = 5; // Tone statistics, describing statistics of intensities of the current frame // (independent from the previous frame). // Fraction of clipped pixels in [0, 1]. // A pixel is considered clipped if more than // ToneEstimationOptions::max_clipped_channels are over- // or under exposed. optional float frac_clipped = 6 [default = 0.0]; // Intensity percentiles of the current frame. Normalized to [0, 1]. // We sort the intensities in the image (RGB to intensity conversion) and // select the intensities that fall at the ranks specified by the // stats_[low|mid|high]_percentile options below as the /* // Minimum fractional number of inlier gain features for gain correction // deemed to be successful. optional float min_frac_gain_inliers = 39 [default = 0.8]; // On average accept up to 10% intensity registration error. optional float min_gain_inlier_weight = 40 [default = 0.1]; */ // [low|mid|high]_percentile's. optional float low_percentile = 8; optional float low_mid_percentile = 9; optional float mid_percentile = 10; optional float high_mid_percentile = 11; optional float high_percentile = 12; // If set, all models are estimated in log domain, specifically // intensity I is transformed via log(1.0 + I) := I' // Consequently after apply the models, intensity needs to be transformed // back to visible range via exp(I') - 1.0. optional bool log_domain = 13 [default = false]; // ToneChange type indicates whether highest degree of freedom (DOF) // model estimation was deemed stable, in which case ToneChange::Type is set // to VALID. // If a model was deemed not stable (according to *StabilityBounds in // ToneEstimationOptions), it is set to the lower dof type which was deemed // stable. enum Type { VALID = 0; INVALID = 10; // Identity model, gain bias unrealiable. } optional Type type = 14 [default = VALID]; // Stats based on stability analysis. message StabilityStats { // Number of tone matches that were iniliers (used for tone estimation). optional int32 num_inliers = 1; // Fraction of tone matches that were inliers. optional float inlier_fraction = 2; // Total IRLS weight summed over all inliers. optional double inlier_weight = 3; } optional StabilityStats stability_stats = 15; } message ToneMatchOptions { // ToneChange's are fit to ToneMatches extracted from matching patches, using // order statistics of their corresponding intensities. Matches are defined by // having the same percentile of ordered intensities. If any member of the // ToneMatch is below under or above over-exposed the match is discarded // (based on parameters min and max_exposure above). // Matches are extracted from min_match_percentile to max_match_percentile in // #match_percentile_steps equidistant steps. optional float min_match_percentile = 1 [default = 0.01]; optional float max_match_percentile = 2 [default = 0.99]; optional int32 match_percentile_steps = 3 [default = 10]; // Patch radius from which order statistics are collected. optional int32 patch_radius = 4 [default = 18]; // Only matches with not too many pixels over- or underexposed are used. optional float max_frac_clipped = 5 [default = 0.4]; // If set matches will be collected in the log domain. optional bool log_domain = 8 [default = false]; } message ClipMaskOptions { // Over/Under exposure setting. Pixels that are clipped due to limited // dynamic range are masked out from analysis. Values specified w.r.t. // [0, 1] range. optional float min_exposure = 1 [default = 0.02]; optional float max_exposure = 2 [default = 0.98]; // A pixel can have clipped color values in atmost max_clipped_channels before // it will be labeled as clipped. optional int32 max_clipped_channels = 4 [default = 1]; // Over-exposure tends to show blooming (neighboring pixels are affected by // over-exposure as well). For robustness mask of clipped pixels is dilated // with structuring element of diameter clip_mask_diam. optional int32 clip_mask_diameter = 5 [default = 5]; } // Next tag: 13 message ToneEstimationOptions { optional ToneMatchOptions tone_match_options = 1; optional ClipMaskOptions clip_mask_options = 2; // Percentiles for tone statistics. optional float stats_low_percentile = 3 [default = 0.05]; optional float stats_low_mid_percentile = 4 [default = 0.2]; optional float stats_mid_percentile = 5 [default = 0.5]; optional float stats_high_mid_percentile = 6 [default = 0.8]; optional float stats_high_percentile = 7 [default = 0.95]; optional int32 irls_iterations = 8 [default = 10]; message GainBiasBounds { optional float min_inlier_fraction = 1 [default = 0.75]; // Accept 2% intensity difference as valid inlier. optional float min_inlier_weight = 2 [default = 0.5]; optional float lower_gain = 3 [default = 0.75]; optional float upper_gain = 4 [default = 1.334]; optional float lower_bias = 5 [default = -0.2]; optional float upper_bias = 6 [default = 0.2]; } optional GainBiasBounds stable_gain_bias_bounds = 9; // We support down-sampling of an incoming frame before running the // resolution dependent part of the tone estimation. // tracking if desired). enum DownsampleMode { DOWNSAMPLE_NONE = 1; // no downsampling. DOWNSAMPLE_TO_MAX_SIZE = 2; // downsizes frame such that frame_size == // downsampling_size. // frame_size := max(width, height). DOWNSAMPLE_BY_FACTOR = 3; // downsizes frame by pre-defined factor. DOWNSAMPLE_TO_MIN_SIZE = 4; // downsizes frame such that frame_size == // downsampling_size. // frame_size := min(width, height). } optional DownsampleMode downsample_mode = 10 [default = DOWNSAMPLE_NONE]; // Specify the size of either dimension here, the frame will be // downsampled to fit downsampling_size. optional int32 downsampling_size = 11 [default = 256]; optional float downsample_factor = 12 [default = 2.0]; } message ToneMatch { // Intensity in current frame. optional float curr_val = 1; // Matching intensity in previous frame. optional float prev_val = 2; } message PatchToneMatch { // Several intensity matches computed from equal percentiles of matching patch // pairs. No number or particular ordering is assumed. repeated ToneMatch tone_match = 1; optional float irls_weight = 2 [default = 1.0]; }