deepfacelab中文网

 找回密码
 立即注册(仅限QQ邮箱)
查看: 564|回复: 19

SelfSwapper(SAMAE,ECCV2024)

[复制链接]

44

主题

276

帖子

2273

积分

初级丹圣

Rank: 8Rank: 8

积分
2273
 楼主| 发表于 2026-9-27 19:44:34 | 显示全部楼层 |阅读模式
星级打分
  • 1
  • 2
  • 3
  • 4
  • 5
平均分:NAN  参与人数:0  我的评分:未评
本帖最后由 day270010678 于 2026-9-27 20:42 编辑

SelfSwapper(SAMAE,ECCV2024)有没有人依据这个论文开发过换脸软件?SelfSwapper 用 MAE masking 自监督,DFL 用双 decoder 有监督,SelfSwapper 的 shape agnostic 直接绕开了检测点不准确这个瓶颈。不需要精确 shape---检测器精度不再是瓶颈 ,我打算开发下测试,主要的问题是DFL 的双 decoder 天然适合 per-identity(src decoder 学身份,dst decoder 学姿态)。SelfSwapper 的 MAE masking 是为通用解耦设计的,零样本换脸能力强,但能否像 DFL 那样通过 per-identity 多角度数据训练达到极高保真,这是未验证的核心问题。有人测试过不?高保真方面怎么样?这决定了是否去测试啊。放弃吧,我发现他论文有个严重的问题,就是身份识别的问题。解决不了ArcFace 黑盒,人工无法干预的都是垃圾,就不要用考虑这个论文了。
回复

使用道具 举报

19

主题

190

帖子

1452

积分

初级丹圣

Rank: 8Rank: 8

积分
1452
发表于 2026-9-28 13:54:42 | 显示全部楼层
什么叫做检测器精度不再是瓶颈
B站菜级玩家
回复 支持 反对

使用道具 举报

44

主题

276

帖子

2273

积分

初级丹圣

Rank: 8Rank: 8

积分
2273
 楼主| 发表于 2026-9-29 18:00:43 | 显示全部楼层
caiji132156 发表于 2026-9-28 13:54
什么叫做检测器精度不再是瓶颈

你去看他的论文,他绕开检测器,不需要landmarks,但是引入了身份识别,身份识别你知道的,这是更大的瓶颈就是不能手动修改,dfl至少能手动修正landmarks,身份识别必须依靠现有开源的权重,这就意味着不能人工干预
回复 支持 反对

使用道具 举报

19

主题

190

帖子

1452

积分

初级丹圣

Rank: 8Rank: 8

积分
1452
发表于 2026-9-29 21:07:02 | 显示全部楼层
day270010678 发表于 2026-9-29 18:00
你去看他的论文,他绕开检测器,不需要landmarks,但是引入了身份识别,身份识别你知道的,这是更大的瓶 ...

dfl换脸也不需要lmk啊
你能找到一个对齐算法替代lmk也是照样正常换脸的
而且本身pnp对齐本来就不准
B站菜级玩家
回复 支持 反对

使用道具 举报

19

主题

190

帖子

1452

积分

初级丹圣

Rank: 8Rank: 8

积分
1452
发表于 2026-9-29 21:10:05 | 显示全部楼层
day270010678 发表于 2026-9-29 18:00
你去看他的论文,他绕开检测器,不需要landmarks,但是引入了身份识别,身份识别你知道的,这是更大的瓶 ...

你是想表达这个算法少了对齐步骤吧
B站菜级玩家
回复 支持 反对

使用道具 举报

19

主题

190

帖子

1452

积分

初级丹圣

Rank: 8Rank: 8

积分
1452
发表于 2026-9-29 21:23:54 | 显示全部楼层
本帖最后由 caiji132156 于 2026-9-29 21:27 编辑
day270010678 发表于 2026-9-29 18:00
你去看他的论文,他绕开检测器,不需要landmarks,但是引入了身份识别,身份识别你知道的,这是更大的瓶 ...

