-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.xml
2311 lines (2154 loc) · 228 KB
/
search.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>《E题1.0》</title>
<url>/2022/10/06/HWB/</url>
<content><![CDATA[<!-- toc -->
<ul>
<li><a href="#%E9%97%AE%E9%A2%981">问题1</a></li>
<li><a href="#%E9%97%AE%E9%A2%982">问题2</a></li>
<li><a href="#%E9%97%AE%E9%A2%983">问题3</a></li>
<li><a href="#%E9%97%AE%E9%A2%984">问题4</a></li>
<li><a href="#%E9%97%AE%E9%A2%985">问题5</a></li>
<li><a href="#%E9%97%AE%E9%A2%986">问题6</a></li>
</ul>
<!-- tocstop -->
<span id="more"></span>
<h1><span id="问题1">问题1</span></h1><h4><span id="从机理分析的角度建立不同放牧策略放牧方式和放牧强度对锡林郭勒草原土壤物理性质主要是土壤湿度和植被生物量影响的数学模型">从机理分析的角度,建立不同放牧策略(放牧方式和放牧强度)对锡林郭勒草原土壤物理性质(主要是土壤湿度)和植被生物量影响的数学模型</span></h4><p>筛选出放牧策略(载畜量)、降水、地表蒸发量数据,套用下方公式</p>
<p>画出植被生物量和单位时间的曲线,可求出对应的单位时间的斜率,推出该时间S和w的关系;</p>
<p>土壤含水量同理,但要将α换成w的式子;</p>
<p>画出土壤含水量和单位时间的曲线,可求出对应的单位时间的斜率,推出该时间S和w的关系;</p>
<p>E(a)直接使用蒸发量代替</p>
<p><img src="/2022/10/06/HWB/image-20221006201807430.png" alt="image-20221006201807430"></p>
<h1><span id="问题2">问题2</span></h1><p>先时间序列自回归预测浅层因子,然后用这些浅层因子做自变量做多元回归;</p>
<p>其中可以使用前十年的单一月份数据,来预测后一年单一月份数据(建12个模型)</p>
<h1><span id="问题3">问题3</span></h1><h4><span id="从机理分析的角度建立不同放牧策略放牧方式和放牧强度对锡林郭勒草原土壤化学性质影响的数学模型-并请结合附件14中数据预测锡林郭勒草原监测样地12个放牧小区在不同放牧强度下2022年土壤同期有机碳-无机碳-全n-土壤cx2fn比等值并完成下表">从机理分析的角度,建立不同放牧策略(放牧方式和放牧强度)对锡林郭勒草原土壤化学性质影响的数学模型。并请结合附件14中数据预测锡林郭勒草原监测样地(12个放牧小区)在不同放牧强度下2022年土壤同期有机碳、无机碳、全N、土壤C/N比等值,并完成下表。</span></h4><p>时间序列自回归</p>
<h1><span id="问题4">问题4</span></h1><h4><span id="利用沙漠化程度指数预测模型和附件提供数据包括自己收集的数据确定不同放牧强度下监测点的沙漠化程度指数值">利用沙漠化程度指数预测模型和附件提供数据(包括自己收集的数据)确定不同放牧强度下监测点的沙漠化程度指数值。</span></h4><p>影响因子:风速、降水、气温(气象因素附件8);植被盖度(附件10或6或5)、地表水资源(附件9)、地下水位(附件9);人口数量、牲畜数量、社会经济水平(附件2)等等。</p>
<p>PCA加权累加</p>
<p><img src="/2022/10/06/HWB/image-20221006191041118.png" alt="image-20221006191041118"></p>
<h4><span id="并请尝试给出定量的土壤板结化定义">并请尝试给出定量的土壤板结化定义</span></h4><p><img src="/2022/10/06/HWB/image-20221006192120031.png" alt="image-20221006192120031"></p>
<h4><span id="在建立合理的土壤板结化模型基础上结合问题3给出放牧策略模型使得沙漠化程度指数与板结化程度最小">在建立合理的土壤板结化模型基础上结合问题3,给出放牧策略模型,使得沙漠化程度指数与板结化程度最小。</span></h4><p>带入第一题公式和板结化公式,求解S</p>
<h1><span id="问题5">问题5</span></h1><h4><span id="锡林郭勒草原近10的年降水量包含降雪通常在300-mm-~1200-mm之间请在给定的降水量300mm600mm-900-mm-和1200mm情形下在保持草原可持续发展情况下对实验草场内附件14-15放牧羊的数量进行求解找到最大阈值-注这里计算结果可以不是正整数">锡林郭勒草原近10的年降水量(包含降雪)通常在300 mm ~1200 mm之间,请在给定的降水量(300mm,600mm、900 mm 和1200mm)情形下,在保持草原可持续发展情况下对实验草场内(附件14、15)放牧羊的数量进行求解,找到最大阈值。(注:这里计算结果可以不是正整数)</span></h4><p>筛选出满足降水条件的年份对应的数据。</p>
<p><img src="/2022/10/06/HWB/image-20221006193918802.png" alt="image-20221006193918802"></p>
<h1><span id="问题6">问题6</span></h1><h4><span id="在保持附件13的示范牧户放牧策略不变和问题4中得到的放牧方案两种情况下用图示或者动态演示方式分别预测示范区2023年9月土地状态比如土壤肥力变化-土壤湿度-植被覆盖等">在保持附件13的示范牧户放牧策略不变和问题4中得到的放牧方案两种情况下,用图示或者动态演示方式分别预测示范区2023年9月土地状态(比如土壤肥力变化、土壤湿度、植被覆盖等)</span></h4><p>善男先做</p>
]]></content>
<categories>
<category>建模</category>
</categories>
<tags>
<tag>建模</tag>
</tags>
</entry>
<entry>
<title>施磊C++初级STL笔记</title>
<url>/2023/03/22/cpp_STL_note/</url>
<content><![CDATA[<!-- toc -->
<ul>
<li><a href="#c-stl%E5%88%86%E7%B1%BB">C++ STL分类</a><ul>
<li><a href="#%E4%B8%80-%E6%A0%87%E5%87%86%E5%AE%B9%E5%99%A8">一、标准容器</a><ul>
<li><a href="#1%E9%A1%BA%E5%BA%8F%E5%AE%B9%E5%99%A8">1.顺序容器</a></li>
<li><a href="#2%E5%AE%B9%E5%99%A8%E9%80%82%E9%85%8D%E5%99%A8">2.容器适配器</a></li>
<li><a href="#3%E5%85%B3%E8%81%94%E5%AE%B9%E5%99%A8">3.关联容器</a></li>
</ul>
</li>
<li><a href="#%E4%BA%8C-%E8%BF%91%E5%AE%B9%E5%99%A8">二、近容器</a></li>
<li><a href="#%E4%B8%89-%E8%BF%AD%E4%BB%A3%E5%99%A8">三、迭代器</a></li>
<li><a href="#%E5%9B%9B-%E5%87%BD%E6%95%B0%E5%AF%B9%E8%B1%A1">四、函数对象</a></li>
<li><a href="#%E4%BA%94-%E6%B3%9B%E5%9E%8B%E7%AE%97%E6%B3%95">五、泛型算法</a></li>
</ul>
</li>
<li><a href="#vector%E5%AE%B9%E5%99%A8">vector容器</a></li>
<li><a href="#deque%E5%AE%B9%E5%99%A8">deque容器</a></li>
<li><a href="#list%E5%AE%B9%E5%99%A8">list容器</a></li>
<li><a href="#%E5%AE%B9%E5%99%A8%E9%80%82%E9%85%8D%E5%99%A8">容器适配器</a></li>
<li><a href="#%E5%85%B3%E8%81%94%E5%AE%B9%E5%99%A8">关联容器</a></li>
<li><a href="#%E8%BF%AD%E4%BB%A3%E5%99%A8">迭代器</a></li>
<li><a href="#%E5%87%BD%E6%95%B0%E5%AF%B9%E8%B1%A1">函数对象</a></li>
<li><a href="#%E6%B3%9B%E5%9E%8B%E7%AE%97%E6%B3%95">泛型算法</a></li>
</ul>
<!-- tocstop -->
<span id="more"></span>
<h1><span id="c-stl分类">C++ STL分类</span></h1><h2><span id="一-标准容器">一、标准容器</span></h2><h3><span id="1顺序容器">1.顺序容器</span></h3><p>vector deque list</p>
<h3><span id="2容器适配器">2.容器适配器</span></h3><p>stack queue priority_queue</p>
<h3><span id="3关联容器">3.关联容器</span></h3><p>无序关联容器 链式哈希表 增删查O(1)</p>
<p>unordered_set unordered_multiset unordered_map unordered_multimap</p>
<p>有序关联容器</p>
<p>set multiset map multimap</p>
<h2><span id="二-近容器">二、近容器</span></h2><p>数组 string bitset</p>
<h2><span id="三-迭代器">三、迭代器</span></h2><p>iterator const_iterator</p>
<p>reverse_iterator const_reverse_iterator</p>
<h2><span id="四-函数对象">四、函数对象</span></h2><p>greater less</p>
<h2><span id="五-泛型算法">五、泛型算法</span></h2><p>sort find find_if binary_search for_each</p>
<h1><span id="vector容器">vector容器</span></h1><p><img src="/2023/03/22/cpp_STL_note/image-20230322224639551.png" alt="image-20230322224639551"></p>
<h1><span id="deque容器">deque容器</span></h1><p><img src="/2023/03/22/cpp_STL_note/image-20230322231048003.png" alt="image-20230322231048003"></p>
<p><img src="/2023/03/22/cpp_STL_note/image-20230322232359532.png" alt="image-20230322232359532"></p>
<h1><span id="list容器">list容器</span></h1><p><img src="/2023/03/22/cpp_STL_note/image-20230322232440404.png" alt="image-20230322232440404"></p>
<p><img src="/2023/03/22/cpp_STL_note/image-20230322232641231.png" alt="image-20230322232641231"></p>
<p><strong>vector、deque、list区别</strong></p>
<p><img src="/2023/03/22/cpp_STL_note/image-20230323102712597.png" alt="image-20230323102712597"></p>
<p><img src="/2023/03/22/cpp_STL_note/image-20230323102855340.png" alt="image-20230323102855340"></p>
<h1><span id="容器适配器">容器适配器</span></h1><p><img src="/2023/03/22/cpp_STL_note/image-20230323111005628.png" alt="image-20230323111005628"></p>
<p><img src="/2023/03/22/cpp_STL_note/image-20230323110945919.png" alt="image-20230323110945919"></p>
<h1><span id="关联容器">关联容器</span></h1><p><img src="/2023/03/22/cpp_STL_note/image-20230323111555262.png" alt="image-20230323111555262"></p>
<p><img src="/2023/03/22/cpp_STL_note/image-20230323111417256.png" alt="image-20230323111417256"></p>
<p><img src="/2023/03/22/cpp_STL_note/image-20230323112926253.png" alt="image-20230323112926253"></p>
<h1><span id="迭代器">迭代器</span></h1><p><img src="/2023/03/22/cpp_STL_note/image-20230323150210820.png" alt="image-20230323150210820"></p>
<p><img src="/2023/03/22/cpp_STL_note/image-20230323145614546.png" alt="image-20230323145614546"></p>
<p><img src="/2023/03/22/cpp_STL_note/image-20230323145734503.png" alt="image-20230323145734503"></p>
<p><img src="/2023/03/22/cpp_STL_note/image-20230323145949126.png" alt="image-20230323145949126"></p>
<h1><span id="函数对象">函数对象</span></h1><p><img src="/2023/03/22/cpp_STL_note/image-20230323152022993.png" alt="image-20230323152022993"></p>
<p>通过函数指针调用函数,是没有办法内联的,效率很低,因为没有函数调用开销。</p>
<p><strong>所以需要函数对象来代替函数指针</strong></p>
<p> <img src="/2023/03/22/cpp_STL_note/image-20230323152258041.png" alt="image-20230323152258041"></p>
<p><img src="/2023/03/22/cpp_STL_note/image-20230323152325846.png" alt="image-20230323152325846"></p>
<h1><span id="泛型算法">泛型算法</span></h1><p><img src="/2023/03/22/cpp_STL_note/image-20230323194139744.png" alt="image-20230323194139744"></p>
<p><img src="/2023/03/22/cpp_STL_note/image-20230323195045590.png" alt="image-20230323195045590"></p>
]]></content>
<categories>
<category>C++</category>
</categories>
<tags>
<tag>C++</tag>
</tags>
</entry>
<entry>
<title>《游戏资源中常见的贴图类型介绍》</title>
<url>/2023/07/12/link_1/</url>
<content><![CDATA[<!-- toc -->
<!-- tocstop -->
<span id="more"></span>
<p><a href="https://zhuanlan.zhihu.com/p/260973533">游戏资源中常见的贴图类型 - 知乎 (zhihu.com)</a></p>
]]></content>
<categories>
<category>link</category>
</categories>
<tags>
<tag>有用的博文</tag>
</tags>
</entry>
<entry>
<title>施磊C++初级笔记</title>
<url>/2023/03/20/cpp_basic_note/</url>
<content><![CDATA[<!-- toc -->
<ul>
<li><a href="#1-%E6%B7%B1%E5%85%A5%E5%AD%A6%E4%B9%A0c%E8%AF%AD%E8%A8%80%E5%85%88%E8%A6%81%E7%BB%83%E5%A5%BD%E7%9A%84%E5%86%85%E5%8A%9F">1 深入学习C++语言先要练好的内功</a><ul>
<li><a href="#11-%E6%8E%8C%E6%8F%A1%E8%BF%9B%E7%A8%8B%E8%99%9A%E6%8B%9F%E5%9C%B0%E5%9D%80%E7%A9%BA%E9%97%B4%E5%8C%BA%E5%9F%9F%E5%88%92%E5%88%86">1.1 掌握进程虚拟地址空间区域划分</a></li>
<li><a href="#12-%E4%BB%8E%E6%8C%87%E4%BB%A4%E8%A7%92%E5%BA%A6%E6%8E%8C%E6%8F%A1%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8%E5%A0%86%E6%A0%88%E8%AF%A6%E7%BB%86%E8%BF%87%E7%A8%8B">1.2 从指令角度掌握函数调用堆栈详细过程</a></li>
<li><a href="#13-%E4%BB%8E%E7%BC%96%E8%AF%91%E5%99%A8%E8%A7%92%E5%BA%A6%E7%90%86%E8%A7%A3c%E4%BB%A3%E7%A0%81%E7%9A%84%E7%BC%96%E8%AF%91%E5%92%8C%E9%93%BE%E6%8E%A5%E5%8E%9F%E7%90%86">1.3 从编译器角度理解C++代码的编译和链接原理</a></li>
</ul>
</li>
<li><a href="#2-c%E5%9F%BA%E7%A1%80">2 C++基础</a><ul>
<li><a href="#21-%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3newdelete">2.1 深入理解new,delete</a></li>
<li><a href="#22-c%E7%9A%84const">2.2 C++的const</a><ul>
<li><a href="#const%E6%80%8E%E4%B9%88%E7%90%86%E8%A7%A3">const怎么理解?</a></li>
<li><a href="#c%E5%92%8Cc%E4%B8%AD%E7%9A%84%E5%8C%BA%E5%88%AB%E6%98%AF%E4%BB%80%E4%B9%88">C和C++中的区别是什么?</a></li>
</ul>
</li>
<li><a href="#23-const%E5%92%8C%E4%B8%80%E4%BA%8C%E5%A4%9A%E7%BA%A7%E6%8C%87%E9%92%88%E7%9A%84%E7%BB%93%E5%90%88%E5%BA%94%E7%94%A8">2.3 const和一二(多)级指针的结合应用</a><ul>
<li><a href="#const%E4%BF%AE%E9%A5%B0%E7%9A%84%E9%87%8F%E5%B8%B8%E5%87%BA%E7%8E%B0%E7%9A%84%E9%94%99%E8%AF%AF">const修饰的量常出现的错误</a></li>
<li><a href="#const%E5%92%8C%E4%B8%80%E7%BA%A7%E6%8C%87%E9%92%88%E7%9A%84%E7%BB%93%E5%90%88">const和一级指针的结合</a></li>
<li><a href="#const%E5%92%8C%E4%BA%8C%E7%BA%A7%E6%8C%87%E9%92%88%E7%9A%84%E7%BB%93%E5%90%88">const和二级指针的结合</a></li>
</ul>
</li>
<li><a href="#24-c%E7%9A%84%E5%BC%95%E7%94%A8">2.4 C++的引用</a></li>
<li><a href="#25-%E5%87%BD%E6%95%B0%E9%87%8D%E8%BD%BD">2.5 函数重载</a></li>
<li><a href="#26-inline%E5%87%BD%E6%95%B0">2.6 inline函数</a></li>
</ul>
</li>
<li><a href="#3-c%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1">3 C++面向对象</a><ul>
<li><a href="#31-this%E6%8C%87%E9%92%88">3.1 this指针</a></li>
<li><a href="#32-%E5%AF%B9%E8%B1%A1%E7%9A%84%E6%B7%B1%E6%8B%B7%E8%B4%9D%E5%92%8C%E6%B5%85%E6%8B%B7%E8%B4%9D">3.2 对象的深拷贝和浅拷贝</a></li>
<li><a href="#33-%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%E7%9A%84%E5%88%9D%E5%A7%8B%E5%8C%96%E5%88%97%E8%A1%A8">3.3 构造函数的初始化列表</a></li>
</ul>
</li>
</ul>
<!-- tocstop -->
<span id="more"></span>
<p><img src="/2023/03/20/cpp_basic_note/image-20230321143438563.png" alt="image-20230321143438563"></p>
<h1><span id="1-深入学习c语言先要练好的内功">1 深入学习C++语言先要练好的内功</span></h1><h2><span id="11-掌握进程虚拟地址空间区域划分">1.1 掌握进程虚拟地址空间区域划分</span></h2><p><img src="/2023/03/20/cpp_basic_note/image-20230320221443055.png" alt="image-20230320221443055"></p>
<p><img src="/2023/03/20/cpp_basic_note/image-20230320221901794.png" alt="image-20230320221901794"></p>
<h2><span id="12-从指令角度掌握函数调用堆栈详细过程">1.2 从指令角度掌握函数调用堆栈详细过程</span></h2><p><img src="/2023/03/20/cpp_basic_note/image-20230321111119551.png" alt="image-20230321111119551"></p>
<p><img src="/2023/03/20/cpp_basic_note/image-20230321112224556.png" alt="image-20230321112224556"></p>
<p>具体得看视频,讲述了main函数调用sum方法每步的空间变化。</p>
<h2><span id="13-从编译器角度理解c代码的编译和链接原理">1.3 从编译器角度理解C++代码的编译和链接原理</span></h2><p><img src="/2023/03/20/cpp_basic_note/image-20230321142611763.png" alt="image-20230321142611763"></p>
<p><img src="/2023/03/20/cpp_basic_note/image-20230321142632348.png" alt="image-20230321142632348"></p>
<h1><span id="2-c基础">2 C++基础</span></h1><h2><span id="21-深入理解newdelete">2.1 深入理解new,delete</span></h2><p>malloc和free称作C的库函数,new和delete称作运算符;</p>
<p>new不仅可以做内存开辟,还可以做内存初始化操作;</p>
<p>malloc开辟内存失败,是通过返回值和nullptr作比较;而new开辟内存失败,是通过抛出bad_alloc类型的异常来判断;</p>
<figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="comment">// new有多少种?</span></span><br><span class="line"><span class="type">int</span> *p1 = <span class="keyword">new</span> <span class="built_in">int</span>(<span class="number">20</span>);</span><br><span class="line"><span class="type">int</span> *p2 = <span class="built_in">new</span> (nothrow) <span class="type">int</span>;</span><br><span class="line"><span class="type">const</span> <span class="type">int</span> *p3 = <span class="keyword">new</span> <span class="type">const</span> <span class="built_in">int</span>(<span class="number">40</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 定位new</span></span><br><span class="line"><span class="type">int</span> data = <span class="number">0</span>;</span><br><span class="line"><span class="comment">// 在一块已经定位好内存的内存块上,初始化值为50</span></span><br><span class="line"><span class="type">int</span> *p4 = <span class="built_in">new</span> (&data) <span class="built_in">int</span>(<span class="number">50</span>);</span><br></pre></td></tr></table></figure>
<h2><span id="22-c的const">2.2 C++的const</span></h2><h3><span id="const怎么理解">const怎么理解?</span></h3><p>const修饰的变量不能再作为左值!!!初始化完成后值不能被修改!!!</p>
<h3><span id="c和c中的区别是什么">C和C++中的区别是什么?</span></h3><p>C中const修饰的量不叫常量,叫常变量 ;</p>
<p>C++中const必须初始化,叫常量;</p>
<p>C++中若</p>
<figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="type">int</span> b = <span class="number">20</span>;</span><br><span class="line"><span class="type">const</span> <span class="type">int</span> a = b;</span><br></pre></td></tr></table></figure>
<p>此时a已经被修改了,就是常变量而不是常量了,因为其初始值不是一个立即数。</p>
<p>const编译方式不同,C中const当作一个变量来编译生成指令的;C++中,所有出现const常量名字的地方都会被常量的初始值替换;</p>
<h2><span id="23-const和一二多级指针的结合应用">2.3 const和一二(多)级指针的结合应用</span></h2><h3><span id="const修饰的量常出现的错误">const修饰的量常出现的错误</span></h3><p>1.常量不能再作为左值;(直接修改)</p>
<p>2.不能把常量的地址泄露给一个普通的指针或者普通的引用变量;(如下做了间接修改)</p>
<figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="type">const</span> <span class="type">int</span> a = <span class="number">10</span>;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> *p = &a; <span class="comment">// int* <= const int* xxx!!!</span></span><br></pre></td></tr></table></figure>
<h3><span id="const和一级指针的结合">const和一级指针的结合</span></h3><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="type">const</span> <span class="type">int</span> *p; <span class="comment">// p指针可以指向任意int类型的内存,但无法通过指针间接修改指向的内存的值(离const最近的类型为int)</span></span><br><span class="line"><span class="type">int</span> <span class="type">const</span>* p; <span class="comment">// 同上</span></span><br><span class="line"><span class="type">int</span> *<span class="type">const</span> p; <span class="comment">// 这个指针p现在是常量,不能再指向其他内存,但可以通过指针解引用修改指向的内存的值(离const最近的类型为int*)</span></span><br><span class="line"><span class="type">const</span> <span class="type">int</span> *<span class="type">const</span> p; <span class="comment">// 指针p是常量,其指向内存的值也无法修改</span></span><br></pre></td></tr></table></figure>
<p>C++的语言规范:const修饰的使离它最近的类型</p>
<p>const和一级指针的结合有两种情况:</p>
<p><strong>一种是使指针是常量,无法再指向其他内存;一种是使指针指向的内存的值是常量,无法在被修改。</strong></p>
<p>总结,const和指针的类型转换公式:</p>
<p><em><em>int</em> <= const int</em> 是错误的!**</p>
<p><em><em>const int</em> <= int</em> 是可以的!**</p>
<p><strong>int** <= const int**是错误的!</strong></p>
<p><strong>const int** <= int**是错误的!</strong></p>
<p><strong>const如果右边没有指针*的话,const是不参与类型的。</strong></p>
<h3><span id="const和二级指针的结合">const和二级指针的结合</span></h3><figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="type">const</span> <span class="type">int</span> **q; <span class="comment">// **q不能被赋值</span></span><br><span class="line"><span class="type">int</span> *<span class="type">const</span>* q; <span class="comment">// *q不能被赋值</span></span><br><span class="line"><span class="type">int</span> **<span class="type">const</span> q; <span class="comment">// q不能被赋值</span></span><br></pre></td></tr></table></figure>
<h2><span id="24-c的引用">2.4 C++的引用</span></h2><p><strong>引用和指针的区别?</strong></p>
<p>引用是一种更安全的指针。</p>
<p>1.引用是必须初始化的,指针可以不初始化;</p>
<p>2.引用只有一级引用,不存在多级引用;指针可以有一级指针,也可以有多级指针;</p>
<p>3.定义一个引用变量和定义一个指针变量其汇编指令是一模一样的;通过引用变量修改所引用内存的值,和通过指针解引用修改指针指向内存的值,其底层指令也是一模一样的;</p>
<p><strong>右值引用</strong></p>
<p>1.int &&c = 20; 专门用来引用右值类型,指令上,可以自动产生临时量,然后直接引用临时量 c = 40;</p>
<p>2.右值引用变量本身是一个左值,只能用左值引用来引用它;</p>
<p>3.不能用一个右值引用变量来引用一个左值;</p>
<figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="type">int</span> array[<span class="number">5</span>] = {};</span><br><span class="line"><span class="type">int</span> *p = array;</span><br><span class="line"><span class="comment">// 定义一个引用变量,来引用array数组</span></span><br><span class="line"><span class="built_in">int</span> (&q)[<span class="number">5</span>] = array;</span><br><span class="line">cout << <span class="built_in">sizeof</span>(array) << endl;</span><br><span class="line">cout << <span class="built_in">sizeof</span>(p) << endl;</span><br><span class="line">cout << <span class="built_in">sizeof</span>(q) << endl;</span><br><span class="line"><span class="comment">// 20 4 20</span></span><br></pre></td></tr></table></figure>
<figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="type">int</span> a = <span class="number">10</span>; <span class="comment">// 左值,它有内存,有名字,值可以修改</span></span><br><span class="line"><span class="type">int</span> &b = a;</span><br><span class="line"></span><br><span class="line"><span class="comment">// int &c = 2-; // 20是右值:没内存,没名字</span></span><br><span class="line"><span class="comment">// C++提供了右值引用 一个右值引用变量本身是一个左值</span></span><br><span class="line"><span class="type">int</span> &&c = <span class="number">20</span>;</span><br><span class="line">c = <span class="number">30</span>;</span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">int tmp = 20;</span></span><br><span class="line"><span class="comment">tmp -> d</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="type">const</span> <span class="type">int</span> &d = <span class="number">20</span>;</span><br></pre></td></tr></table></figure>
<p> <strong>const、一级指针、引用的结合</strong></p>
<figure class="highlight c++"><table><tr><td class="code"><pre><span class="line"><span class="comment">// 写一句代码,在内存0x0018ff44处写一个4字节的10</span></span><br><span class="line"><span class="comment">// 引用一个int常量</span></span><br><span class="line"><span class="type">int</span> *<span class="type">const</span> &p = (<span class="type">int</span>*)<span class="number">0x0018ff44</span>;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> a = <span class="number">10</span>;</span><br><span class="line"><span class="type">int</span> *p = &a;</span><br><span class="line"><span class="comment">// q是a的引用变量</span></span><br><span class="line"><span class="type">int</span> *&q = p;</span><br></pre></td></tr></table></figure>
<h2><span id="25-函数重载">2.5 函数重载</span></h2><p><strong>什么是函数重载</strong></p>
<p>1.一组函数,其中函数名相同,参数列表的个数或者类型不同,那么这一组函数就称作函数重载;</p>
<p>2.一组函数要称得上重载,一定先是处在同一个作用域当中的;</p>
<p>3.const或者volatile,是怎么影响形参类型的;</p>
<p>4.一组函数,函数名相同,参数列表也相同,仅仅是返回值不同不叫重载;</p>
<p><strong>请解释一下多态?</strong></p>
<p>静态(编译时期)的多态:函数重载</p>
<p>动态(运行时期)的多态:</p>
<p><strong>C++为什么支持函数重载,C语言不支持函数重载?</strong></p>
<p>C++代码产生函数符号的时候,函数名+参数列表类型组成的!</p>
<p>C代码产生函数符号,函数名来决定!</p>
<h2><span id="26-inline函数">2.6 inline函数</span></h2><p><strong>inline内联函数和普通函数的区别</strong></p>
<p>inline函数:在编译过程中,就没有函数的调用开销了,在函数的调用点直接把函数的代码进行展开处理了</p>
<p>inline函数不再生成相应的函数符号</p>
<p>inline只是建议编译器把这个函数处理成内联函数,但是不是所有的inline都会被编译器处理成内联函数——递归</p>
<p>debug版本上,inline是不起作用的;inline只有在release版本下才能出现</p>
<p>g++ -c main.cpp -02 objdump -t main.o</p>
<h1><span id="3-c面向对象">3 C++面向对象</span></h1><h2><span id="31-this指针">3.1 this指针</span></h2><p>this指针 => 类 => 很多对象 共享一套成员方法</p>
<p>成员方法,方法的参数都会添加一个this指针</p>
<p>构造函数:定义对象时,自动调用的;可以重载的;构造完成,对象产生了</p>
<p>析构函数:不带参数,不能重载,只有一个析构函数;析构完成,对象就不存在了</p>
<p><strong>OOP语言的四大特征是?</strong></p>
<p>抽象 封装/隐藏 继承 多态</p>
<h2><span id="32-对象的深拷贝和浅拷贝">3.2 对象的深拷贝和浅拷贝</span></h2><p>对象默认的拷贝构造是做内存的数据拷贝</p>
<p>关键是对象<strong>如果占用外部资源</strong>,那么浅拷贝就出现问题了!(占用同一个资源析构两次就会出错!)</p>
<p>此时(对象的浅拷贝出现问题了)就需要自定义<strong>拷贝构造函数</strong>和<strong>赋值函数</strong>(运算符重载)</p>
<h2><span id="33-构造函数的初始化列表">3.3 构造函数的初始化列表</span></h2><p><strong>初始化列表做初始化和在函数体内初始化区别?</strong></p>
<p>int amount = 0;和 int amount; amount = 0;的区别,若数据类型为自定义类型,未指定该自定义类型的构造函数(调用默认构造函数),则无法成功构造。</p>
]]></content>
<categories>
<category>C++</category>
</categories>
<tags>
<tag>C++</tag>
</tags>
</entry>
<entry>
<title>《Face-to-Parameter Translation for Game Character Auto-Creation》</title>
<url>/2022/07/24/review_10_F2P/</url>
<content><![CDATA[<!-- toc -->
<ul>
<li><a href="#%E5%87%BA%E5%8F%91%E7%82%B9">出发点</a></li>
<li><a href="#%E6%96%B9%E6%B3%95%E7%AE%80%E8%BF%B0">方法简述</a><ul>
<li><a href="#%E8%B4%A1%E7%8C%AE">贡献</a></li>
</ul>
</li>
<li><a href="#%E6%96%B9%E6%B3%95%E8%AF%A6%E8%A7%A3">方法详解</a><ul>
<li><a href="#1imitator">1.Imitator</a></li>
<li><a href="#2facial-similarity-measurement">2.Facial Similarity Measurement</a></li>
</ul>
</li>
</ul>
<!-- tocstop -->
<p>paper: <a href="https://openaccess.thecvf.com/content_ICCV_2019/papers/Shi_Face-to-Parameter_Translation_for_Game_Character_Auto-Creation_ICCV_2019_paper.pdf">Face-to-Parameter Translation for Game Character Auto-Creation (thecvf.com)</a></p>
<p>code: no code</p>
<p>reference link: <a href="https://zhuanlan.zhihu.com/p/105037127">【1】伏羲AI lab:脸部照片到脸部参数的游戏角色自动生成 论文笔记 - 知乎 (zhihu.com)</a></p>
<span id="more"></span>
<h1><span id="出发点">出发点</span></h1><p>RPG游戏中捏脸的标准工作流是从配置大量<strong>面部参数</strong>开始,然后,游戏引擎将这些用户指定的参数作为输入,并生成3D人脸。也可以说游戏人脸定制是一种3DMM的特例或是一种风格迁移问题。</p>
<p>但遗憾的是,上述方法不能直接应用于游戏环境中。原因有三。首先,这些方法并不是用于生成参数化的角色,而这对于大多数游戏引擎来说是必不可少的,因为它们通常会<strong>接受游戏角色的定制参数</strong>,而不是图像或3D网格。其次,这些方法对用户交互不友好,因为大多数用户很难直接编辑Mesh。最后,给定一组用户指定参数的游戏引擎的渲染过程是不可微分的,这进一步限制了深度学习方法在游戏环境中的适用性。</p>
<h1><span id="方法简述">方法简述</span></h1><p>针对上述问题,本文提出了一种根据玩家输入的人脸照片自动生成游戏角色的方法,如图所示。</p>
<p><img src="/2022/07/24/review_10_F2P/image-20220724165007254.png" alt="image-20220724165007254"></p>
<p>与以往3DMM方法不同,我们的方法通过<strong>预测一组具有明确物理意义的面部参数,为骨骼驱动的模型创建三维轮廓</strong>。在我们的方法中,每个参数控制每个面部组件的一个单独属性,包括位置、方向和比例。更重要的是,我们的方法在创建结果的基础上支持额外的用户交互,玩家可以根据自己的需求进一步改进他们的形象。由于游戏引擎的渲染过程是不可微分的,我们设计了一个生成网络作为“模仿者”来模仿游戏引擎的物理行为,从而可以在神经风格传递框架下实现本文提出的方法,并使用梯度下降法优化面部参数。</p>
<h2><span id="贡献">贡献</span></h2><p>1)我们提出了一种端到端的人脸参数转换和游戏角色自动生成方法。据我们所知,关于这一主题的研究工作很少。</p>
<p>2)由于游戏引擎的渲染过程是不可区分的,我们引入了一个模仿者,通过构建一个深度生成网络来模仿游戏引擎的行为。这样,梯度可以平滑地反向传播到输入,从而利用梯度下降法更新人脸参数。</p>
<p>3)为跨域人脸相似度测量设计了两个损失函数。提出的目标可以在多任务学习框架中联合优化。</p>
<h1><span id="方法详解">方法详解</span></h1><p><img src="/2022/07/24/review_10_F2P/image-20220724165938954.png" alt="image-20220724165938954"></p>
<h2><span id="1imitator">1.Imitator</span></h2><p><img src="/2022/07/24/review_10_F2P/image-20220724194516986.png" alt="image-20220724194516986"></p>
<p>采用类似DCGAN的结构,包含8个反卷积层,用来模拟游戏引擎从脸部参数到脸部图像的映射。然后将真实游戏引擎的渲染结果与模拟器生成的图像算L1 loss。训练用了20000对人脸图像,游戏引擎用的是逆水寒的游戏引擎。</p>
<p><img src="/2022/07/24/review_10_F2P/image-20220724195638704.png" alt="image-20220724195638704"></p>
<p>图4显示了我们的模仿者的“渲染”结果的三个示例。这些图像的面部参数是手动创建的。由于训练样本是根据面部参数的统一分布随机生成的,所以对于大多数人物可能看起来很奇怪(请参阅我们的补充资料)。尽管如此,我们仍然可以从图4中看到,生成的人脸图像和渲染的地面真实图像有很高的相似性,即使在一些纹理复杂的区域,如头发。这表明我们的模仿者不仅将训练数据拟合在一个低维的人脸流形中,而且还学会了解耦不同人脸参数之间的相关性。</p>
<h2><span id="2facial-similarity-measurement">2.Facial Similarity Measurement</span></h2><p>alignment后的真实人脸与Imitator生成的人脸通过预训练好的识别网络算embedding间的余弦相似度。</p>
<p><img src="/2022/07/24/review_10_F2P/image-20220725143108613.png" alt="image-20220725143108613"></p>
<p>又采用了一个预训练好的分割网络对两张图像进行分割,在著名的Helen face语义分割数据集上训练该模型。为了提高人脸语义特征的位置敏感性,进一步使用分割结果(分类概率图)作为特征图的像素权值,构建位置敏感的内容丢失函数。通俗点应该就是针对每个部分对feature map做掩码算L1。</p>
<p><img src="/2022/07/24/review_10_F2P/image-20220725144042722.png" alt="image-20220725144042722"></p>
<p><img src="/2022/07/24/review_10_F2P/image-20220725143221347.png" alt="image-20220725143221347"></p>
]]></content>
<categories>
<category>paper review</category>
</categories>
<tags>
<tag>Game Character Create</tag>
</tags>
</entry>
<entry>
<title>《High-Fidelity 3D Digital Human Head Creation from RGB-D Selfies》</title>
<url>/2022/10/17/review_11_Hifi3dFace/</url>
<content><![CDATA[<!-- toc -->
<ul>
<li><a href="#1-%E5%AE%9E%E7%8E%B0%E6%95%88%E6%9E%9C">1. 实现效果</a></li>
<li><a href="#2-%E5%85%A8%E9%83%A8%E7%AE%97%E6%B3%95%E6%80%BB%E8%A7%88">2. 全部算法总览</a><ul>
<li><a href="#21-%E6%95%B0%E6%8D%AE%E9%9B%86">2.1 数据集</a></li>
<li><a href="#22-%E7%9B%AE%E6%A0%87">2.2 目标</a></li>
<li><a href="#23-%E7%94%A8%E6%88%B7%E8%BE%93%E5%85%A5%E6%95%B0%E6%8D%AE">2.3 用户输入数据</a></li>
<li><a href="#24-%E5%A4%84%E7%90%86%E7%AE%A1%E7%BA%BF">2.4 处理管线</a></li>
</ul>
</li>
<li><a href="#3-%E5%85%B7%E4%BD%93%E7%AE%97%E6%B3%95">3. 具体算法</a><ul>
<li><a href="#31-%E5%B8%A7%E9%80%89%E6%8B%A9">3.1 帧选择</a><ul>
<li><a href="#311-%E7%B2%97%E7%AD%9B%E5%92%8C%E9%A2%84%E5%A4%84%E7%90%86">3.1.1 粗筛和预处理</a></li>
<li><a href="#312-%E5%B8%A7%E9%80%89%E6%8B%A9">3.1.2 帧选择</a></li>
</ul>
</li>
<li><a href="#32-%E5%87%A0%E4%BD%95%E7%94%9F%E6%88%90">3.2 几何生成</a><ul>
<li><a href="#321-%E5%88%9D%E5%A7%8B%E6%A8%A1%E5%9E%8B%E5%AE%9A%E4%B9%89">3.2.1 初始模型定义</a></li>
<li><a href="#322-%E4%BC%98%E5%8C%96%E6%A1%86%E6%9E%B6">3.2.2 优化框架</a></li>
<li><a href="#323-%E5%8F%AF%E5%BD%A2%E5%8F%98%E6%A8%A1%E5%9E%8B%E7%9A%84%E5%A2%9E%E5%BC%BA%E6%89%A9%E5%85%853d%E6%95%B0%E6%8D%AE%E7%9A%84%E6%96%B9%E6%B3%95">3.2.3 可形变模型的增强(扩充3D数据的方法)</a></li>
</ul>
</li>
<li><a href="#33-%E8%B4%B4%E5%9B%BE%E7%94%9F%E6%88%90">3.3 贴图生成</a><ul>
<li><a href="#331-%E5%9F%BA%E4%BA%8E%E5%8C%BA%E5%9F%9F%E9%87%91%E5%AD%97%E5%A1%94%E7%9A%84%E5%8F%82%E6%95%B0%E8%A1%A8%E7%A4%BA%E6%9E%84%E9%80%A0%E8%AF%A6%E8%A7%A3regional-pyramid-bases">3.3.1 基于区域金字塔的参数表示构造详解(Regional Pyramid bases)</a></li>
<li><a href="#332-%E5%8C%BA%E5%9F%9F%E6%8B%9F%E5%90%88regional-fitting">3.3.2 区域拟合(Regional Fitting)</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<!-- tocstop -->
<p>paper: <a href="https://openaccess.thecvf.com/content_ICCV_2019/papers/Shi_Face-to-Parameter_Translation_for_Game_Character_Auto-Creation_ICCV_2019_paper.pdf">https://arxiv.org/abs/2010.05562</a></p>
<p>code: <a href="https://github.com/tencent-ailab/hifi3dface">tencent-ailab/hifi3dface: Code and data for our paper “High-Fidelity 3D Digital Human Creation from RGB-D Selfies”. (github.com)</a></p>
<p>ref link:<a href="https://blog.csdn.net/jiafeier_555/article/details/125428388">https://blog.csdn.net/jiafeier_555/article/details/125428388</a></p>
<span id="more"></span>
<h1><span id="1-实现效果">1. 实现效果</span></h1><p>将用户的RGB-D自拍作为输入,自动生成高保真、可装配的头部模型,以及高分辨率的纹理图和法线图。</p>
<h1><span id="2-全部算法总览">2. 全部算法总览</span></h1><h2><span id="21-数据集">2.1 数据集</span></h2><p>包含各100名男女性的3D人脸,20481个顶点和40832个面片,每个模型对应2K分辨率的纹理图和法线图。</p>
<h2><span id="22-目标">2.2 目标</span></h2><p>用RGB-D自拍数据捕捉高保真用户的面部几何形状和反射率,该数据进一步用于创建和渲染全头、逼真的数字人类。<strong>对于几何建模,我们使用3DMM参数来表示一个面,因为它对低级别的输入数据更鲁棒,并且与基于变形的表示形式相比,网格质量更可控</strong>。对于纹理建模,我们合成了2K分辨率的反照率图和法线图,而不考虑输入的RGB-D分辨率。 </p>
<h2><span id="23-用户输入数据">2.3 用户输入数据</span></h2><p>需要通过带深度相机的手机设备采集RGB-D数据,腾讯其有个采集软件,拍摄界面将引导用户连续向左、向右、向上和向后中间旋转头部。整个采集过程不到10秒,总共采集了200-300帧RGB-D图像,分辨率为640×480。用于计算的面部区域被裁剪(并调整大小)为300×300。相机的固有参数直接从设备读取。 </p>
<h2><span id="24-处理管线">2.4 处理管线</span></h2><p>我们首先使用自动帧选择算法来选择覆盖用户所有侧面的几个高质量帧(第4节)。然后,使用所选帧中检测到的面部标志计算初始3DMM模型拟合(第5.1节)。从初始拟合开始,应用基于可差分渲染器的多视图RGB-D约束优化(第5.2节)来求解3DMM参数以及照明参数和姿势。根据估计的参数,合成高分辨率反照率法向图(第6节)。最后,可以创建和渲染高质量、逼真的全头像(第7节)。</p>
<h1><span id="3-具体算法">3. 具体算法</span></h1><h2><span id="31-帧选择">3.1 帧选择</span></h2><p>通常从用户获取200-300帧。为了提高效率和健壮性,我们开发了一个健壮的帧选择程序,以选择几个高质量的帧进行进一步处理,该程序同时考虑了视图覆盖和数据质量。如图2所示,该过程包括如下所述的两个阶段。 </p>
<p><img src="/2022/10/17/review_11_Hifi3dFace/image-20221023165135058.png" alt="image-20221023165135058"></p>
<h3><span id="311-粗筛和预处理">3.1.1 粗筛和预处理</span></h3><p>首先用了个face landmark的检测(在300W-LP数据集上训练的MobileNet)来检测2D landmark;</p>
<p>然后,可以使用PnP算法利用模板3D面部模型上的2D地标和3D关键点之间的对应关系有效地计算每个帧的粗略头部姿势;</p>
<p>使用2D地标和粗略的头部姿势可以很容易地识别和筛选出具有极端无效姿势或闭眼张开嘴表情的帧。我们根据姿势将其余帧分类为组:前、左、右和上;</p>
<h3><span id="312-帧选择">3.1.2 帧选择</span></h3><p>对于每组,我们进一步根据两个标准选择一个帧:图像质量和刚性。为了测量帧的图像质量,我们计算拉普拉斯高斯(LoG)滤波器响应,并将方差用作运动模糊分数(分数越大的图像越清晰)。首先基于前面组中的运动模糊分数来选择前面帧。然后,我们利用深度数据计算其他组中的每个帧与正面之间的刚度。具体而言,使用深度数据将每个帧的检测到的2D地标从2D提升到3D。请注意,遮挡的界标会根据帧所属的组自动移除,例如,对于左侧组中的帧,面部右侧的界标将被移除。 </p>
<h2><span id="32-几何生成">3.2 几何生成</span></h2><h3><span id="321-初始模型定义">3.2.1 初始模型定义</span></h3><p>使用基于 PCA 的线性 3DMM 进行参数建模。 人脸模型的形状和反照率纹理表示为:</p>
<p><img src="/2022/10/17/review_11_Hifi3dFace/image-20221025151737274.png" alt="image-20221025151737274"></p>
<p>其中 s¯ 是平均 3D 人脸形状模型的向量格式,𝑆 是形状身份基础,x𝑠ℎ𝑝 是要估计的相应身份参数向量,a¯ 是平均反照率图的向量格式,𝐴 是反照率图基础颜色,x𝑎𝑙𝑏是要估计的相关反照率参数向量。</p>
<p>使用岭回归 ,可以通过将形状模型投影到每个输入图像上来提取部分纹理图。 使用从每个视图的地标派生的预定义蒙版(见图 3),然后使用拉普拉斯金字塔混合将部分纹理贴图混合成完整的纹理贴图。(<strong>unwarp操作</strong>) 初始反照率参数可以通过另一个岭回归来获得,以拟合混合纹理图。</p>
<p><img src="/2022/10/17/review_11_Hifi3dFace/image-20221025153015905.png" alt="image-20221025153015905"></p>
<h3><span id="322-优化框架">3.2.2 优化框架</span></h3><p><img src="/2022/10/17/review_11_Hifi3dFace/image-20221025153218398.png" alt="image-20221025153218398"></p>
<p>优化框架: 要解决的参数包括:用户的 3DMM 参数 x𝑠ℎ𝑝 和 x𝑎𝑙𝑏,每个视图的照明参数 x𝑙𝑖𝑔ℎ𝑡 和姿势 x𝑝𝑜𝑠𝑒。 约束包括:关键点损失𝐿𝑙𝑎𝑛、RGB 照片损失𝐿𝑟𝑔𝑏、深度损失𝐿𝑑𝑒𝑝和身份感知损失𝐿𝑖𝑑。</p>
<p>优化目标:<img src="/2022/10/17/review_11_Hifi3dFace/image-20221025155915049.png" alt="image-20221025155915049"></p>
<p>对于每个用户的两个3DMM系数是不同的,而光照系数和姿态系数对每个用户都通用。</p>
<p>目标Loss:</p>
<p><img src="/2022/10/17/review_11_Hifi3dFace/image-20221025160858227.png" alt="image-20221025160858227"></p>
<p>具体Loss:</p>
<p><strong>RGB Photo Loss</strong>:L2,输入的RGB图像和渲染的RGB图像做L2</p>
<p><img src="/2022/10/17/review_11_Hifi3dFace/image-20221025160959267.png" alt="image-20221025160959267"></p>
<p><img src="/2022/10/17/review_11_Hifi3dFace/image-20221025161500643.png" alt="image-20221025161500643"></p>
<p><img src="/2022/10/17/review_11_Hifi3dFace/image-20221025161600812.png" alt="image-20221025161600812"></p>
<p>(下图是真实RGB,上图是mesh和贴图在原图上做渲染后的图像)</p>
<p><strong>Depth Loss</strong>:L2,ρ是个截断函数,用来限定L2的范围;</p>
<p><img src="/2022/10/17/review_11_Hifi3dFace/image-20221025162833565.png" alt="image-20221025162833565"></p>
<p><strong>Identity Perceptual Loss</strong>:L2,过VGGFace的fc7后的特征做感知loss;</p>
<p><img src="/2022/10/17/review_11_Hifi3dFace/image-20221025163251941.png" alt="image-20221025163251941"></p>
<p><strong>Landmark Loss</strong>:每个lankmark做L2(不同位置权重不一样)</p>
<p><img src="/2022/10/17/review_11_Hifi3dFace/image-20221025163440791.png" alt="image-20221025163440791"></p>
<p>Regularization:为了确保重建的合理性,对形状和纹理参数应用正则化</p>
<p><img src="/2022/10/17/review_11_Hifi3dFace/image-20221026111116994.png" alt="image-20221026111116994"></p>
<h3><span id="323-可形变模型的增强扩充3d数据的方法">3.2.3 可形变模型的增强(扩充3D数据的方法)</span></h3><p>优化中的约束十分丰富(loss很多),如果使用传统的线性3DMM的表达能力十分有限,为此提出了一种增强方法。</p>
<p>motivation:人脸大多不对称,会在对齐人脸模型时造成歧义, 原因是在两个模型的对齐过程中,它们之间的相对旋转和平移是通过最小化模型上某些参考点的误差来确定的。 不同的参考点可能导致不同的对齐结果。 由于人脸的不对称结构,没有完美的参考点。</p>
<p>这提醒我们可以扰乱两个对齐模型之间的相对姿势以获得“代替”的对齐。通过这种方式既可以获得额外的PCA样本,因为新的对齐方式引入了新的变形目标。此外,我们可以使用一组扰动操作,包括姿态扰动、镜像、区域替换等,来增强对齐的模型。 基于生成的大量数据,我们提出了一种随机迭代算法来构建一个 3DMM,将更多的容量压缩到基的更低维度。</p>
<p><img src="/2022/10/17/review_11_Hifi3dFace/image-20221026151445577.png" alt="image-20221026151445577"></p>
<p><strong>数据生成和扰动具体增强步骤</strong>(从200个对齐后的面部模型开始)</p>
<p>从 200 个对齐的面部形状模型开始,我们的数据生成和扰动过程包括以下步骤: </p>
<p>1.使用扰动进行区域替换</p>
<p>我们首先用其他模型替换每个模型的鼻子区域,沿俯仰角旋转扰动(在±1度内均匀采样)。 嘴部区域也以相同的方式处理。对于眼睛区域,我们在没有扰动的情况下应用替换。通过在处理过程中最小化引入的视觉缺陷来根据经验设计不同的扰动。 <strong>此步骤中使用的面部区域如图 5 所示</strong></p>
<p>2.刚性变换扰动。 </p>
<p>然后,我们对每个人脸模型应用刚性变换扰动,其中统一采样范围设置为:沿yam/pitch/roll的 ±1 度用于旋转,沿三个轴中的每一个轴的 ±1% 用于平移 , ±1% 刻度。</p>
<p>3.镜像。 </p>
<p>最后,我们沿模型局部坐标系对所有生成的人脸模型应用镜像。 通过这种方式,我们总共得到了超过 100,000 个人脸模型。</p>
<p>最后效果表示,拥有大量数据生成和增强所训练出的模型不出意外有更强大的表达能力,拟合得更好。</p>
<p>迭代增强3DMM构造算法流程:</p>
<p><img src="/2022/10/17/review_11_Hifi3dFace/image-20221026155015588.png" alt="image-20221026155015588"></p>
<h2><span id="33-贴图生成">3.3 贴图生成</span></h2><p><strong>这一部分参考博客里讲得很好,建议先看参考博客</strong></p>
<p>提出了一种合成高分辨率反照率和法线贴图的混合方法。</p>
<p>我们注意到基于超分辨率的方法无法产生高质量的眉毛细节。 另一方面,直接合成高分辨率纹理图可能会导致压倒性的细节,这也使得渲染不真实。 我们的方法在基于金字塔的参数表示的帮助下解决了这些问题。 图 9 显示了我们方法的流程。</p>
<p><img src="/2022/10/17/review_11_Hifi3dFace/image-20221026163814008.png" alt="image-20221026163814008"></p>
<p>第一步提取纹理(extract)</p>
<p>第二步通过光照参数调整纹理亮度(delight)</p>
<p>第三步将3D人脸展开到2D贴图(unwrap),512*512</p>
<p>unwrap详情见代码,最终效果就是blender里面的展UV</p>
<p>第四步使用<strong>区域拟合方法</strong>获得2048*2048的反射率贴图和法线贴图(regional fitting)</p>
<p>第五步通过CNN(具体模型为<strong>pix2pix</strong>)对两个贴图进行细化(refinement)</p>
<h3><span id="331-基于区域金字塔的参数表示构造详解regional-pyramid-bases">3.3.1 基于区域金字塔的参数表示构造详解(Regional Pyramid bases)</span></h3><p><img src="/2022/10/17/review_11_Hifi3dFace/image-20221026214551913.png" alt="image-20221026214551913"></p>
<p>1.先将unwrap后的贴图resize成512和2048大小的图像,最终要得到上图左边的素材;</p>
<p>2.使用Mask将脸部分为8个区域,具体规则如下表示</p>
<p><img src="/2022/10/17/review_11_Hifi3dFace/image-20221027111816307.png" alt="image-20221027111816307"></p>
<p>3.每个样本有三种贴图(512-a,2048-a,2048-g),构成如下三元组</p>
<p><img src="/2022/10/17/review_11_Hifi3dFace/image-20221027150644329.png" alt="image-20221027150644329"></p>
<p>4.concat到一维,计算PCA,得到主成分</p>
<p>5.将得到的主成分根据索引,scatter back回图像</p>
<p>scatter back的操作是tensorflow的scatter_nd()函数实现的。</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">scatter_nd(indices,updates,shape,name=None)</span><br></pre></td></tr></table></figure>
<p>根据indices将updates散布到新的(初始为零)张量。</p>
<h3><span id="332-区域拟合regional-fitting">3.3.2 区域拟合(Regional Fitting)</span></h3><p>由于构造了regional pyramid base,不同区域的不同类型皮肤/头发细节可以通过高分辨率基分别保存,而低分辨率的拟合过程使算法专注于主要的面部结构,例如,形状眉毛和嘴唇。(<strong>多尺度</strong>)</p>
<p>区域拟合分为两部分:<strong>参数拟合和高分辨率贴图合成</strong></p>
<p><strong>参数拟合</strong></p>
<p><strong>参数拟合部分,就是将生成头模的时候生成的粗略化的Xalb,通过最小化loss,迭代训练得到较优的Xalb。</strong></p>
<p>参数拟合部分只使用了512的贴图</p>
<p><img src="/2022/10/17/review_11_Hifi3dFace/image-20221027153638981.png" alt="image-20221027153638981"></p>
<p>变量解释:</p>
<p><strong>Loss 1</strong></p>
<p><img src="/2022/10/17/review_11_Hifi3dFace/image-20221027155829303.png" alt="image-20221027155829303">为unwrap后的图像;</p>
<p><img src="/2022/10/17/review_11_Hifi3dFace/image-20221027155908838.png" alt="image-20221027155908838">表示将生成头模过程中生成的粗略的颜色贴图参数,与region pyramid bases逐区域相乘拟合再叠加成一张总的颜色贴图;</p>
<p>然后计算这两张图像之间的L2,记作loss1;</p>
<p><strong>Loss 2</strong></p>
<p><img src="/2022/10/17/review_11_Hifi3dFace/image-20221027160544519.png" alt="image-20221027160544519"></p>
<p>主要消除8个区域边界中的伪影。做法是:通过uv_mask将整个颜色贴图分割成边界mask和非边界mask,然后分别计算颜色贴图中的边界距离和非边界距离,将这两种距离相加。记做loss2;</p>
<p><strong>Loss 3</strong></p>
<p>对于<img src="/2022/10/17/review_11_Hifi3dFace/image-20221027160823904.png" alt="image-20221027160823904">这个颜色贴图参数做L2正则,记作loss3;</p>
<p>三个Loss相加 使其最小化,迭代更新颜色贴图参数Xalb,直到得到训练好的Xalb。</p>
<p><strong>高分辨率贴图生成</strong></p>
<p><img src="/2022/10/17/review_11_Hifi3dFace/image-20221027161429672.png" alt="image-20221027161429672"></p>
<p>将上部分得到的较优的Xalb,分别与区域金字塔生成的A2048(2048* 2048分辨率的颜色贴图基)逐区域相乘拟合再叠加成一张总的颜色贴图,这便是区域拟合部分得到的最终的颜色贴图。<br>将上部分得到的较优的Xalb,分别与区域金字塔生成的G2048(2048* 2048分辨率的法线贴图基)逐区域相乘拟合再叠加成一张总的法线贴图,这便是区域拟合部分得到的最终的法线贴图。</p>
<p><strong>细节生成</strong></p>
<p>基于pix2pix模型,进出模型的分辨率是相同的,但细节上会细化;</p>
<p>在训练过程中,首先使用面部区域替换和肤色转移将200幅高质量反照率/法线图(来自构建3DMM的数据集)放大为4000幅图,作为训练两个网络的GT。</p>
<p>然后,对4000幅图执行区域拟合(Regional Fitting),以获得拟合的反照率/法线地图,这些图在训练期间用作网络的输入。只使用整个UV贴图中的面部区域来计算训练损失。</p>
<p>类似于pix2pix,保持𝐿1损耗和GAN损耗。对于反照率细化,我们还应用总变化损失(total variation loss)来减少伪影并改善皮肤平滑度。对于法线图细化,还使用预测和GT图之间的逐像素余弦距离,以提高正常方向的精度。使用Adam优化器对网络进行75000次迭代。</p>
]]></content>
<categories>
<category>paper review</category>
</categories>
<tags>
<tag>3DMM</tag>
</tags>
</entry>
<entry>
<title>《REALY:Rethinking the Evaluation of 3D Face Reconstruction》</title>
<url>/2023/06/01/review_12_REALY/</url>
<content><![CDATA[<!-- toc -->
<ul>
<li><a href="#1-%E8%B4%A1%E7%8C%AE">1. 贡献</a></li>
<li><a href="#2-%E5%8A%A8%E6%9C%BA">2. 动机</a></li>
<li><a href="#3-%E7%AE%80%E4%BB%8B">3. 简介</a></li>
<li><a href="#4-%E9%A2%84%E5%A4%87%E7%9F%A5%E8%AF%86">4. 预备知识</a><ul>
<li><a href="#%E7%AC%A6%E5%8F%B7%E5%AE%9A%E4%B9%89"><strong>符号定义</strong></a></li>
<li><a href="#3dmm%E8%A1%A5%E5%85%85">3DMM补充</a></li>
<li><a href="#%E4%B8%80%E4%BA%9B%E6%A0%87%E5%87%86%E7%9A%84evaluation-pipeline">一些标准的evaluation pipeline</a></li>
<li><a href="#motivation">motivation</a></li>
</ul>
</li>
<li><a href="#5-realya-new-3d-face-benchmark">5. REALY:A New 3D Face Benchmark</a><ul>
<li><a href="#%E9%80%89%E6%8B%A9hifi3d%E5%9F%BA%E5%BA%95%E4%BD%9C%E4%B8%BA%E7%9B%AE%E6%A0%87%E6%8B%93%E6%89%91%E7%9A%84%E5%8E%9F%E5%9B%A0">选择HIFI3D基底作为目标拓扑的原因</a></li>
<li><a href="#%E6%95%B0%E6%8D%AE%E9%9B%86%E6%9E%84%E5%BB%BA%E6%AD%A5%E9%AA%A4">数据集构建步骤</a></li>
<li><a href="#%E6%8C%91%E6%88%98%E4%B8%8E%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88">挑战与解决方案</a><ul>
<li><a href="#%E6%8C%91%E6%88%98%E4%B8%80%E5%8E%9F%E5%A7%8B%E6%89%AB%E6%8F%8F%E5%85%B7%E6%9C%89%E4%B8%8D%E5%90%8C%E7%9A%84%E6%AF%94%E4%BE%8B%E5%92%8C%E5%A7%BF%E5%8A%BF%E5%85%B7%E6%9C%89%E4%B8%8D%E5%87%86%E7%A1%AE%E7%9A%84%E7%A8%80%E7%96%8Fkeypoints%E8%BF%99%E4%BD%BF%E5%BE%97%E5%AE%83%E4%BB%AC%E9%9A%BE%E4%BB%A5%E4%B8%80%E8%87%B4%E5%9C%B0%E5%AF%B9%E9%BD%90">挑战一:原始扫描具有不同的比例和姿势,具有不准确的稀疏keypoints,这使得它们难以一致地对齐。</a></li>
<li><a href="#%E6%8C%91%E6%88%98%E4%BA%8C%E5%BE%97%E5%88%B0%E9%87%8D%E6%96%B0%E6%8B%93%E6%89%91%E7%9A%84-sl-%E4%B9%8B%E5%90%8E%E5%A6%82%E4%BD%95%E5%87%86%E7%A1%AE%E5%9C%B0%E5%B0%86region-masks%E4%BB%8E-sl%E7%BB%A7%E6%89%BF%E8%87%AA-stemp%E8%BD%AC%E7%A7%BB%E5%88%B0sh">挑战二:得到重新拓扑的 SL 之后,如何准确地将region masks从 SL(继承自 Stemp)转移到SH</a></li>
</ul>
</li>
<li><a href="#hifi3d">HIFI3D++</a></li>
</ul>
</li>
<li><a href="#6-%E5%88%9B%E6%96%B0%E7%9A%84evaluation-pipeline">6 创新的Evaluation pipeline</a></li>
<li><a href="#7-%E5%AE%9E%E9%AA%8C">7. 实验</a><ul>
<li><a href="#%E6%B6%88%E8%9E%8D%E5%AE%9E%E9%AA%8Cbicp-vs-gicp">消融实验:bICP VS gICP</a></li>
<li><a href="#%E4%B8%8D%E5%90%8C%E6%96%B9%E6%B3%95%E5%9C%A8realy-benchmark%E4%B8%8A%E7%9A%84%E8%A1%A8%E7%8E%B0">不同方法在REALY benchmark上的表现</a></li>
<li><a href="#%E4%B8%8D%E5%90%8C3dmm%E5%9C%A8realy%E4%B8%8A%E7%9A%84%E8%A1%A8%E7%8E%B0">不同3DMM在REALY上的表现</a></li>
</ul>
</li>
<li><a href="#8-%E6%80%BB%E7%BB%93">8. 总结</a></li>
</ul>
<!-- tocstop -->
<p>paper: <a href="https://realy3dface.com/">REALY (realy3dface.com)</a></p>
<p>code: <a href="https://github.com/tencent-ailab/hifi3dface"><a href="https://github.com/czh-98/REALY">czh-98/REALY: REALY: Rethinking the Evaluation of 3D Face Reconstruction (ECCV 2022) (github.com)</a></a></p>
<p>ref link:<a href="https://blog.csdn.net/jiafeier_555/article/details/125428388">https://blog.csdn.net/jiafeier_555/article/details/125428388</a></p>
<span id="more"></span>
<h1><span id="1-贡献">1. 贡献</span></h1><p>提出一个3D face reconstruction的benchmark REALY(Region-aware benchmark based on the LYHM Benchmark)</p>
<p>REALY,HIFI3D++(3DMM),本文的新evaluation pipeline以开源。</p>
<h1><span id="2-动机">2. 动机</span></h1><p>人脸重建任务中,不同的数据集,会制约重建方法、评估方法、3DMM基底的发展。</p>
<p>现有的开源 3D 人脸数据集存在一些不可忽视的缺陷。 例如,面部扫描具有不同的比例和随机姿势,并且提供的关键点不够准确或辨别力不够,这使得将输入形状与预测面部对齐以进行评估变得极其困难。 此外,由于原始面部扫描中缺乏真实标注,标准评估管道依赖于最近邻对应来衡量扫描与估计面部形状之间的相似性,这完全忽略了实体特征并丢弃了人体的几何形状面孔。</p>
<h1><span id="3-简介">3. 简介</span></h1><p>为了填补这一空白,提出了一个名为 REALY 的新基准,用于评估 3D 人脸重建方法。 REALY 包含来自 <strong>LYHM 数据集</strong>的 100 个人的 3D 人脸扫描,其中人脸扫描被一致地<strong>重新缩放、全局对齐,并展开成拓扑结构一致的mesh</strong>。 更重要的是,由于本文已经<strong>预定义了重新拓扑网格模板的面部关键点keypoints和掩码masks</strong>,因此<strong>可以将keypoints和masks转移到原始面部扫描结构</strong>中。 在这种情况下,本文即获得了原始原始面部扫描的高质量面部关键点和蒙版,这使我们能够对估计的 3D 面部形状执行更准确的对齐和细粒度的区域评估。</p>
<p>我们的基准包含来自不同种族、年龄和性别群体的个体。 利用为 REALY 构建的<strong>重新拓扑步骤(已开源)</strong>,我们通过对齐和重新拓扑多个 3D 人脸数据集,进一步提供了一个名为 HIFI3D++ 的 3DMM 基底。 我们进行了广泛的实验来评估最先进的 3D 人脸重建方法和 3DMM 基底。</p>
<p><img src="/2023/06/01/review_12_REALY/image-20230601193651526.png" alt="image-20230601193651526"></p>
<h1><span id="4-预备知识">4. 预备知识</span></h1><h2><span id="符号定义"><strong>符号定义</strong></span></h2><p><img src="/2023/06/01/review_12_REALY/image-20230601201029200.png" alt="image-20230601201029200"></p>
<p>三个特殊的face shape,以及在不同face shape上的keypoints和regions</p>
<p><img src="/review_12_REALY/image-20230601201913382.png" alt="image-20230601201913382"></p>
<p><img src="/review_12_REALY/image-20230601201923089.png" alt="image-20230601201923089"></p>
<p><img src="/2023/06/01/review_12_REALY/image-20230601202527762.png" alt="image-20230601202527762"></p>
<p><strong>NMSE用于度量两个surfaces之间的距离</strong></p>
<p><img src="/2023/06/01/review_12_REALY/image-20230601202606377.png" alt="image-20230601202606377"></p>
<p><strong>ICP可用于通过迭代求解刚性变换和最近邻映射来对齐两个shape,以最小化NMSE</strong></p>
<h2><span id="3dmm补充">3DMM补充</span></h2><p>一些开源的3DMM数据:</p>
<p><img src="/2023/06/01/review_12_REALY/image-20230601202856040.png" alt="image-20230601202856040"></p>
<h2><span id="一些标准的evaluation-pipeline">一些标准的evaluation pipeline</span></h2><p>一些数据集还提供ground truth scan数据</p>
<p><img src="/2023/06/01/review_12_REALY/image-20230601203122686.png" alt="image-20230601203122686"></p>
<h2><span id="motivation">motivation</span></h2><h4><span id="传统standard-evaluation-pipeline的缺陷">传统standard evaluation pipeline的缺陷</span></h4><p><img src="/2023/06/01/review_12_REALY/image-20230601204718654.png" alt="image-20230601204718654"></p>
<p>如上图,使用standard evalution pipeline,高分辨的shape和gt shape的差异反而要比低分辨率的shape的高。所以<strong>考虑regions的对齐</strong>比较合理。</p>
<p><img src="/2023/06/01/review_12_REALY/image-20230601210609441.png" alt="image-20230601210609441"></p>
<p>如上图,x对应的最近邻点是y1,而根据语义x应该与语义y2计算NMSE。</p>
<p><strong>结论</strong></p>
<p><strong>需要考虑基于region和双向对齐</strong></p>
<p>=》提出真实语义区域的region masks的shape进行度量=》现存数据集都未设定这样的规则=》本文方法</p>
<h1><span id="5-realya-new-3d-face-benchmark">5. REALY:A New 3D Face Benchmark</span></h1><p>100个个体</p>
<p>每个个体包含高分辨率shape(来自LYHN的aligned 3D scan)和低分辨率shape(使用HIFI3D基底拓扑进行重新拓扑化)</p>
<p>所有shape始终等比例缩放对齐,</p>
<p>同时每个shape都有68个keypoints和4个region masks</p>
<p>对于每个个体,使用精心设计的照明条件和gt相机参数渲染出5张高质量的多视图图像(包括1张正面图像)</p>
<p><img src="/2023/06/01/review_12_REALY/image-20230601212010004.png" alt="image-20230601212010004"></p>
<h2><span id="选择hifi3d基底作为目标拓扑的原因">选择HIFI3D基底作为目标拓扑的原因</span></h2><p>LYHM 在眼睛和嘴巴的边界处有过密的采样;</p>
<p>LSFM 没有边缘循环来定义眼睛和嘴巴的轮廓;</p>
<p>FLAME的三角剖分不自然,无法模拟一些逼真的肌肉动作,比如抬眉毛。 作为比较,HIFI3D 具有更好的三角剖分和平衡采样,可以做出逼真和细腻的表达。 </p>
<p>此外,HIFI3D还有眼球、嘴巴内部结构、肩部区域等,这些都将有利于下游应用。</p>
<p><img src="/2023/06/01/review_12_REALY/image-20230601220745894.png" alt="image-20230601220745894"></p>
<h2><span id="数据集构建步骤">数据集构建步骤</span></h2><p>第一,从 LYHM 收集 1235 个scans数据,并在 HIFI3D 拓扑中准备<strong>模板形状 Stemp</strong>,其中<strong>预定义了 68 个关键点 Ktemp 和 4 个区域掩码 Rtemp</strong>(包括鼻子、嘴巴、前额和脸颊区域)。</p>
<p>第二,将输入扫描重新缩放并严格对齐到模板形状 Stemp,从而生成我们的真实高分辨率网格 SH(即<strong>对齐扫描</strong>)。 </p>
<p>第三,定义一个评估区域(有相关论文),该区域是一个以鼻尖为中心的圆盘。</p>
<p>第四,将 Stemp“包装”(即<strong>执行非刚性配准</strong>)到每个 SH 以获得重新拓扑化的 SL,使得 SL 具有与 Stemp 相同的拓扑但反映 SH 的形状。(<strong>高分配准低分</strong>) 请注意,我们有关键点 KL = Ktemp 和区域 RL = Rtemp,因为 <strong>SL 和 Stemp 共享相同的 HIFI3D 拓扑</strong></p>
<p>第五,将每个人的 KL 和 RL 从 SL 转移到 SH。(<strong>低分的region和mask转移到高分</strong>) 我们还设置了一个渲染管道,用于为带纹理的高分辨率网格 SH 合成多视图图像。 这种受控环境使REALY能够专注于反映不同方法的重建能力。<br>第六,过滤掉wrapping error(这里不理解)大于 0.2mm 的样本,并请具有 3 年建模经验的专家艺术家从所有处理过的扫描中选择 100 个具有最高模型质量的个体,跨越不同的性别、种族和年龄,以获得我们的真正的基准(<strong>最终人工筛选高质量模型</strong>)。</p>
<p><img src="/2023/06/01/review_12_REALY/image-20230601220904606.png" alt="image-20230601220904606"></p>
<p><img src="/2023/06/01/review_12_REALY/image-20230601212947987.png" alt="image-20230601212947987"></p>
<h2><span id="挑战与解决方案">挑战与解决方案</span></h2><h3><span id="挑战一原始扫描具有不同的比例和姿势具有不准确的稀疏keypoints这使得它们难以一致地对齐">挑战一:原始扫描具有不同的比例和姿势,具有不准确的稀疏keypoints,这使得它们难以一致地对齐。</span></h3><p>为了解决这个问题,我们迭代以下步骤直到收敛:</p>
<p>第一,渲染一张高分shape的前脸、带纹理的图像(使用initial/estimated transformation)来对齐SH到Stemp(注意正面姿势需要alignment transformation,因为对于给定的scan数据,正面姿势是未知的需要进行统一对齐);</p>
<p>第二,使用sota的landmark detector来检测这张渲染图像的2D 面部keypoints;</p>
<p>第三,使用渲染相机视角将 2D 关键点投影到 3D; </p>
<p>第四,使用 SH 上的投影 3D 关键点与 Stemp 上已知的 3D 关键点之间的对应关系,更新从 SH 到 Stemp 的对齐变换。</p>
<h3><span id="挑战二得到重新拓扑的-sl-之后如何准确地将region-masks从-sl继承自-stemp转移到sh">挑战二:得到重新拓扑的 SL 之后,如何准确地将region masks从 SL(继承自 Stemp)转移到SH</span></h3><p> 一种天真的解决方案是使用从 SL 到 SH 的最近邻映射来传输区域掩码。 然而,由于 SH 的分辨率可以比 SL 的分辨率大 50 倍,这种天真的解决方案将引入断开连接和嘈杂的区域掩码。 为避免此类缺陷,我们从两个方向使用顶点到点映射来查找 SH 上的候选区域。<br>由于在从 SH 到 SL 的映射过程中可以建立更多的对应关系,因此可以获得更高质量、更平滑的区域掩码。 最后,我们过滤掉噪声区域(例如,鼻孔、眼球)并返回最大的连接区域。</p>
<h2><span id="hifi3d">HIFI3D++</span></h2><p>通过以上过程,我们可以通过对更多的3D人脸模型进行重新拓扑来进一步构建新的3DMM基底。</p>
<p>具体来说,基于来自 HIFI3D 的 200 个个体,我们另外处理和重新拓扑来自 FaceScape 数据集的 846 个个体的 3D 人脸模型到 HIFI3D 拓扑中。 连同上述来自 LYHM 的 1235 个个体的处理模型,我们收集并选择了 1957 个最具代表性的mesh数据。 </p>
<p>然后,我们应用 PCA 获得我们的新基底,包含 526 个 PC(具有 99.9% 的累积解释方差),我们将其命名为 HIFI3D++。</p>
<p>下图显示了 HIFI3D++ 与其他 3DMM 的比较。 请注意,以前的 3DMM 或多或少存在种族偏见。 例如,BFM 主要由欧洲人构建,FLAME 由美国和欧洲的扫描构建,而 HIFI3D 和 FS 由亚洲人的扫描构建。<br>LSFM 和 FLAME 分别包含 50 : 1 和 12 : 1 的白种人和亚洲人。 相比之下,HIFI3D++ 由跨越更平衡的种族群体的高质量模型构建,确保白种人和亚洲人(加上来自其他种族的一些受试者)之间的比例为 1:1。</p>
<p><img src="/2023/06/01/review_12_REALY/image-20230601222014228.png" alt="image-20230601222014228"></p>
<h1><span id="6-创新的evaluation-pipeline">6 创新的Evaluation pipeline</span></h1><p><strong>本文提出的pipeline就是采用rICP+bICP取代standard pipeline的直接gICP</strong></p>
<p>在REALY的基础上,我们提出一个新的评价流程避免先前评价流程的问题,具体而言,我们的评价流程包含如下两个步骤:</p>
<p><strong>(该两步分别对应上文的motivation)</strong></p>
<p><strong>第一,局部区域的对齐 region-aware ICP(对齐region)</strong></p>
<p>考虑到不同区域的重建质量会影响全局的对齐结果,由于我们的benchmark得到了不同脸部区域的mask,因此我们可以借助这个信息将predicted mesh对齐到ground-truth scan的特定区域,在error计算时只计算ground-truth scan上的特定区域与predicted mesh之间的误差,而不考虑脸部其他区域对于对齐结果以及误差计算的影响。</p>
<p><img src="/2023/06/01/review_12_REALY/image-20230601223856306.png" alt="image-20230601223856306"></p>
<p><strong>第二,对应关系的建立 non-rigid and bidirectional ICP(构建点对)</strong></p>
<p>在局部对齐的基础上,我们需要建立ground-truth scan某一区域上的每一个点与predicted mesh之间的对应点并计算两者的误差。考虑到先前基于最近点的方式存在的问题,我们提出一个新的对应关系的建立方法,提高了关键点语义信息的一致性。</p>
<p><img src="/2023/06/01/review_12_REALY/image-20230601223904991.png" alt="image-20230601223904991"></p>
<p>具体而言,我们<strong>首先通过最近点建立初步的对应关系(region-aware ICP)</strong>;随后<strong>借助non-rigid ICP将ground-truth scan某一区域变形到predicted mesh</strong>上,由于变形后的区域与predicted mesh已经贴合,因为在变形过程中考虑了具备语义信息的关键点损失,所以这时的对应关系相比于原始的最近点的对应关系具有更好的语义关系的一致性(如,图3中脸部关键点的一致性),从而我们<strong>对初始的对应关系进行更新</strong>;最后,由于变形前后的拓扑形状的一致性,我们能够<strong>借助更新后的对应关系计算原始的ground-truth scan区域与局部对齐的mesh之间的最终误差</strong>。</p>
<p><strong>下图为三种ICP后gt和predicted的关联度</strong></p>
<p><img src="/2023/06/01/review_12_REALY/image-20230601223102196.png" alt="image-20230601223102196"></p>
<h1><span id="7-实验">7. 实验</span></h1><h2><span id="消融实验bicp-vs-gicp">消融实验:bICP VS gICP</span></h2><p><img src="/2023/06/01/review_12_REALY/image-20230604150316983.png" alt="image-20230604150316983"></p>
<p>从图4来看,全局的对齐策略由于局部区域的改变容易导致全局误差的变化,而我们的对齐策略则只聚焦于特定区域,其中对角线的error map表明误差较大的区域,而非对角线的error map的误差较小,对应没有发生变化的区域。</p>
<p><img src="/2023/06/01/review_12_REALY/image-20230604150534367.png" alt="image-20230604150534367"></p>
<p>从表2来看,我们的对齐结果通过ground-truth的对应点计算得到的误差与真实的误差更为接近,而全局的对齐策略则导致误差与真实误差不匹配。</p>
<p>从表3来看,我们的对应点计算策略带来的误差要显著小于全局对齐后最近点获得的对应点。实验结果表明,我们的评价流程不仅能够聚焦到脸部区域有差异的部分(图4和表2的对角线),并且我们的对应关系建立更加准确(表3)。</p>
<h2><span id="不同方法在realy-benchmark上的表现">不同方法在REALY benchmark上的表现</span></h2><p>具体可见REALY官网列表</p>
<p>我们对比了先前的评价流程与我们提出的评价流程在REALY benchmark上的表现。对于先前的评价方法,我们从两个方向(即ground-truth scan的每个点与predicted mesh建立对应关系,以及predicted mesh每个点与ground-truth scan建立对应关系)作为对比,定量与定性的比较如表4和图5所示。</p>
<p><img src="/2023/06/01/review_12_REALY/image-20230604151228612.png" alt="image-20230604151228612"></p>
<p><img src="/2023/06/01/review_12_REALY/image-20230604151250890.png" alt="image-20230604151250890"></p>
<p>我们通过user study投票选出各组最好(*)/次好(†)的人脸,通过比较不同评价流程选出的最好的人脸(橙、蓝、紫框)可以发现,我们的评价流程(橙框)选出的最好的人脸与user study的投票结果匹配程度更高。并且,我们的评价流程给出了细粒度的评测结果,即:对不同的人脸区域都能进行定量的评价和比较。</p>
<h2><span id="不同3dmm在realy上的表现">不同3DMM在REALY上的表现</span></h2><p>借助REALY benchmark,本文采用RGB(-D) Fitting的方式对不同3DMM的表达能力进行了评价,定量与定性的比较如表5和图8所示</p>
<p><img src="/2023/06/01/review_12_REALY/image-20230604151640859.png" alt="image-20230604151640859"></p>
<p><img src="/2023/06/01/review_12_REALY/image-20230604151657772.png" alt="image-20230604151657772"></p>
<p>定量和定性的结果表明,我们的3DMM在REALY上取得了更优的重建效果,并且,通过不同方法的比较表明,RGB-D Fitting的结果要显著优于目前最好的重建算法,3D人脸重建任务仍有很大的提升空间。</p>
<p>为了进一步证明HIFI3D++的表达能力,我们只用顶点损失,根据最小二乘的方式拟合一组mesh,对HIFI3D/HIFI3D(A)/HIFI3D++进行比较,如图9所示。</p>
<p><img src="/2023/06/01/review_12_REALY/image-20230604151756157.png" alt="image-20230604151756157"></p>
<h1><span id="8-总结">8. 总结</span></h1><p>本文是我们对3D人脸重建评价的重新思考和探索。针对先前的评价指标无法准确衡量重建mesh与ground-truth相似性的问题,我们构建了一个新的数据集——REALY,包含更加丰富以及高质量的脸部区域信息,并借助新的评价流程对先前的数十个重建算法、3DMM进行了评价。</p>
]]></content>
<categories>
<category>paper review</category>
</categories>
<tags>
<tag>3D Face Reconstruction</tag>
</tags>
</entry>
<entry>
<title>《Towards Realistic Generative 3D Face Models》</title>
<url>/2023/06/07/review_13_AlbedoGAN/</url>
<content><![CDATA[<!-- toc -->
<ul>
<li><a href="#1-%E8%B4%A1%E7%8C%AE">1. 贡献</a></li>
</ul>
<!-- tocstop -->
<p>paper: [<a href="https://arxiv.org/abs/2304.12483">2304.12483] Towards Realistic Generative 3D Face Models (arxiv.org)</a></p>
<p>code: <a href="https://github.com/aashishrai3799/Towards-Realistic-Generative-3D-Face-Models/">aashishrai3799/Towards-Realistic-Generative-3D-Face-Models: 3D face model that can generate high-quality mesh and texture (github.com)</a></p>
<span id="more"></span>
<h1><span id="1-贡献">1. 贡献</span></h1>]]></content>
<categories>
<category>paper review</category>
</categories>
<tags>
<tag>3D Face Reconstruction</tag>
</tags>
</entry>
<entry>
<title>《FFHQ-UV:Normalized Facial UV-Texture Dataset for 3D Face Reconstruction》</title>
<url>/2023/06/07/review_14_FFHQ-UV/</url>
<content><![CDATA[<!-- toc -->
<ul>
<li><a href="#1-%E8%B4%A1%E7%8C%AE">1. 贡献</a></li>
<li><a href="#2-ffhq-uv%E6%95%B0%E6%8D%AE%E9%9B%86%E5%88%9B%E5%BB%BA%E7%AE%A1%E9%81%93">2. FFHQ-UV数据集创建管道</a><ul>
<li><a href="#21-%E5%9F%BA%E4%BA%8Estylegan%E7%9A%84%E9%9D%A2%E9%83%A8%E5%9B%BE%E5%83%8F%E7%BC%96%E8%BE%91">2.1 基于StyleGAN的面部图像编辑</a></li>
</ul>
</li>
</ul>
<!-- tocstop -->
<p>paper: [<a href="https://arxiv.org/abs/2211.13874">2211.13874] FFHQ-UV: Normalized Facial UV-Texture Dataset for 3D Face Reconstruction (arxiv.org)</a></p>
<p>code: <a href="https://github.com/aashishrai3799/Towards-Realistic-Generative-3D-Face-Models/"><a href="https://github.com/csbhr/FFHQ-UV">csbhr/FFHQ-UV: The official repository of our CVPR2023 paper “FFHQ-UV: Normalized Facial UV-Texture Dataset for 3D Face Reconstruction”. (github.com)</a></a></p>
<span id="more"></span>
<h1><span id="1-贡献">1. 贡献</span></h1><p>设计了一个从真实人脸图像生成高质量 UV 纹理图的全自动管道,涉及人脸编辑、UV 纹理的提取、矫正和补全;</p>
<p>基于 FFHQ,创建并开源了一个具有均匀光照、中立表情和干净面部区域的大规模 UV 纹理数据集 FFHQ-UV;</p>
<p>基于 FFHQ-UV,提出了一个 3D 人脸重建算法,在高保真度和高质量上超越现有方法。</p>
<h1><span id="2-ffhq-uv数据集创建管道">2. FFHQ-UV数据集创建管道</span></h1><p><img src="/2023/06/07/review_14_FFHQ-UV/image-20230608092241715.png" alt="image-20230608092241715"></p>
<p>分为三步:</p>
<p>1、基于StyleGAN的面部图像编辑</p>
<p>2、面部UV纹理提取</p>
<p>3、UV纹理校正和补全</p>
<h2><span id="21-基于stylegan的面部图像编辑">2.1 基于StyleGAN的面部图像编辑</span></h2><p>首先从单视图野外图像中提取出多视图、归一化后的人脸图像,由此产生的图像具有均匀的光照、中性的表情、无遮挡(眼镜头发等等)。</p>
<p><strong>具体来说,首先使用GAN inversion方法e4e获取W+潜在空间中的w参数,后使用人脸编辑方法 StyleFlow 和 InterFaceGAN 自动编辑 StyleGAN2 的 W+ 潜在空间中的图像属性</strong>。</p>
<p>GAN inversion可以将一张图像映射到一个GAN生成器的隐空间中,从而利用StyleGAN强大的能力对图片进行编辑。</p>
<p>源码阅读:</p>
<p>run_ffhq_uv_dataset.sh</p>
]]></content>
<categories>
<category>paper review</category>
</categories>
<tags>
<tag>3D Face Reconstruction</tag>
</tags>
</entry>
<entry>
<title>《Facial Geometric Detail Recovery via Implicit Representation》</title>
<url>/2023/07/05/review_15_PBIDR/</url>
<content><![CDATA[<!-- toc -->
<ul>
<li><a href="#1-%E7%9B%AE%E6%A0%87">1、目标</a></li>
<li><a href="#2-%E8%B4%A1%E7%8C%AE">2、贡献</a></li>
<li><a href="#3-%E7%AE%80%E4%BB%8B">3、简介</a></li>
<li><a href="#4-%E7%9B%B8%E5%85%B3%E5%B7%A5%E4%BD%9C">4、相关工作</a></li>
<li><a href="#5-%E5%85%B7%E4%BD%93%E6%96%B9%E6%B3%95">5、具体方法</a><ul>
<li><a href="#51-%E9%81%AE%E6%8C%A1%E9%B2%81%E6%A3%92%E7%BA%B9%E7%90%86%E8%A1%A5%E5%85%A8">5.1 遮挡鲁棒纹理补全</a></li>
<li><a href="#52-%E7%BA%B9%E7%90%86%E5%BC%95%E5%AF%BC%E7%9A%84%E9%9D%A2%E9%83%A8%E5%87%A0%E4%BD%95%E7%BB%86%E8%8A%82%E6%81%A2%E5%A4%8D">5.2 纹理引导的面部几何细节恢复</a></li>
</ul>
</li>
</ul>
<!-- tocstop -->
<p>paper: <a href="https://arxiv.org/pdf/2203.09692v1.pdf">2203.09692v1.pdf (arxiv.org)</a></p>
<p>code: <a href="https://github.com/deepinsight/insightface/tree/master/reconstruction/PBIDR">insightface/reconstruction/PBIDR at master · deepinsight/insightface · GitHub</a></p>
<span id="more"></span>
<h1><span id="1-目标">1、目标</span></h1><p>单图三维人脸重建</p>
<p>有限的低维3DMM统计模型会导致重建效果平滑,缺乏细节</p>
<p>直接预测三维模型结构的方法成本高昂,需要大量匹配的三维扫描数据</p>
<p>参数化的纹理空间表达力有限(一般都是较低维的)</p>
<p>输入的野外图像容易受遮挡和阴影等环境因素的影响</p>
<h1><span id="2-贡献">2、贡献</span></h1><p>设计了一种单张图像获取高保真纹理和几何形状的方法;</p>
<p>设计了遮挡鲁棒的面部纹理补全方法,仅使用预训练的StyleGAN-v2生成器;</p>
<p>设计了一种详细的形状优化方法,一种基于物理的深度网络,解耦出镜面法线以更好地恢复几何细节;</p>
<h1><span id="3-简介">3、简介</span></h1><p>提出一种<strong>人脸几何细节恢复方法</strong>,包括了<strong>纹理增强</strong>和<strong>几何增强</strong></p>
<p><strong>纹理增强部分</strong></p>
<p>首先人脸解析生成蒙版,后输入StyleGAN Encoder来修复被遮挡的图像,然后使用无遮挡的图像修复蒙版图像</p>
<p><strong>几何增强部分</strong></p>
<p>先使用完整面部纹理图像和3DMM得出的粗糙几何形状渲染出多视角的图像;输入这些渲染图像,后经过深度网络分离,漫反射法线(diffuse normal)和镜面法线(specular normal)</p>
<p><img src="/2023/07/05/review_15_PBIDR/image-20230705211531697.png" alt="image-20230705211531697"></p>
<h1><span id="4-相关工作">4、相关工作</span></h1><p><strong>纹理修复相关工作</strong></p>
<p>利用面部对称性训练image to image网络,需要匹配训练数据</p>
<p>将纹理修复视为补全问题,使用StyleGAN-v2修复遮挡部分,但存在外部遮挡时会失效</p>
<p><strong>几何增强相关工作</strong></p>
<p>基于优化——拟合3DMM获得粗略形状,后使用shape from shading生成细节——遮挡敏感</p>
<p>基于回归——拟合3DMM获得粗略形状,回归高分扫描数据;回归displacement map;回归bump map;利用多视图图像数据回归;利用light-stage数据来学习漫反射和镜面反射率;直接学习可动画化的displacement map;</p>
<p>无3DMM模型——直接重建密集网格或推断表面法线 image to mesh</p>
<p><strong>隐式表面重建</strong></p>
<p>SDF理论介绍:</p>
<p><a href="https://zhuanlan.zhihu.com/p/536530019">SDF(signed distance field)基础理论和计算 - 知乎 (zhihu.com)</a></p>
<p>SDF的本质就是存储每个点到图形的最近距离,即将模型划出一个表面,在模型表面外侧的点数值大于0,在模型表面内侧的点数值小于0。</p>
<h1><span id="5-具体方法">5、具体方法</span></h1><h2><span id="51-遮挡鲁棒纹理补全">5.1 遮挡鲁棒纹理补全</span></h2><p><strong>去除外部遮挡</strong></p>
<p>给定输入图像与通过现成人脸分割网络得到的人脸图像蒙版,和使用StyleGAN-v2对latent space采样进行复原</p>
<p><img src="/2023/07/05/review_15_PBIDR/image-20230706213722366.png" alt="image-20230706213722366"></p>
<p>遵循与OSTeC相同的方式来初始化潜在参数,这加速了收敛并帮助优化器避免局部极小值。 然后,使用学习率为 0.25 的 Adam优化器对潜在参数(方程 1)进行优化。 请注意,我们的过程(例如拼接、掩模预测)是全自动的,不需要针对不同图像进行参数调整。</p>
<p><strong>纹理补全</strong></p>
<p>这部分基本是基于OSTeC的工作上做的;与OSTeC所用的3DMM估计粗略形状;获取可视部分,再以不同的姿势重新渲染修复混合</p>
<p><strong>多视角面部的再渲染</strong></p>
<p>选择各种预设相机姿势下使用纹理图渲染网格结构,收集多视角的渲染图以便之后使用</p>
<h2><span id="52-纹理引导的面部几何细节恢复">5.2 纹理引导的面部几何细节恢复</span></h2><p>给定一连串渲染图和他们对应的几何结构,定义一个SDF和一个可微分渲染器PBIDR,使用PBIDR优化SDF,获得精确的镜面法线和隐式的面部表面,最后传回3DMM拓扑。</p>
<p><strong>SDF的形状表示</strong></p>
<p><img src="/2023/07/05/review_15_PBIDR/image-20230706221922642.png" alt="image-20230706221922642"></p>
<p>预测一个点到面的映射</p>
<p><strong>基于物理的隐式可微分渲染器PBIDR</strong></p>
<p>传统上,面部重建方法使用简单的 Lambertian 着色模型来渲染具有单个反照率纹理的面部网格。 相反,逼真的面部渲染需要额外的材质属性和昂贵的着色模型。 Blinn-Phong 着色模型分别对漫反射和镜面着色进行建模,并且可以以较低的计算成本近似人体皮肤渲染。 此外,分离漫反射法线和镜面法线还可以近似皮肤的漫反射次表面散射,它受镜面法线中存在的高频细节的影响较小。 相反,镜面法线代表一些细观表面细节的外观,例如细皱纹和皮肤毛孔,这些细节通常很难提取,但它们在渲染中的效果很显着。</p>
<p>将镜面法线近似为SDF的梯度,光滑的漫反射法线近似为再原始粗糙网格上进行重心采样获得的法线,这样只有SDF法线负责渲染图像的高频细节,从而指导SDF更准确地捕获它们。因此,可将该顶点的外观分解为:</p>
<p><img src="/2023/07/05/review_15_PBIDR/image-20230706223609630.png" alt="image-20230706223609630"></p>
<p><strong>形状细节优化</strong></p>
<p>定义了一个优化框架,并使用光度损失、掩蔽损失、eikonal 损失、配准损失和法线损失来训练 SDF MLP 结构。</p>
<p><img src="/2023/07/05/review_15_PBIDR/image-20230706223750017.png" alt="image-20230706223750017"></p>
<p><img src="/2023/07/05/review_15_PBIDR/image-20230706223802170.png" alt="image-20230706223802170"></p>
<p><strong>将细化的SDF转换到模板网格</strong></p>
<p>优化 Fθ 后,我们可以估计任意点的梯度和 SDF 值,并将它们“拉”到隐式曲面。 因此,我们计算粗 3D 网格中顶点的 SDF 值,然后近似其法线。 然后,我们保留原始网格面,并通过其法线和 SDF 值给每个顶点一个位移,得到细粒度网格 Gf 如下:</p>
<p><img src="/2023/07/05/review_15_PBIDR/image-20230706224023313.png" alt="image-20230706224023313"></p>
]]></content>
<categories>
<category>paper review</category>
</categories>
<tags>
<tag>3D Face Reconstruction</tag>
</tags>
</entry>
<entry>
<title>《Multiview Neural Surface Reconstruction by Disentangling Geometry and Appearance》</title>
<url>/2023/07/07/review_16_IDR/</url>
<content><![CDATA[<!-- toc -->
<!-- tocstop -->
<p>ref link: <a href="https://blog.csdn.net/pylittlebrat/article/details/127883937">(99条消息) IDR 学习笔记_multiview neural surface reconstruction by disenta_ACxz的博客-CSDN博客</a></p>
<span id="more"></span>
]]></content>
<categories>
<category>paper review</category>
</categories>
<tags>
<tag>3D Face Reconstruction</tag>
</tags>
</entry>
<entry>
<title>《Sider:Singleimage neural optimization for facial geometric detail recovery》</title>
<url>/2023/07/07/review_17_SIDER/</url>
<content><![CDATA[<!-- toc -->
<ul>
<li><a href="#1-%E7%9B%AE%E6%A0%87">1、目标</a></li>
<li><a href="#2-%E8%B4%A1%E7%8C%AE">2、贡献</a></li>
<li><a href="#3-%E6%96%B9%E6%B3%95">3、方法</a><ul>
<li><a href="#31-%E6%9E%B6%E6%9E%84">3.1 架构</a></li>
<li><a href="#32-%E5%AD%A6%E4%B9%A0%E7%B2%97%E7%B3%99%E5%87%A0%E4%BD%95%E7%BB%93%E6%9E%84">3.2 学习粗糙几何结构</a></li>
<li><a href="#33-%E6%81%A2%E5%A4%8D%E9%9D%A2%E9%83%A8%E5%87%A0%E4%BD%95%E7%BB%86%E8%8A%82">3.3 恢复面部几何细节</a></li>
</ul>
</li>
<li><a href="#4-%E5%AE%9E%E9%AA%8C">4、实验</a><ul>
<li><a href="#41-%E5%AE%9E%E6%96%BD%E7%BB%86%E8%8A%82">4.1 实施细节</a></li>
</ul>
</li>
</ul>
<!-- tocstop -->
<p>paper: <a href="https://arxiv.org/pdf/2108.05465.pdf">2108.05465.pdf (arxiv.org)</a></p>
<p>code: none</p>
<span id="more"></span>
<h1><span id="1-目标">1、目标</span></h1><p>单图人脸几何细节重建</p>
<p>结合3DMM和SDF的隐式几何表达用神经网络做优化</p>
<h1><span id="2-贡献">2、贡献</span></h1><p>提出了SIDER,一种无监督从单图重建人脸几何细节的方法;</p>
<p>提出了一种新颖的从粗到精的优化方案,该方案利用经典的3DMM模型表示作为先验来防止 SDF 的退化解决方案,并使用无监督的光度损失进行优化;</p>
<h1><span id="3-方法">3、方法</span></h1><p>给定单个图像,SIDER 旨在从中提取面部几何细节,例如皱纹和皮肤褶皱。<br>SIDER 使用两阶段神经优化方法来提取这些细节。 在第一阶段,我们先利用 FLAME 可变形模型 ,以学习面部的粗略几何形状,其表示为 SDF。<br>接下来,我们根据所提供图像 I 的光度损失来优化此 SDF,以学习面部几何细节。 下面我们详细阐述SIDER的运作和训练过程。</p>
<h2><span id="31-架构">3.1 架构</span></h2><p><img src="/2023/07/07/review_17_SIDER/image-20230708162612823.png" alt="image-20230708162612823"></p>
<p><img src="/2023/07/07/review_17_SIDER/image-20230710141317269.png" alt="image-20230710141317269"></p>
<p>几何网络预测两种数据:</p>
<p><img src="/2023/07/07/review_17_SIDER/image-20230710143021110.png" alt="image-20230710143021110"></p>
<p>前者为对应一个点x上经过位置编码所预测的SDF值;后者为在x处预测的特征向量用于输入渲染网络。</p>
<p>渲染网络输入输出如下:</p>
<p><img src="/2023/07/07/review_17_SIDER/image-20230710145857267.png" alt="image-20230710145857267"></p>
<p>输入经过编码后的x,x处的法线,经过编码后的视角,在几何网络种预测的x处的特征向量。</p>
<h2><span id="32-学习粗糙几何结构">3.2 学习粗糙几何结构</span></h2><p>基于FLAME(与全身的SMPL类似)</p>
<p><a href="https://aitechtogether.com/article/17540.html">3D人脸模型Flame —-《Learning a model of facial shape and expression from 4D scans》论文讲解及代码注释 | AI技术聚合 (aitechtogether.com)</a></p>
<p><a href="https://zhuanlan.zhihu.com/p/591136896">基于FLAME的三维人脸重建技术总结 - 知乎 (zhihu.com)</a></p>
<p>基于LBS(linear blend skinning)并结合blendshape(并非arkits规则)作为表示</p>
<p>给定一张图像I,FLAME使用standard landmark来拟合:</p>
<p><img src="/2023/07/07/review_17_SIDER/image-20230710163331427.png" alt="image-20230710163331427"></p>
<p>前一个L是FLAME模型的第i个landmark的位置,后一个使用3DDFA预测得到的landmark作为GT值,优化的参数为FLAME模型的shape,exp,pose参数以及相机参数。训练一个MLP来进行拟合。</p>
<p><img src="/2023/07/07/review_17_SIDER/image-20230710163941399.png" alt="image-20230710163941399"></p>
<p>其中P是FLAME模型<strong>附近空间中</strong>随机选取的一组点;x是此空间中一个点;φ 是位置编码;SDFGT (·) 是针对粗糙网格的SDF的GT值;由于 FLAME 网格是一个开放且单一的表面层,因此无法直接在其上定义 SDF(不存在距离为负的区域,因为没有“内部”)。 因此,为了定义SDF,将网格视为一个有“厚度”的体积物体。 这使我们能够将真实 SDF 定义如下:</p>
<p><img src="/2023/07/07/review_17_SIDER/image-20230710164824672.png" alt="image-20230710164824672"></p>
<p>其中 Point2Mesh 是点到网格的距离函数,是一个表示网格厚度的小数字。</p>
<p>此外,几何网络使用 eikonal 损失进行正则化:</p>
<p><img src="/2023/07/07/review_17_SIDER/image-20230710165139092.png" alt="image-20230710165139092"></p>
<h2><span id="33-恢复面部几何细节">3.3 恢复面部几何细节</span></h2><p>使用输入的原始图像I来fine-tune几何网络以恢复几何细节。</p>
<p>为渲染SDF,使用sphere-tracing结合渲染网络。光线从相机中心o射入场景,并使用球体追踪和隐式微分来估计这些光线与面部网格的交点,更通俗地说,使用渲染网络预测相交点的RGB值。</p>
<p>具体使用Multiview Neural Surface Reconstruction by Disentangling Geometry and Appearance这篇文章中的方法。</p>
<p>更通俗地说,考虑一条射线,r = o + vt,其观察方向为 v,表面交点为 xˆ。xˆ 处的 RGB 颜色计算如下:</p>
<p><img src="/2023/07/07/review_17_SIDER/image-20230710155252181.png" alt="image-20230710155252181"></p>
<p>就是上面的公式</p>
<p><img src="/2023/07/07/review_17_SIDER/image-20230710155704886.png" alt="image-20230710155704886"></p>
<p>总体的几何细节生成loss</p>
<p><img src="/2023/07/07/review_17_SIDER/image-20230710155711482.png" alt="image-20230710155711482"></p>
<h1><span id="4-实验">4、实验</span></h1><h2><span id="41-实施细节">4.1 实施细节</span></h2><p><strong>数据集</strong></p>
<p>FFHQ ALFW2000 NoW</p>
<p>resize到256</p>
<p><strong>几何网络</strong></p>
<p>8层全连接 一个残差连接(从input到第四层)与Multiview Neural Surface Reconstruction by Disentangling Geometry and Appearance文中结构相似</p>
<p><strong>渲染网络</strong></p>
<p>四层全连接,其输入被非线性映射以学习高频。两个MLP的每一层都包括512个隐藏单元。</p>
<p>首先对几何网络进行1000个epoch的训练,以学习粗略几何形状。然后,通过优化对其进行微调,并联合训练渲染网络约200-300个epoch。使用Adam优化器,学习率为10-4。</p>
]]></content>
<categories>
<category>paper review</category>
</categories>
<tags>
<tag>3D Face Reconstruction</tag>
</tags>
</entry>
<entry>
<title>《A Hierarchical Representation Network for Accurate and Detailed Face Reconstruction from In-The-Wild Images》</title>
<url>/2023/07/12/review_18_HRN/</url>
<content><![CDATA[<!-- toc -->
<ul>
<li><a href="#1-%E7%9B%AE%E6%A0%87">1、目标</a></li>
<li><a href="#2-%E4%BB%8B%E7%BB%8D">2、介绍</a></li>
<li><a href="#3-%E6%96%B9%E6%B3%95">3、方法</a><ul>
<li><a href="#31-%E6%96%B9%E6%B3%95%E6%A6%82%E8%BF%B0">3.1 方法概述</a></li>
<li><a href="#32-%E5%88%86%E5%B1%82%E5%BB%BA%E6%A8%A1">3.2 分层建模</a></li>
</ul>
</li>
</ul>
<!-- tocstop -->
<p>paper: [<a href="https://arxiv.org/abs/2302.14434">2302.14434] A Hierarchical Representation Network for Accurate and Detailed Face Reconstruction from In-The-Wild Images (arxiv.org)</a></p>
<p>code: [youngLBW/HRN: <a href="https://github.com/youngLBW/HRN">CVPR2023] A Hierarchical Representation Network for Accurate and Detailed Face Reconstruction from In-The-Wild Images. (github.com)</a></p>
<span id="more"></span>
<h1><span id="1-目标">1、目标</span></h1><p><img src="/review_18_HRN/image-20230712065221103.png" alt="image-20230712065221103"></p>
<p>在三个层面上解耦出不同的资产,以达到良好的重建效果</p>
<p>三个层面:3DMM粗网格结构;deformation map;displacement map</p>
<p>可拓展到muti view工况</p>
<p>介绍了阿里自己做的一个数据集(还未公开)</p>
<h1><span id="2-介绍">2、介绍</span></h1><p>现有的方法要么使用低维的3DMM实现低频细节,要么再考虑displacement map实现高频细节,往往忽略了中频细节。</p>
<p>本方法将人脸几何结构解耦为低中高三频细节,后针对这三者分别建模为face-wise blendshape coefficients、vertex-wise deformation map、pixel-wise displacement map。</p>
<p><strong>贡献</strong></p>
<p>1、分三层建模</p>
<p>2、GT创建流程,以及设计de-reouching模块</p>
<p>3、可拓展至muti-view重建</p>
<p>4、引入FaceHD-100数据集</p>
<h1><span id="3-方法">3、方法</span></h1><p><img src="/review_18_HRN/image-20230712070647960.png" alt="image-20230712070647960"></p>
<h2><span id="31-方法概述">3.1 方法概述</span></h2><p>我们首先使用3DMM来预测coarse mesh和albedo map(蓝色区域)。然后,我们开发了一种分层建模策略,以从粗到细的方式处理复杂的面部细节(绿色和紫色区域)。为了便于对层次细节进行准确和忠实的建模,结合3D先验进行对抗和半监督学习。<br>此外,我们提出了一个de-rectouching module,以实现几何结构和外观的更好解耦,缓解各种皮肤纹理和照明之间的模糊性。此外,我们将我们的框架扩展到多视图方式,并引入了高质量的3D人脸数据集,以促进稀疏视图人脸重建的研究。为了简化,我们在每一节中指定了相关的损失函数和训练策略。</p>
<h2><span id="32-分层建模">3.2 分层建模</span></h2><p>图1解释了模型在不同层次上所体现的细节变化。</p>
<p>低频部分,其提供与输入面大致对准的粗略形状;</p>
<p>中频细节,其描述相对于低频部分的轮廓和局部形状的细节;</p>
<p>高频细节,如褶皱、微凸起等。</p>
<p><strong>具体设计如下</strong></p>
<p>低频部分,选择BFM作为基础模型,并输出低维系数来实现粗略重建;</p>
<p>中频细节,三通道的deformation map,关联position map,在uv空间上可定位到三维结构上的某一顶点,在三通道上表示相对偏移;64x64x3;</p>
<p>高频细节,采用DECA中的displacement map,表示沿法线方向的几何变形,256x256x1;displacement map以像素方式转换为渲染过程中使用的详细法线,以显示所有微小的细节,打破了基础模型顶点密度的限制。因此,我们能够用这些表示来描述任意复杂的面。</p>
]]></content>
<categories>
<category>paper review</category>
</categories>
<tags>
<tag>3D Face Reconstruction</tag>
</tags>
</entry>
<entry>
<title>《Sparse Local Patch Transformer for Robust Face Alignment and Landmarks Inherent Relation Learning》</title>
<url>/2022/03/25/review_1_Sparse%20Local%20Patch%20Transformer%20for%20Robust%20Face%20Alignment%20and%20Landmarks/</url>
<content><![CDATA[<!-- toc -->
<ul>
<li><a href="#%E5%87%BA%E5%8F%91%E7%82%B9">出发点</a></li>
<li><a href="#%E5%88%9B%E6%96%B0%E7%82%B9">创新点</a></li>
<li><a href="#%E5%81%9A%E6%B3%95">做法</a></li>
</ul>
<!-- tocstop -->
<p>paper: [<a href="https://arxiv.org/abs/2203.06541">2203.06541] Sparse Local Patch Transformer for Robust Face Alignment and Landmarks Inherent Relation Learning (arxiv.org)</a></p>
<p>code: <a href="https://github.com/Jiahao-UTS/SLPT-master">Jiahao-UTS/SLPT-master (github.com)</a></p>
<span id="more"></span>
<h1><span id="出发点">出发点</span></h1><p>landmark之间的内在联系对于人脸对齐的性能有很大影响,本文重点考虑其内在联系。</p>
<p>之前的方法有heatmap regression,Coordinate regression,有着不同方面的劣势。</p>
<h1><span id="创新点">创新点</span></h1><p>提出了SLPT(<em>sparse local patch transformer</em>)来学习<em>query-query</em>和<em>representation-query</em>关系(自适应内在关系);为了进一步提高SLPT的性能,提出了一种从粗到精的框架,使局部补丁进化为<strong>金字塔形补丁</strong>。</p>
<h1><span id="做法">做法</span></h1><p>本文的SLPT并非同DETR从完整的feature map中预测坐标,而是首先从局部patch中生成每个landmark的表示特征。</p>
<p>然后,使用一系列可学习的queries(称为<em>landmark queries</em>)来聚合表示。</p>
<p>基于Transformer的交叉注意机制,SPLT在每一层学习一个<strong>自适应邻接矩阵</strong>。最后,通过MLP独立预测每个landmark在其对应patch中的subpixel坐标。由于使用了稀疏的局部补丁,与其他ViT相比,输入token的数量显著减少。 </p>
<p>为了进一步提高性能,引入了从粗到精的框架,以与SLPT结合。下图为所提出的从粗到精的框架利用稀疏的局部面片实现鲁棒的人脸对齐。根据前一阶段的landmarks裁剪稀疏的局部补丁,并将其输入到同一SLPT中以预测面部landmarks。此外,patch大小随着阶段的增加而缩小,以使局部特征演变成金字塔形式。</p>
<p><img src="/2022/03/25/review_1_Sparse%20Local%20Patch%20Transformer%20for%20Robust%20Face%20Alignment%20and%20Landmarks/1.png" alt="1"></p>
<p>整体框架图:</p>
<p><img src="/2022/03/25/review_1_Sparse%20Local%20Patch%20Transformer%20for%20Robust%20Face%20Alignment%20and%20Landmarks/2.png" alt="2"></p>
<p>分为三部分:</p>
<p><strong>the patch embedding & structure encoding</strong></p>
<p>不同于ViT,SLPT先根据landmark裁剪patch,再通过线性插值将patch大小调整为K*K,又使用了结构编码(可学习的参数)来补充表示。每种编码都与相邻地标(如左眼和右眼)的编码有很高的相似性。</p>
<p>Muti-head Cross-attention(在Vision Transformer基础上的改进):通过landmark在CNN提取出的feature map上划取局部patch,将这些feature map上的patch排成一个patch embedding,将其视为landmark的表示;紧接着对其进行结构编码(Structure Encodeing),以获取人脸中的相对位置和patch embedding做concat。输入 landmarks queries ,通过这些MLP,独立预测每个landmark的位置。</p>
<p><strong>inherent relation layers</strong></p>
<p>受Transformer启发,每一层由三个块组成,即多头自注意(MSA)块、多头交叉注意(MCA)块和多层感知器(MLP)块,并且在每个块之前应用一个layer norm(LN)。 </p>
<p><strong>prediction heads</strong></p>
<p>预测头由一个用于规范化输入的分层模板和一个用于预测结果的MLP层组成。</p>
<p>最右边的图像显示了不同样本的自适应固有关系。其将每个点连接到第一个内在关系层中交叉注意权重最高的点显示。</p>
]]></content>
<categories>
<category>paper review</category>
</categories>
<tags>
<tag>Patch-based Transformer</tag>
</tags>
</entry>
<entry>
<title>《Pose-guided Feature Disentangling for Occluded Person Re-identification Based on Transformer》</title>
<url>/2022/03/30/review_2_Pose-guided%20Feature%20Disentangling%20for%20Occluded%20Person%20Re-identification%20Based%20on%20Transformer/</url>
<content><![CDATA[<!-- toc -->
<ul>
<li><a href="#%E5%87%BA%E5%8F%91%E7%82%B9">出发点</a></li>
<li><a href="#%E5%88%9B%E6%96%B0%E7%82%B9">创新点</a></li>
<li><a href="#%E5%81%9A%E6%B3%95">做法</a><ul>
<li><a href="#visual-context-transformer-encoder">Visual Context Transformer Encoder</a></li>
<li><a href="#pose-guided-feature-aggregation">Pose-guided Feature Aggregation</a></li>
<li><a href="#part-view-based-transformer-decoder">Part View Based Transformer Decoder</a></li>
</ul>
</li>
</ul>
<!-- tocstop -->
<p>paper: <a href="https://openaccess.thecvf.com/content/CVPR2021/papers/Jing_Cross-Modal_Center_Loss_for_3D_Cross-Modal_Retrieval_CVPR_2021_paper.pdf">https://arxiv.org/pdf/2112.02466v2.pdf</a></p>
<p>code: <a href="https://github.com/WangTaoAs/PFD_Net">WangTaoAs/PFD_Net: This is Official implementation for “Pose-guided Feature Disentangling for Occluded Person Re-Identification Based on Transformer” in AAAI2022 (github.com)</a></p>
<span id="more"></span>
<h1><span id="出发点">出发点</span></h1><p>存在遮挡的行人重识别(<em>Occluded Person Re-identification</em>),由于遮挡的存在,各种噪声被引入,导致特征不匹配;遮挡可能具有与人体部位相似的特征,导致特征学习失败。</p>
<p>前人的方法有:使用姿势信息指导特征空间将全局特征划分为局部特征(缺点是需要严格的特征空间对齐);使用基于图的方法建模拓扑信息(缺点是容易陷入上述的第二种问题)。</p>
<h1><span id="创新点">创新点</span></h1><p>本文探索了在没有空间对齐的情况下,将附加姿势信息与Transformer相结合的可能性。其使用姿势信息对语义成分(如人体的关节部位)进行分解,并对非遮挡的部位进行选择性匹配;设计了一种<em>Pose-guided Push Loss</em>。</p>
<h1><span id="做法">做法</span></h1><p>整体框架图:</p>
<p><img src="/2022/03/30/review_2_Pose-guided%20Feature%20Disentangling%20for%20Occluded%20Person%20Re-identification%20Based%20on%20Transformer/image-20220329103047158.png" alt="image-20220329103047158"></p>
<h2><span id="visual-context-transformer-encoder">Visual Context Transformer Encoder</span></h2><p>首先需要对输入图像划分为固定大小的N块patch,步距大小定义为S,每块patch的尺度定义为P,patch个数N为:</p>
<p><img src="/2022/03/30/review_2_Pose-guided%20Feature%20Disentangling%20for%20Occluded%20Person%20Re-identification%20Based%20on%20Transformer/image-20220329103958451.png" alt="image-20220329103958451"></p>
<p>当S等于P时,划分出来的patch就不重叠;当S<P时,patch重叠,可以减少空间领域信息的丢失。</p>
<p>将这些patch通过线形层生成一个序列输入transformer encoder,concat一组可训练的<em>Position Encoding</em>,以及<em>Camera Information Embedding</em>(表示该图像所属的摄像头视角信息,标签给定的,相同视角图像有一样的值),最终的输入序列定义为:</p>
<p><img src="/2022/03/30/review_2_Pose-guided%20Feature%20Disentangling%20for%20Occluded%20Person%20Re-identification%20Based%20on%20Transformer/image-20220329104849953.png" alt="image-20220329104849953"></p>
<p>最后通过Transformer Encoder输出分为两部分的特征,一部分为global feature,一部分为part feature。为进一步区分人体各个部位的特征,part feature又分为K组,每一组都与global feature做cancat送入shared transformer layer学习这些K组融合特征。</p>
<p><strong>Encoder Supervision Loss</strong></p>
<p>选用交叉熵损失作为identity loss以及triplet loss来作为这部分的loss:</p>
<p><img src="/2022/03/30/review_2_Pose-guided%20Feature%20Disentangling%20for%20Occluded%20Person%20Re-identification%20Based%20on%20Transformer/image-20220329110809342.png" alt="image-20220329110809342"></p>
<h2><span id="pose-guided-feature-aggregation">Pose-guided Feature Aggregation</span></h2><p>被遮挡的人体图像的身体信息较少,而非身体部位的信息可能不明确。本文使用<em>pose estimator</em> 从图像中提取landmark信息。</p>
<p><img src="/2022/03/30/review_2_Pose-guided%20Feature%20Disentangling%20for%20Occluded%20Person%20Re-identification%20Based%20on%20Transformer/image-20220329112105052.png" alt="image-20220329112105052"></p>
<p><strong>Pose Estimation</strong></p>
<p>给定一张图像,估计器从中提取M个landmark,然后利用这些landmark生成一组heatmap <strong>H</strong>,每张heatmap都被下采样到(H/4)*(W/4),其中最大的response point对应一个joint point,设置了一个阈值γ来滤除高置信度和低置信度的landmark。滤除出的剩余landmark的heatmap并不是将其设为0,而是赋值0/1,热图标签可以形式化为:</p>
<p><img src="/2022/03/30/review_2_Pose-guided%20Feature%20Disentangling%20for%20Occluded%20Person%20Re-identification%20Based%20on%20Transformer/image-20220329112535277.png" alt="image-20220329112535277"></p>
<p>ci定义为第i个landmark的置信度分数。</p>
<p><strong>Pose-guided Feature Aggregation</strong></p>
<p>将之前的分组数设为K=M,使其等于landmark的数量。将生成的一组heatmap <strong>H</strong>后接一层FC,使其尺寸与group part local feature(fgp)相同,得到<strong>H‘</strong>。将<strong>H‘</strong>与<strong>fgp</strong> mutiply element-wisely(向量对应元素相乘,将heatmap的注意力附加在fgp上)获得<strong>P</strong>,其目的是为了从fgp中找到对身体某个部位贡献最大的信息部分。</p>
<p>为此,本文开发了一种匹配和分布机制,将part local feature和pose-guided feature视为一组相似性度量问题,最终获取一个pose-guided feature集合<strong>S</strong>。</p>
<p>对于每个<strong>Pi</strong>,在fgp中找到最相似的特征,即<strong>找寻融合了heatmap注意力的序列和原始局部特征的最近距离的局部特征</strong>,以选出优质的局部特征,用余弦距离,形式化定义为:</p>
<p><img src="/2022/03/30/review_2_Pose-guided%20Feature%20Disentangling%20for%20Occluded%20Person%20Re-identification%20Based%20on%20Transformer/image-20220329115119956.png" alt="image-20220329115119956"></p>
<p><img src="/2022/03/30/review_2_Pose-guided%20Feature%20Disentangling%20for%20Occluded%20Person%20Re-identification%20Based%20on%20Transformer/image-20220329115132888.png" alt="image-20220329115132888"></p>
<h2><span id="part-view-based-transformer-decoder">Part View Based Transformer Decoder</span></h2><p>将heatmap和fen做点乘送入Decoder学习一系列learnable semantic views以学习有区别的身体部分。其实整个框架的大体思路为一张图片走两路,一路分patch进transformer encoder,一路特征点检测生成heatmap走transformer decoder,再将这两部分的输出进行match,可以得到view feature,取高置信度的view feature采样成与fgb,fgp相同尺寸算triplet loss,再将所有的view feature采样做<em>Pose Guided Push Loss</em>。</p>
<p><strong>Pose-View Matching Module</strong></p>
<p>此部分计算patch view和通过Pose-guided Feature Aggregation得到的Set之间的相似度,来获得最终的view feature,用余弦距离,形式化定义为:</p>
<p><img src="/2022/03/30/review_2_Pose-guided%20Feature%20Disentangling%20for%20Occluded%20Person%20Re-identification%20Based%20on%20Transformer/image-20220329151559098.png" alt="image-20220329151559098"></p>
<p>之前的heatmap通过阈值打好了0/1标签,最终的view feature即可通过heatmap标签分为两类。在上述距离置信度较高的view feature中取heatmap label为1的;在置信度较低的view feature中取heatmap label为0的。这样的操作会产生可变长度,需要固定长度补0操作。</p>
<p><strong>Decoder Supervision Loss</strong></p>
<p>提出的Pose-guided Push Loss:</p>
<p>余弦距离:</p>
<p><img src="/2022/03/30/review_2_Pose-guided%20Feature%20Disentangling%20for%20Occluded%20Person%20Re-identification%20Based%20on%20Transformer/image-20220329152506162.png" alt="image-20220329152506162"></p>
<p><img src="/2022/03/30/review_2_Pose-guided%20Feature%20Disentangling%20for%20Occluded%20Person%20Re-identification%20Based%20on%20Transformer/image-20220329152517889.png" alt="image-20220329152517889"></p>
<p>整体的loss定义:</p>
<p><img src="/2022/03/30/review_2_Pose-guided%20Feature%20Disentangling%20for%20Occluded%20Person%20Re-identification%20Based%20on%20Transformer/image-20220329153030797.png" alt="image-20220329153030797"></p>
]]></content>
<categories>
<category>paper review</category>
</categories>
<tags>
<tag>ReID</tag>
<tag>Transformer</tag>