197 lines
7.6 KiB
Protocol Buffer
197 lines
7.6 KiB
Protocol Buffer
// 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];
|
|
}
|