那不就是把检测器+特征点标记然后去通过仿射变换的对齐,改成了用3DMM对齐,本质还是要对齐
你自己看它的算法:
hat{I}^{swap} = G(I_{ras}^{swap}, I_p^{tgt}, c_{id}^{src}, c_{skin}^{tgt}) = G(Rd(v^{swap}), I_p^{tgt}, E_{FR}(I^{src}), E_{skin}(I^{tgt}))\)
I_{ras}^{swap} = Rd(v^{swap})
v^swap就是从 3DMM 里面来的
image.png
B站菜级玩家
回复 支持 反对

使用道具 举报

44

主题

276

帖子

2273

积分

初级丹圣

Rank: 8Rank: 8

积分
2273
 楼主| 发表于 2026-9-29 23:06:12 | 显示全部楼层
caiji132156 发表于 2026-9-29 21:23
那不就是把检测器+特征点标记然后去通过仿射变换的对齐,改成了用3DMM对齐,本质还是要对齐
你自己看它的 ...

你打印的都是3dmm的表情,光照,翻转率,相机等相关的,我什么时候说过不用3dmm了,我说的是他引入了身份识别,绕过了检测器的,我说的是他不需要精确对齐,但是基本粗略的5点还是需要的,不需要dfl这种68点,必须精确,论文中说的很明确,通过 perforation confusion 强制模型学习形状无关特征,直接绕开检测器精度瓶颈。不扯淡这个了,不研究了,你要是空闲,可以试验,我觉得没必要,dfl在训练中依靠landmarks68点,这68点我们可以调整精修,但是ArcFace embedding是无法通过人工手动精修的,3DMM 是核心空间条件提供者,3DMM 提供几何条件 + ArcFace 提供身份 + U-Net 生成。兄弟,别折腾这个了,,没多少用,问你个问题,在捏脸中,我用landmarks对于五官的捏,landmark变形只能缩放/平移,无法改眼形/鼻形/唇形,无法绕开sd的大模型的辅助,你有没有好的解决法子
回复 支持 反对

使用道具 举报

44

主题

276

帖子

2273

积分

初级丹圣

Rank: 8Rank: 8

积分
2273
 楼主| 发表于 2026-9-29 23:10:14 | 显示全部楼层
