/******************************************************************************* * Copyright 2014 Analog Devices, Inc. * * 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. ********************************************************************************/ package com.analog.lyric.dimple.benchmarks.stereoVision; import java.io.IOException; import com.analog.lyric.benchmarking.Benchmark; import com.analog.lyric.benchmarking.utils.doublespace.DoubleSpace; import com.analog.lyric.benchmarking.utils.functional.Functions; import com.analog.lyric.dimple.benchmarks.utils.Image; import com.analog.lyric.dimple.model.core.FactorGraph; import com.analog.lyric.dimple.options.BPOptions; import com.analog.lyric.dimple.solvers.gibbs.GibbsOptions; import com.analog.lyric.dimple.solvers.gibbs.GibbsSolver; import com.analog.lyric.dimple.solvers.minsum.MinSumSolver; import com.analog.lyric.dimple.solvers.optimizedupdate.UpdateApproach; import com.analog.lyric.dimple.solvers.sumproduct.SumProductSolver; @SuppressWarnings({"null", "deprecation"}) public class StereoVisionBenchmark { private final boolean saveResult = false; @Benchmark(warmupIterations = 0, iterations = 2) public boolean stereoVisionArtScaledGibbs() { FactorGraph fg = new FactorGraph(); fg.setSolverFactory(new GibbsSolver()); fg.setOption(GibbsOptions.numSamples, 100); depthInference(fg, "art_scaled", 75, "gibbs"); return false; } @Benchmark(warmupIterations = 0, iterations = 2) public boolean stereoVisionArtScaledSumProduct() { FactorGraph fg = new FactorGraph(); fg.setSolverFactory(new SumProductSolver()); fg.setOption(BPOptions.iterations, 10); fg.setOption(BPOptions.updateApproach, UpdateApproach.NORMAL); depthInference(fg, "art_scaled", 75, "sumproduct"); return false; } @Benchmark(warmupIterations = 0, iterations = 2) public boolean stereoVisionArtScaledSumProductOptimized() { FactorGraph fg = new FactorGraph(); fg.setSolverFactory(new SumProductSolver()); fg.setOption(BPOptions.iterations, 10); fg.setOption(BPOptions.updateApproach, UpdateApproach.OPTIMIZED); depthInference(fg, "art_scaled", 75, "sumproduct"); return false; } @Benchmark(warmupIterations = 0, iterations = 2) public boolean stereoVisionArtScaledMinSum() { FactorGraph fg = new FactorGraph(); fg.setSolverFactory(new MinSumSolver()); fg.setOption(BPOptions.iterations, 10); depthInference(fg, "art_scaled", 75, "minsum"); fg.setOption(BPOptions.updateApproach, UpdateApproach.NORMAL); return false; } @Benchmark(warmupIterations = 0, iterations = 2) public boolean stereoVisionArtScaledMinSumOptimized() { FactorGraph fg = new FactorGraph(); fg.setSolverFactory(new MinSumSolver()); fg.setOption(BPOptions.iterations, 10); depthInference(fg, "art_scaled", 75, "minsum"); fg.setOption(BPOptions.updateApproach, UpdateApproach.OPTIMIZED); return false; } @SuppressWarnings("unused") private void depthInference(FactorGraph fg, String dataSetName, int depth, String saveLabel) { try { Dataset dataset = new Dataset(dataSetName); StereoVisionGraph stereoVisionGraph = new StereoVisionGraph(fg, depth, dataset.getImageL(), dataset.getImageR()); fg.solve(); if (saveResult && saveLabel != null) { DoubleSpace result = stereoVisionGraph.getValueImage(); Functions.normalize(result).transform(Image.contrastCurve); String resultPath = String.format("%s_%s.png", dataSetName, saveLabel); Image.save(resultPath, result); } double score = fg.getScore(); } catch (IOException ex) { throw new RuntimeException(ex); } } }