1 | % * This code was used in the following articles:
|
---|
2 | % * [1] Learning 3-D Scene Structure from a Single Still Image,
|
---|
3 | % * Ashutosh Saxena, Min Sun, Andrew Y. Ng,
|
---|
4 | % * In ICCV workshop on 3D Representation for Recognition (3dRR-07), 2007.
|
---|
5 | % * (best paper)
|
---|
6 | % * [2] 3-D Reconstruction from Sparse Views using Monocular Vision,
|
---|
7 | % * Ashutosh Saxena, Min Sun, Andrew Y. Ng,
|
---|
8 | % * In ICCV workshop on Virtual Representations and Modeling
|
---|
9 | % * of Large-scale environments (VRML), 2007.
|
---|
10 | % * [3] 3-D Depth Reconstruction from a Single Still Image,
|
---|
11 | % * Ashutosh Saxena, Sung H. Chung, Andrew Y. Ng.
|
---|
12 | % * International Journal of Computer Vision (IJCV), Aug 2007.
|
---|
13 | % * [6] Learning Depth from Single Monocular Images,
|
---|
14 | % * Ashutosh Saxena, Sung H. Chung, Andrew Y. Ng.
|
---|
15 | % * In Neural Information Processing Systems (NIPS) 18, 2005.
|
---|
16 | % *
|
---|
17 | % * These articles are available at:
|
---|
18 | % * http://make3d.stanford.edu/publications
|
---|
19 | % *
|
---|
20 | % * We request that you cite the papers [1], [3] and [6] in any of
|
---|
21 | % * your reports that uses this code.
|
---|
22 | % * Further, if you use the code in image3dstiching/ (multiple image version),
|
---|
23 | % * then please cite [2].
|
---|
24 | % *
|
---|
25 | % * If you use the code in third_party/, then PLEASE CITE and follow the
|
---|
26 | % * LICENSE OF THE CORRESPONDING THIRD PARTY CODE.
|
---|
27 | % *
|
---|
28 | % * Finally, this code is for non-commercial use only. For further
|
---|
29 | % * information and to obtain a copy of the license, see
|
---|
30 | % *
|
---|
31 | % * http://make3d.stanford.edu/publications/code
|
---|
32 | % *
|
---|
33 | % * Also, the software distributed under the License is distributed on an
|
---|
34 | % * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
|
---|
35 | % * express or implied. See the License for the specific language governing
|
---|
36 | % * permissions and limitations under the License.
|
---|
37 | % *
|
---|
38 | % */
|
---|
39 | function []=PredictPlane(DepthDirectory,logScale,SkyExclude) |
---|
40 | %this function generate the predicted plane |
---|
41 | |
---|
42 | |
---|
43 | % define global variable |
---|
44 | global GeneralDataFolder ScratchDataFolder LocalFolder ClusterExecutionDirectory... |
---|
45 | ImgFolder VertYNuPatch VertYNuDepth HoriXNuPatch HoriXNuDepth a_default b_default Ox_default Oy_default... |
---|
46 | Horizon_default filename batchSize NuRow_default SegVertYSize SegHoriXSize WeiBatchSize; |
---|
47 | |
---|
48 | % load data |
---|
49 | load([ScratchDataFolder '/data/LowResImgIndexSuperpixelSep.mat']); % load LowResImgIndexSuperpixelSep |
---|
50 | load([ScratchDataFolder '/data/DiffLowResImgIndexSuperpixelSep.mat']); % load DiffLowResImgIndexSuperpixelSep(medi$large) |
---|
51 | load([ScratchDataFolder '/data/TextLowResImgIndexSuperpixelSep.mat']); % load TextLowResImgIndexSuperpixelSep using Textrea |
---|
52 | load([ScratchDataFolder '/data/MaskGSky.mat']); % load maskg maskSky from CMU's output |
---|
53 | %load([ScratchDataFolder '/data/maskO.mat']); |
---|
54 | % load useful features |
---|
55 | load([ScratchDataFolder '/data/FeatureSuperpixel.mat']); % load the feature relate to position and shape of superpixe |
---|
56 | |
---|
57 | % prepare to store the predictedM |
---|
58 | system(['mkdir ' ScratchDataFolder '/_predicted_' DepthDirectory]); |
---|
59 | |
---|
60 | % set parameter |
---|
61 | ZTiltFactor = 1; % both can be estimated after group fit that estimate the Norm_floor |
---|
62 | YTiltFactor = 1; |
---|
63 | % initial parameter |
---|
64 | NuPics = size(filename,2); |
---|
65 | for i = 1 : NuPics |
---|
66 | i |
---|
67 | % load picsinfo just for the horizontal value |
---|
68 | PicsinfoName = strrep(filename{i},'img','picsinfo'); |
---|
69 | temp = dir([GeneralDataFolder '/PicsInfo/' PicsinfoName '.mat']); |
---|
70 | if size(temp,1) == 0 |
---|
71 | a = a_default; |
---|
72 | b = b_default; |
---|
73 | Ox = Ox_default; |
---|
74 | Oy = Oy_default; |
---|
75 | Horizon = Horizon_default; |
---|
76 | else |
---|
77 | eload([GeneralDataFolder '/PicsInfo/' PicsinfoName '.mat']); |
---|
78 | end |
---|
79 | |
---|
80 | % load useful feature |
---|
81 | BatchNumber = ceil(i/batchSize); |
---|
82 | PicsNumber = mod(i,batchSize); |
---|
83 | if PicsNumber ==0 |
---|
84 | PicsNumber = 10; |
---|
85 | end |
---|
86 | % load([ScratchDataFolder '/data/feature_sqrt_H4_ray' int2str(BatchNumber) '.mat']); % 'f' |
---|
87 | % f = f{PicsNumber}; |
---|
88 | % f = f(:,1); |
---|
89 | % fsup = FeatureSuperpixel{i}; |
---|
90 | % f = (fsup(1,f))'; |
---|
91 | |
---|
92 | % load depthMap |
---|
93 | depthfile = strrep(filename{i},'img','depth_learned'); % the depth filename |
---|
94 | if logScale == 1 |
---|
95 | if SkyExclude ==1 |
---|
96 | load([ScratchDataFolder '/_LearnDLogScaleNonsky_' DepthDirectory '/' depthfile '.mat']); |
---|
97 | else |
---|
98 | load([ScratchDataFolder '/_LearnDLogScale_' DepthDirectory '/' depthfile '.mat']); |
---|
99 | end |
---|
100 | else |
---|
101 | if SkyExclude ==1 |
---|
102 | load([ScratchDataFolder '/_LearnD_' DepthDirectory '/' depthfile '.mat']); |
---|
103 | else |
---|
104 | load([ScratchDataFolder '/_LearnD_' DepthDirectory '/' depthfile '.mat']); |
---|
105 | end |
---|
106 | end |
---|
107 | |
---|
108 | LearnedDepth = depthMap; clear depthMap; |
---|
109 | |
---|
110 | % initialize parameter |
---|
111 | NuPatch = VertYNuDepth*HoriXNuDepth; |
---|
112 | |
---|
113 | % generate straight line for straight line prior |
---|
114 | Img = imread([GeneralDataFolder '/' ImgFolder '/' filename{i} '.jpg'],'jpg'); |
---|
115 | if prod(size(Img))> SegVertYSize*SegHoriXSize*3 |
---|
116 | Img = imresize(Img,[SegVertYSize SegHoriXSize],'nearest'); |
---|
117 | end |
---|
118 | [ImgYSize ImgXSize dummy] = size(Img); |
---|
119 | [lineSegList] = edgeSegDetection(Img); |
---|
120 | NuSeg = size(lineSegList,1); |
---|
121 | % order the line segment by their length |
---|
122 | lineSegList = lineSegList./repmat([ImgXSize ImgYSize ImgXSize ImgYSize],NuSeg,1)... |
---|
123 | .*repmat([HoriXNuDepth VertYNuDepth HoriXNuDepth VertYNuDepth],NuSeg,1); |
---|
124 | |
---|
125 | % take out the vertical edge so that we may combine it with 1stSmooth in Y direction |
---|
126 | VertLineSegList = lineSegList(abs(round(lineSegList(:,1))-round(lineSegList(:,3))) <=0 & ... |
---|
127 | abs(round(lineSegList(:,2))-round(lineSegList(:,4))) > 0 ,:); |
---|
128 | VertLineSegList = round(VertLineSegList); |
---|
129 | NuVertSeg = size(VertLineSegList,1); |
---|
130 | VertLineMask = zeros(VertYNuDepth, HoriXNuDepth); |
---|
131 | for k = 1:NuVertSeg |
---|
132 | if VertLineSegList(k,2) < VertLineSegList(k,4) |
---|
133 | VertLineMask(max(VertLineSegList(k,2),1):min((VertLineSegList(k,4)-1),VertYNuDepth),... |
---|
134 | min(max(VertLineSegList(k,1),1),HoriXNuDepth)) = 1; |
---|
135 | else |
---|
136 | VertLineMask(max(VertLineSegList(k,4),1):min((VertLineSegList(k,2)-1),VertYNuDepth),... |
---|
137 | min(max(VertLineSegList(k,1),1),HoriXNuDepth)) = 1; |
---|
138 | end |
---|
139 | end |
---|
140 | |
---|
141 | [StraightLinePriorSelectMatrix RayPorjectImgMapY LineIndex newd] = StraightLinePrior(lineSegList,LearnedDepth,a,b,Ox,Oy); |
---|
142 | % |
---|
143 | % generate ray porjection position in the image plane |
---|
144 | RayPorjectImgMapY = ((VertYNuDepth+1-RayPorjectImgMapY)-0.5)/VertYNuDepth - Oy; |
---|
145 | RayPorjectImgMapX = repmat(((1:HoriXNuDepth)-0.5)/HoriXNuDepth - Ox,[VertYNuDepth 1]); |
---|
146 | % generate specific ray for whole pics |
---|
147 | RayCenter = RayImPosition(RayPorjectImgMapY,RayPorjectImgMapX,a,b,Ox,Oy); %[ horiXSizeLowREs VertYSizeLowREs 3] |
---|
148 | Rx = RayCenter(:,:,1); |
---|
149 | Rx = Rx(:); |
---|
150 | Ry = RayCenter(:,:,2); |
---|
151 | Ry = Ry(:); |
---|
152 | Rz = RayCenter(:,:,3); |
---|
153 | Rz = Rz(:); |
---|
154 | |
---|
155 | %===================================================== |
---|
156 | % MRF reshape the 3d cloud |
---|
157 | |
---|
158 | NuSupType = size(LowResImgIndexSuperpixelSep,2)+size(DiffLowResImgIndexSuperpixelSep,2)... |
---|
159 | +size(TextLowResImgIndexSuperpixelSep,2)*size(TextLowResImgIndexSuperpixelSep,3); |
---|
160 | |
---|
161 | for j = 1:NuSupType % total 21 seg : 3 RGB 6*3= 18 texture filters |
---|
162 | |
---|
163 | % pick the specific segmentation |
---|
164 | if j==1 |
---|
165 | sup = LowResImgIndexSuperpixelSep{i,1}; |
---|
166 | elseif j<=3 |
---|
167 | sup = DiffLowResImgIndexSuperpixelSep{i,j-1}; |
---|
168 | else |
---|
169 | Subm = mod((j-3),6); |
---|
170 | if Subm==0 |
---|
171 | Subm=6; |
---|
172 | end |
---|
173 | sup = TextLowResImgIndexSuperpixelSep{i,Subm,ceil((j-3)/6)}; |
---|
174 | end |
---|
175 | |
---|
176 | % Exclude the sky first |
---|
177 | sup(maskSky{i} == 1) = 0; |
---|
178 | [SelectY{j} SelecrX{j} BM{j} Ns{j} MediaM{j} MeanM{j}] = OrientEst(sup, RayCenter); |
---|
179 | end |
---|
180 | |
---|
181 | % set weight for different segmentation |
---|
182 | small=10; med=5; large=1; |
---|
183 | temp =[small; med; large; small*ones(6,1); med*ones(6,1) ;large*ones(6,1)] |
---|
184 | |
---|
185 | % set weight for the VertLineSeg Ground and VertialWalls |
---|
186 | WeiLinSegVertWall = 112; |
---|
187 | WeiLinSegVertGround = 112; |
---|
188 | |
---|
189 | % set weight for the straight line prior |
---|
190 | WeiStraightLine = 1120 |
---|
191 | |
---|
192 | % generate the smooth matrix |
---|
193 | M2ndSmoothY = spdiags([ones(NuPatch,1) -2*ones(NuPatch,1) ones(NuPatch,1)],[-1 0 1],NuPatch,NuPatch); |
---|
194 | M2ndSmoothX = spdiags([ones(NuPatch,1) -2*ones(NuPatch,1) ones(NuPatch,1)],... |
---|
195 | [-VertYNuDepth 0 VertYNuDepth],NuPatch,NuPatch); |
---|
196 | M1stSmoothY = spdiags([ones(NuPatch,1) -ones(NuPatch,1)],[0 1],NuPatch,NuPatch); |
---|
197 | M1stSmoothX = spdiags([ones(NuPatch,1) -ones(NuPatch,1)],[0 VertYNuDepth],NuPatch,NuPatch); |
---|
198 | |
---|
199 | % generate beta |
---|
200 | % beta2ndSmoothGX = Wei2ndSmoothGX'*ones(21,1) * logisticResponse(Wei2ndSmoothGX'*SecXG / (Wei2ndSmoothGX'*ones(21,1)) ); |
---|
201 | beta2ndSmoothGX = Wei2ndSmoothGX'*SecXG; |
---|
202 | %MIN: TO DO |
---|
203 | %MIN: TO DO |
---|
204 | beta2ndSmoothGY = Wei2ndSmoothGY'*SecYG; |
---|
205 | % beta2ndSmoothGY = Wei2ndSmoothGY'*ones(21,1) * logisticResponse(Wei2ndSmoothGY'*SecYG / (Wei2ndSmoothGY'*ones(21,1)) ); |
---|
206 | beta2ndSmoothGY = Wei2ndSmoothGY'*SecYG; |
---|
207 | % beta2ndSmoothVX = Wei2ndSmoothVX'*ones(21,1) * logisticResponse(Wei2ndSmoothVX'*SecXV / (Wei2ndSmoothVX'*ones(21,1)) ); |
---|
208 | beta2ndSmoothVX = Wei2ndSmoothVX'*SecXV; |
---|
209 | % beta2ndSmoothVY = Wei2ndSmoothVY'*ones(21,1) * logisticResponse(Wei2ndSmoothVY'*SecYV / (Wei2ndSmoothVY'*ones(21,1)) ); |
---|
210 | beta2ndSmoothVY = Wei2ndSmoothVY'*SecYV; |
---|
211 | % beta2ndSmoothSX = Wei2ndSmoothSX'*ones(21,1) * logisticResponse(Wei2ndSmoothSX'*SecXS / (Wei2ndSmoothSX'*ones(21,1)) ); |
---|
212 | % beta2ndSmoothSY = Wei2ndSmoothSY'*ones(21,1) * logisticResponse(Wei2ndSmoothSY'*SecYS / (Wei2ndSmoothSY'*ones(21,1)) ); |
---|
213 | |
---|
214 | % beta1stSmoothGY = Wei1stSmoothGY'*ones(21,1)*logisticResponse(Wei1stSmoothGY'*FirstYG/(Wei1stSmoothGY'*ones(21,1)) ); |
---|
215 | beta1stSmoothGY = Wei2ndSmoothGY'*FirstYG; |
---|
216 | % beta1stSmoothVY = Wei1stSmoothVY'*ones(21,1)*logisticResponse(Wei1stSmoothVY'*FirstYV/(Wei1stSmoothVY'*ones(21,1)) ); |
---|
217 | beta1stSmoothVY = Wei2ndSmoothVY'*FirstYV; |
---|
218 | % beta1stSmoothSY = Wei1stSmoothSY'*ones(21,1)*logisticResponse(Wei1stSmoothSY'*FirstYS/(Wei1stSmoothSY'*ones(21,1)) ); |
---|
219 | % beta1stSmoothGX = Wei1stSmoothGX'*ones(21,1)*logisticResponse(Wei1stSmoothGX'*FirstXG/(Wei1stSmoothGX'*ones(21,1)) ); |
---|
220 | beta1stSmoothGX = Wei2ndSmoothGX'*FirstXG; |
---|
221 | % beta1stSmoothVX = Wei1stSmoothVX'*ones(21,1)*logisticResponse(Wei1stSmoothVX'*FirstXV/(Wei1stSmoothVX'*ones(21,1)) ); |
---|
222 | beta1stSmoothVX = Wei2ndSmoothVX'*FirstXV; |
---|
223 | % beta1stSmoothSX = Wei1stSmoothSX'*ones(21,1)*logisticResponse(Wei1stSmoothSX'*FirstXS/(Wei1stSmoothSX'*ones(21,1)) ); |
---|
224 | |
---|
225 | Beta1stSmoothLineGY = VertLineMask.*(maskEstGVS==1)*WeiLinSegVertGround; |
---|
226 | Beta1stSmoothLineGY = (Beta1stSmoothLineGY(:))'; |
---|
227 | Beta1stSmoothLineVWY = VertLineMask.*(maskEstGVS==2)*WeiLinSegVertWall; |
---|
228 | Beta1stSmoothLineVWY = (Beta1stSmoothLineVWY(:))'; |
---|
229 | |
---|
230 | % generate Q |
---|
231 | % Q2ndXx = spdiags((beta2ndSmoothGX+beta2ndSmoothVX+beta2ndSmoothSX)'... |
---|
232 | % ,0,NuPatch,NuPatch)*M2ndSmoothX*spdiags(Rx,0,NuPatch,NuPatch); |
---|
233 | % Q2ndXy = spdiags((beta2ndSmoothGX+beta2ndSmoothVX+beta2ndSmoothSX)'... |
---|
234 | % ,0,NuPatch,NuPatch)*M2ndSmoothX*spdiags(Ry,0,NuPatch,NuPatch); |
---|
235 | % Q2ndXz = spdiags((beta2ndSmoothGX+beta2ndSmoothVX+beta2ndSmoothSX)'... |
---|
236 | % ,0,NuPatch,NuPatch)*M2ndSmoothX*spdiags(Rz,0,NuPatch,NuPatch); |
---|
237 | % Q2ndYx = spdiags((beta2ndSmoothGY+beta2ndSmoothVY+beta2ndSmoothSY)'... |
---|
238 | % ,0,NuPatch,NuPatch)*M2ndSmoothY*spdiags(Rx,0,NuPatch,NuPatch); |
---|
239 | % Q2ndYy = spdiags((beta2ndSmoothGY+beta2ndSmoothVY+beta2ndSmoothSY)'... |
---|
240 | % ,0,NuPatch,NuPatch)*M2ndSmoothY*spdiags(Ry,0,NuPatch,NuPatch); |
---|
241 | % Q2ndYz = spdiags((beta2ndSmoothGY+beta2ndSmoothVY+beta2ndSmoothSY)'... |
---|
242 | % ,0,NuPatch,NuPatch)*M2ndSmoothY*spdiags(Rz,0,NuPatch,NuPatch); |
---|
243 | |
---|
244 | Q2ndXx = spdiags((beta2ndSmoothGX+beta2ndSmoothVX)'... |
---|
245 | ,0,NuPatch,NuPatch)*M2ndSmoothX*spdiags(Rx,0,NuPatch,NuPatch); |
---|
246 | Q2ndXy = spdiags((beta2ndSmoothGX+beta2ndSmoothVX)'... |
---|
247 | ,0,NuPatch,NuPatch)*M2ndSmoothX*spdiags(Ry,0,NuPatch,NuPatch); |
---|
248 | %Q2ndXz = spdiags((beta2ndSmoothGX+beta2ndSmoothVX)'... |
---|
249 | % ,0,NuPatch,NuPatch)*M2ndSmoothX*spdiags(Rz,0,NuPatch,NuPatch); |
---|
250 | Q2ndXz = spdiags((beta2ndSmoothVX)'... |
---|
251 | ,0,NuPatch,NuPatch)*M2ndSmoothX*spdiags(Rz,0,NuPatch,NuPatch); |
---|
252 | Q2ndYx = spdiags((beta2ndSmoothGY+beta2ndSmoothVY)'... |
---|
253 | ,0,NuPatch,NuPatch)*M2ndSmoothY*spdiags(Rx,0,NuPatch,NuPatch); |
---|
254 | Q2ndYy = spdiags((beta2ndSmoothGY+beta2ndSmoothVY)'... |
---|
255 | ,0,NuPatch,NuPatch)*M2ndSmoothY*spdiags(Ry,0,NuPatch,NuPatch); |
---|
256 | %Q2ndYz = spdiags((beta2ndSmoothGY+beta2ndSmoothVY)'... |
---|
257 | % ,0,NuPatch,NuPatch)*M2ndSmoothY*spdiags(Rz,0,NuPatch,NuPatch); |
---|
258 | Q2ndYz = spdiags((beta2ndSmoothVY)'... |
---|
259 | ,0,NuPatch,NuPatch)*M2ndSmoothY*spdiags(Rz,0,NuPatch,NuPatch); |
---|
260 | |
---|
261 | Q2ndLinex = WeiStraightLine*StraightLinePriorSelectMatrix*spdiags(Rx,0,NuPatch,NuPatch); |
---|
262 | Q2ndLiney = WeiStraightLine*StraightLinePriorSelectMatrix*spdiags(Ry,0,NuPatch,NuPatch); |
---|
263 | Q2ndLinez = WeiStraightLine*StraightLinePriorSelectMatrix*spdiags(Rz,0,NuPatch,NuPatch); |
---|
264 | |
---|
265 | % Q1stYz = spdiags((beta1stSmoothVY+beta1stSmoothSY+Beta1stSmoothLineVWY)'... |
---|
266 | % ,0,NuPatch,NuPatch)*M1stSmoothY*spdiags(Rz*ZTiltFactor,0,NuPatch,NuPatch); |
---|
267 | %Q1stYz = spdiags((Beta1stSmoothLineVWY)'... |
---|
268 | % ,0,NuPatch,NuPatch)*M1stSmoothY*spdiags(Rz*ZTiltFactor,0,NuPatch,NuPatch); |
---|
269 | % Q1stYy = spdiags((beta1stSmoothGY+Beta1stSmoothLineGY)'... |
---|
270 | % ,0,NuPatch,NuPatch)*M1stSmoothY*spdiags(Ry*YTiltFactor,0,NuPatch,NuPatch); |
---|
271 | % Q1stXz = spdiags((beta1stSmoothGX+beta1stSmoothVX+beta1stSmoothSX)'... |
---|
272 | % ,0,NuPatch,NuPatch)*M1stSmoothX*spdiags(Rz*ZTiltFactor,0,NuPatch,NuPatch); |
---|
273 | |
---|
274 | |
---|
275 | %Q1stYz = spdiags((beta1stSmoothVY+Beta1stSmoothLineVWY)'... |
---|
276 | % ,0,NuPatch,NuPatch)*M1stSmoothY*spdiags(Rz*ZTiltFactor,0,NuPatch,NuPatch); |
---|
277 | Q1stYz = spdiags((beta1stSmoothVY+Beta1stSmoothLineVWY)'... |
---|
278 | ,0,NuPatch,NuPatch)*M1stSmoothY*spdiags(Rz*ZTiltFactor,0,NuPatch,NuPatch); |
---|
279 | Q1stYy = spdiags((beta1stSmoothGY+Beta1stSmoothLineGY)'... |
---|
280 | ,0,NuPatch,NuPatch)*M1stSmoothY*spdiags(Ry*YTiltFactor,0,NuPatch,NuPatch); |
---|
281 | Q1stXz = spdiags((beta1stSmoothGX+beta1stSmoothVX)'... |
---|
282 | ,0,NuPatch,NuPatch)*M1stSmoothX*spdiags(Rz*ZTiltFactor,0,NuPatch,NuPatch); |
---|
283 | % ============================START MRF OPTMIZATIOM========================================================= |
---|
284 | %================= |
---|
285 | % generate mask for depth difference |
---|
286 | YDiff = repmat(logical([ones(VertYNuDepth-1,1); 0]),1,HoriXNuDepth); |
---|
287 | XDiff = repmat(([ones(1,HoriXNuDepth-1) 0]),VertYNuDepth,1); |
---|
288 | DMatrixY = spdiags([ones(NuPatch,1) -ones(NuPatch,1)],[0 1],NuPatch,NuPatch); |
---|
289 | %DMatrixY = DMatrixY(~maskO,:); |
---|
290 | DMatrixX = spdiags([ones(NuPatch,1) -ones(NuPatch,1)],[0 VertYNuDepth],NuPatch,NuPatch); |
---|
291 | %================= |
---|
292 | tic; |
---|
293 | % lineprog =========================================== |
---|
294 | % B = [DMatrixY;spdiags(maskO(:),[0],NuPatch,NuPatch)]; |
---|
295 | % Q = [Q2ndXz;Q2ndYz]; |
---|
296 | % A = [B -speye(size(B,1)) sparse(size(B,1),size(Q,1));... |
---|
297 | % -B -speye(size(B,1)) sparse(size(B,1),size(Q,1));... |
---|
298 | % Q sparse(size(Q,1),size(B,1)) -speye(size(Q,1));... |
---|
299 | % -Q sparse(size(Q,1),size(B,1)) -speye(size(Q,1));... |
---|
300 | % -speye(NuPatch) sparse(NuPatch,size(B,1)+size(Q,1))]; |
---|
301 | % bb = [B*LearnedDepth(:); - B*LearnedDepth(:);... |
---|
302 | % sparse(size(Q,1)*2,1); -5*ones(NuPatch,1)]; |
---|
303 | % f = [sparse(NuPatch,1); ones(size(B,1)+size(Q,1),1)]; |
---|
304 | % x = linprog(f,A,bb); |
---|
305 | %===================================================== |
---|
306 | |
---|
307 | % quadprog =========================================== |
---|
308 | % only 2nd order smooth use L1 norm |
---|
309 | Q1size = size([Q1stYy; Q1stYz;Q1stXz],1) |
---|
310 | SLsize = size(Q2ndLinez,1) |
---|
311 | Bsize = size([Q2ndXz;Q2ndYz],1) |
---|
312 | % E = [Q1stYy ;Q1stYz; Q1stXz;... |
---|
313 | % spdiags(ones(NuPatch,1),[0],NuPatch,NuPatch);... |
---|
314 | % Q2ndLinez]; |
---|
315 | % e = [sparse(Q1size,1); -LearnedDepth(:); sparse(SLsize,1)]; |
---|
316 | % B = [Q2ndXz ; Q2ndYz]; |
---|
317 | % H = 2*[[Q1stYy;Q1stYz; Q1stXz;... |
---|
318 | % spdiags(ones(NuPatch,1),[0],NuPatch,NuPatch);Q2ndLinez]'*... |
---|
319 | % [Q1stYy;Q1stYz; Q1stXz;... |
---|
320 | % spdiags(ones(NuPatch,1),[0],NuPatch,NuPatch);Q2ndLinez] sparse(NuPatch,Bsize*3);... |
---|
321 | % sparse(Bsize*3,NuPatch+Bsize*3)]; |
---|
322 | % f =[2*[sparse(Q1size,1); -LearnedDepth(:); sparse(SLsize,1)]'*... |
---|
323 | % [Q1stYy;Q1stYz; Q1stXz... |
---|
324 | % spdiags(ones(NuPatch,1),[0],NuPatch,NuPatch); Q2ndLinez] ones(1,Bsize) sparse(1,Bsize*2)]'; |
---|
325 | % Aeq = [[Q2ndXz ; Q2ndYz] -spdiags(ones(Bsize,1),[0],Bsize,Bsize)... |
---|
326 | % spdiags(ones(Bsize,1),[0],Bsize,Bsize) sparse(Bsize,Bsize);... |
---|
327 | % [Q2ndXz ; Q2ndYz] spdiags(ones(Bsize,1),[0],Bsize,Bsize)... |
---|
328 | % sparse(Bsize,Bsize) spdiags(ones(Bsize,1),[0],Bsize,Bsize)]; |
---|
329 | % beq = sparse(Bsize*2,1); |
---|
330 | % lb = [5*ones(NuPatch,1);sparse(Bsize*2,1);... |
---|
331 | % -2*max(LearnedDepth(:))*ones(Bsize,1)]; |
---|
332 | % ub = [max(LearnedDepth(:))*ones(NuPatch,1);... |
---|
333 | % 2*max(LearnedDepth(:))*ones(Bsize*2,1); sparse(Bsize,1)]; |
---|
334 | % options = optimset('LargeScale', 'on', 'Display', 'off'); |
---|
335 | % x = quadprog(H,f,[],[],Aeq,beq,lb,ub,[],options); |
---|
336 | % predictedM = [spdiags(ones(NuPatch,1),[0],NuPatch,NuPatch)... |
---|
337 | % sparse(NuPatch,Bsize*3)]*x; |
---|
338 | % A = [sparse(Bsize*2,NuPatch+Bsize)... |
---|
339 | % spdiags([-ones(Bsize,1);ones(Bsize,1)],[0],Bsize*2,Bsize*2)]; |
---|
340 | % b =sparse(Bsize*2,1); |
---|
341 | %===================================================== |
---|
342 | % predictedM = spdiags([ones(1,NuPatch) sparse(1,size(B,1)+size(Q,1))]',0,NuPatch... |
---|
343 | % ,NuPatch+size(B,1)+size(Q,1))*x; |
---|
344 | % predictedM = (LearnedDepth(:)); |
---|
345 | |
---|
346 | |
---|
347 | %[[Q2ndYz] -spdiags(ones(Bsize,1),[0],Bsize,Bsize)... |
---|
348 | % spdiags(ones(Bsize,1),[0],Bsize,Bsize) sparse(Bsize,Bsize);... |
---|
349 | % [Q2ndYz] spdiags(ones(Bsize,1),[0],Bsize,Bsize)... |
---|
350 | % sparse(Bsize,Bsize) spdiags(ones(Bsize,1),[0],Bsize,Bsize)]*[predictedM; kt; ga; al] == 0; |
---|
351 | |
---|
352 | % [Q2ndXz; Q2ndYz]*predictedM <=kt; |
---|
353 | % [Q2ndXz; Q2ndYz]*predictedM >= -kt; |
---|
354 | % predictedM>=5; |
---|
355 | %ga>=0; |
---|
356 | %al<=0; |
---|
357 | % cvx_end |
---|
358 | % toc; |
---|
359 | |
---|
360 | % post prosessing on straight line |
---|
361 | |
---|
362 | % second optimization |
---|
363 | |
---|
364 | Date =date; |
---|
365 | % predictedM =reshape(predictedM,VertYNuDepth,[]); |
---|
366 | % quadprog Start |
---|
367 | % LearnedDepth = single(LearnedDepth); |
---|
368 | cvx_begin |
---|
369 | cvx_quiet(false); |
---|
370 | variable predictedM(NuPatch,1); |
---|
371 | variable kt(Bsize,1); |
---|
372 | %variable al(Bsize,1); |
---|
373 | %variable ga(Bsize,1); |
---|
374 | variable st(1,1); |
---|
375 | minimize(st);%+ones(1,Bsize)*kt); |
---|
376 | norm([Q2ndYy; Q2ndYz; Q2ndXz; Q2ndLinez;... |
---|
377 | spdiags(ones(NuPatch,1),[0],NuPatch,NuPatch)]... |
---|
378 | *predictedM+[sparse(Q1size+SLsize,1); -LearnedDepth(:)])<=st; |
---|
379 | |
---|
380 | %[[Q2ndYz] -spdiags(ones(Bsize,1),[0],Bsize,Bsize)... |
---|
381 | % spdiags(ones(Bsize,1),[0],Bsize,Bsize) sparse(Bsize,Bsize);... |
---|
382 | % [Q2ndYz] spdiags(ones(Bsize,1),[0],Bsize,Bsize)... |
---|
383 | % sparse(Bsize,Bsize) spdiags(ones(Bsize,1),[0],Bsize,Bsize)]*[predictedM; kt; ga; al] == 0; |
---|
384 | |
---|
385 | % [Q2ndXz; Q2ndYz]*predictedM <=kt; |
---|
386 | % [Q2ndXz; Q2ndYz]*predictedM >= -kt; |
---|
387 | predictedM>=5; |
---|
388 | %ga>=0; |
---|
389 | %al<=0; |
---|
390 | cvx_end |
---|
391 | % toc; |
---|
392 | |
---|
393 | % post prosessing on straight line |
---|
394 | |
---|
395 | % second optimization |
---|
396 | |
---|
397 | Date =date; |
---|
398 | predictedM =reshape(predictedM,VertYNuDepth,[]); |
---|
399 | depthMap = predictedM; |
---|
400 | save([ScratchDataFolder '/_predicted_' DepthDirectory '/' depthfile '_' num2str(logScale) '_' Date '.mat'],'depthMap'); |
---|
401 | clear depthMap; |
---|
402 | |
---|
403 | %===================================================== |
---|
404 | % 2d to would 3d |
---|
405 | [Position3DPredicted] = im_cr2w_cr(predictedM,RayCenter); |
---|
406 | |
---|
407 | % generate new LowResImgIndexSuperpixelSep_deoffset |
---|
408 | %LowResImgIndexSuperpixelSep_deoffset = LowResImgIndexSuperpixelSep{i}; |
---|
409 | |
---|
410 | % add on image feature |
---|
411 | %global Imf; |
---|
412 | %Imf= cat(1,Position3DPredicted,permute(ones(VertY,1)*[1:HoriX],[3 1 2]), permute([1:VertY]'*ones(1,HoriX),[3 1 2]),permute(double(zeros(VertY,HoriX,3)),[3 1 2]),permute(double(LowResImgIndexSuperpixelSep_deoffset),[3 1 2]),permute(double(LowResImgIndexSuperpixelSep{i}),[3 1 2]) ); |
---|
413 | |
---|
414 | % calculate each plane parameter for each superpixel |
---|
415 | %[PlaneParameterPredicted] = fit_all_planes(RayLoResCorner); % hard work around 2min |
---|
416 | |
---|
417 | % generate VRML |
---|
418 | Date = date; |
---|
419 | [VrmlName] = vrml_test_faceset_triangle(filename{i},Position3DPredicted,RayCenter,['PredictM_' DepthDirectory '_' num2str(logScale) '_' num2str(SkyExclude) '_' Date '_LearnedLogScaleNonsky_PredictNonsky_L21st_L12ndSmooth_StraightLineDoblueStitchOrientEst_gravity'],a,b,Ox,Oy); |
---|
420 | system(['gzip -9 -c ' ScratchDataFolder '/vrml/' VrmlName ' > ' ScratchDataFolder '/vrml/' VrmlName '.gz']); |
---|
421 | delete([ScratchDataFolder '/vrml/' VrmlName]); |
---|
422 | %vrml_test_faceset_triangle(filename{i},PlaneParameterPredicted,LowResImgIndexSuperpixelSep{i},LowResImgIndexSuperpixelSep_deoffset,[DepthDirectory '_' Date]); |
---|
423 | end |
---|