caiji132156 发表于 2026-9-29 21:23
那不就是把检测器+特征点标记然后去通过仿射变换的对齐,改成了用3DMM对齐,本质还是要对齐
你自己看它的 ...
  1. FACE_PARAMS = [
  2.     # ===== 骨骼结构(大范围调整) =====
  3.     ("face_width",        "脸型宽窄",   "narrow face",       "wide face"),
  4.     ("face_height",       "脸的长短",   "long face",        "short face"),
  5.     ("cheekbone_width",   "颧骨宽度",   "narrow cheekbones", "wide cheekbones"),
  6.     ("jaw_width",         "下颌宽度",   "narrow jaw",       "wide jaw"),
  7.     ("chin_shape",        "下巴形状",   "pointed chin",      "round chin"),
  8.     ("face_roundness",    "脸的圆润度", "angular face",     "round face"),
  9.     # ===== 五官细节(小范围调整) =====
  10.     ("eye_size",          "眼睛大小",   "small eyes",        "big eyes"),
  11.     ("eye_distance",      "眼距宽窄",   "close-set eyes",    "wide-set eyes"),
  12.     ("nose_size",         "鼻子大小",   "small nose",        "big nose"),
  13.     ("mouth_size",        "嘴巴大小",   "small mouth",       "big mouth"),
  14.     ("lip_thickness",     "嘴唇厚度",   "thin lips",         "thick lips"),
  15.     ("eyebrow_thickness", "眉毛粗细",   "thin eyebrows",     "thick eyebrows"),
  16. ]

  17. PRESET_STYLES = {
  18.     "精致": {
  19.         "eye_size": 15, "eye_distance": 0, "nose_size": -10,
  20.         "mouth_size": -8, "lip_thickness": -5, "eyebrow_thickness": -5,
  21.     },
  22.     "可爱": {
  23.         "eye_size": 20, "eye_distance": -8, "nose_size": -12,
  24.         "mouth_size": -5, "lip_thickness": 5, "eyebrow_thickness": 0,
  25.     },
  26.     "成熟": {
  27.         "eye_size": -5, "eye_distance": 5, "nose_size": 0,
  28.         "mouth_size": 8, "lip_thickness": 10, "eyebrow_thickness": 5,
  29.     },
  30.     "英气": {
  31.         "eye_size": -5, "eye_distance": -5, "nose_size": 8,
  32.         "mouth_size": 0, "lip_thickness": -8, "eyebrow_thickness": 10,
  33.     },
  34. }


  35. class FaceParamSliders(QGroupBox):
  36.     """五官参数滑块组,发射 params_changed(dict) 信号。"""

  37.     params_changed = pyqtSignal(dict)

  38.     def __init__(self, parent=None):
  39.         super().__init__("五官参数(实时改变已生成图片,0=中性)", parent)
  40.         self._sliders = {}
  41.         self.recommend_callback = None  # 外部传入的推荐计算回调
  42.         self._build_ui()

  43.     def _build_ui(self):
  44.         lay = QVBoxLayout(self)
  45.         lay.setSpacing(12)
  46.         
  47.         # 推荐配置按钮 + 预设风格
  48.         btn_row = QHBoxLayout()
  49.         btn_row.addStretch()
  50.         preset_combo = QComboBox()
  51.         preset_combo.addItem("五官风格 ▾")
  52.         for name in PRESET_STYLES:
  53.             preset_combo.addItem(name)
  54.         preset_combo.setFixedWidth(100)
  55.         preset_combo.currentIndexChanged.connect(self._on_preset_selected)
  56.         btn_row.addWidget(preset_combo)
  57.         recommend_btn = QPushButton("✨ 推荐配置(黄金比例)")
  58.         recommend_btn.setStyleSheet("""
  59.             QPushButton {
  60.                 background-color: #D45500;
  61.                 color: white;
  62.                 padding: 6px 16px;
  63.                 border-radius: 4px;
  64.                 font-weight: bold;
  65.             }
  66.             QPushButton:hover {
  67.                 background-color: #E06010;
  68.             }
  69.         """)
  70.         recommend_btn.clicked.connect(self._apply_recommend)
  71.         btn_row.addWidget(recommend_btn)
  72.         lay.addLayout(btn_row)
  73.         
  74.         for key, label, neg_term, pos_term in FACE_PARAMS:
  75.             row = QHBoxLayout()
  76.             row.setSpacing(12)
  77.             lbl = QLabel(label)
  78.             lbl.setFixedWidth(90)
  79.             row.addWidget(lbl)
  80.             slider = QSlider(Qt.Orientation.Horizontal)
  81.             slider.setRange(-100, 100)
  82.             slider.setValue(0)
  83.             slider.setFixedWidth(160)
  84.             slider.valueChanged.connect(lambda v, k=key: self._on_changed(k, v))
  85.             row.addWidget(slider)
  86.             self._sliders[key] = slider
  87.             val_lbl = QLabel("0")
  88.             val_lbl.setFixedWidth(32)
  89.             val_lbl.setStyleSheet("color: #666; font-size: 11px;")
  90.             slider.valueChanged.connect(lambda v, l=val_lbl: l.setText(str(v)))
  91.             row.addWidget(val_lbl)
  92.             term_lbl = QLabel("—")
  93.             term_lbl.setFixedWidth(140)
  94.             term_lbl.setStyleSheet("color: #0078D4; font-size: 10px; font-family: Consolas, monospace;")
  95.             slider.valueChanged.connect(
  96.                 lambda v, l=term_lbl, n=neg_term, p=pos_term:
  97.                     l.setText(p if v > 30 else (n if v < -30 else "—")))
  98.             row.addWidget(term_lbl)
  99.             lay.addLayout(row)

  100.     def _on_changed(self, key, value):
  101.         self.params_changed.emit(self.get_params())

  102.     def get_params(self) -> dict:
  103.         return {key: s.value() / 100.0 for key, s in self._sliders.items()}

  104.     def _apply_recommend(self):
  105.         """应用黄金比例推荐配置。"""
  106.         # 如果有外部回调,就用回调计算推荐值
  107.         if self.recommend_callback is not None:
  108.             recommend_values = self.recommend_callback()
  109.         else:
  110.             # 默认推荐值(相对于中性状态的偏移)
  111.             recommend_values = {
  112.                 # 骨骼结构(偏上镜审美,小脸)
  113.                 "face_width": -20,
  114.                 "face_height": 10,
  115.                 "cheekbone_width": -25,
  116.                 "jaw_width": -30,
  117.                 "chin_shape": -25,
  118.                 "face_roundness": -20,
  119.                 # 五官细节(精致+大眼)
  120.                 "eye_size": 35,
  121.                 "eye_distance": -5,
  122.                 "nose_size": -30,
  123.                 "mouth_size": -25,
  124.                 "lip_thickness": 10,
  125.                 "eyebrow_thickness": 5,
  126.             }
  127.         
  128.         for key, value in recommend_values.items():
  129.             if key in self._sliders:
  130.                 self._sliders[key].setValue(int(value))

  131.     def _on_preset_selected(self, index):
  132.         if index <= 0:
  133.             return
  134.         names = list(PRESET_STYLES.keys())
  135.         if index - 1 >= len(names):
  136.             return
  137.         preset = PRESET_STYLES[names[index - 1]]
  138.         for key, value in preset.items():
  139.             if key in self._sliders:
  140.                 self._sliders[key].setValue(int(value))
  141.         combo = self.sender()
  142.         if combo:
  143.             combo.setCurrentIndex(0)
  144.    
  145.     def reset(self):
  146.         for s in self._sliders.values():
  147.             s.setValue(0)
复制代码


回复 支持 反对

使用道具 举报

44

主题

276

帖子

2273

积分

初级丹圣

Rank: 8Rank: 8

积分
2273
 楼主| 发表于 2026-9-29 23:12:58 | 显示全部楼层
caiji132156 发表于 2026-9-29 21:23
那不就是把检测器+特征点标记然后去通过仿射变换的对齐,改成了用3DMM对齐,本质还是要对齐
你自己看它的 ...

屏幕截图 2026-09-29 231134.png


按照黄金比例捏的脸别扭的很,我只是调整骨骼,五官还没有调参,折腾了两天了,就是调不好
回复 支持 反对

使用道具 举报

19

主题

190

帖子

1452

积分

初级丹圣

Rank: 8Rank: 8

积分
1452
发表于 2026-9-29 23:19:21 | 显示全部楼层
day270010678 发表于 2026-9-29 23:06
你打印的都是3dmm的表情,光照,翻转率,相机等相关的,我什么时候说过不用3dmm了,我说的是他引入了身份 ...

捏脸是指调五官大小和形态吧,你要传统图形学的还是深度学习的。捏脸的目的是什么
传统图形学就基于lmk液化咯,僵硬
面部编辑的工作有挺多,大部分基于arcface,但是对lmk没有要求
如过要用到lmk,那就是diffusion咯,把脸重绘
不过我不清楚你的场景是什么
B站菜级玩家
回复 支持 反对

使用道具 举报

QQ|Archiver|手机版|deepfacelab中文网 |网站地图

GMT+8, 2026-10-10 07:22 , Processed in 0.096881 second(s), 32 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表