# DragNoise
DragNoise 模型,利用扩散模型进行基于点的交互式图像编辑,强大而快速。
## 论文
`Drag Your Noise: Interactive Point-based Editing via Diffusion Semantic Propagation`
- https://arxiv.org/abs/2404.01050
- CVPR 2024
## 模型结构
DragNoise利用扩散模型进行基于点的交互式图像编辑,算法整体思路沿着 DragDiffusion 算法:
DragNoise
## 算法原理
DragNoise 算法整体思路沿着 DragDiffusion 算法,与此不同的是针对扩散模型中的 “middle-block replacement” 的操作进行探索。该操作从某个去噪时间步开始,将不同层的特征复制到所有后续 timestep 的对应层。通过观察 DDIM inversion 重建图像的效果,探索扩散模型在何时以及何处学习到何种层次的语义信息。
通过实验发现,bottleneck 特征是一种最优扩散语义表示,适合于高效编辑。由于它可以在早期 timestep 中有效地被编辑,因此操纵 bottleneck 特征可以平滑地传播到后面的去噪步骤,从而确保结果图像扩散语义的完整性。此外,由于优化 bottleneck 的路径短,有效地避免了梯度消失问题。
## 环境配置
```
mv dragnoise_pytorch dragnoise # 去框架名后缀
# docker 的 -v 路径、docker_name 和 imageID 根据实际情况修改
# pip 安装时如果出现下载慢可以尝试别的镜像源
```
### Docker(方法一)
```
docker pull image.sourcefind.cn:5000/dcu/admin/base/pytorch:2.1.0-ubuntu20.04-dtk24.04.2-py3.10 # 本镜像imageID为:2f1f619d0182
docker run -it -v /path/your_code_data/:/path/your_code_data/ -v /opt/hyhal/:/opt/hyhal/:ro --shm-size=16G --privileged=true --device=/dev/kfd --device=/dev/dri/ --group-add video --network=host --name docker_name imageID bash
cd /your_code_path/dragnoise
pip install -r requirements.txt
```
### Dockerfile(方法二)
```
cd /your_code_path/dragnoise/docker
docker build --no-cache -t codestral:latest .
docker run -it -v /path/your_code_data/:/path/your_code_data/ -v /opt/hyhal/:/opt/hyhal/:ro --shm-size=16G --privileged=true --device=/dev/kfd --device=/dev/dri/ --group-add video --network=host --name docker_name imageID bash
cd /your_code_path/dragnoise
pip install -r requirements.txt
```
### Anaconda(方法三)
关于本项目DCU显卡所需的特殊深度学习库可从[光合](https://developer.sourcefind.cn/tool/)开发者社区下载安装。
```
DTK驱动: dtk24.04.2
python: python3.10
pytorch: 2.1.0
```
`Tips:以上DTK驱动、python、pytorch等DCU相关工具版本需要严格一一对应`
其它非深度学习库参照requirements.txt安装:
```
pip install -r requirements.txt
```
## 数据集
测试数据集 [DragBench](https://github.com/Yujun-Shi/DragDiffusion/releases/download/v0.1.1/DragBench.zip)。\
下载后放在 ./drag_bench_evaluation/drag_bench_data 并解压,文件构成:
DragBench
--- animals
------ JH_2023-09-14-1820-16
------ JH_2023-09-14-1821-23
------ JH_2023-09-14-1821-58
------ ...
--- art_work
--- building_city_view
--- ...
--- other_objects
## 训练
```
# LoRA微调
python run_lora_training.py
# 训练drag扩散模型,并输出结果
python run_drag_diffusion.py
# 如果出现huggingface访问不通,请执行 `export HF_ENDPOINT=https://hf-mirror.com`
```
亦或者webui界面。
## 推理
可视化webui推理:
```
python drag_ui.py --listen
# 如果出现huggingface访问不通,请执行 `export HF_ENDPOINT=https://hf-mirror.com`
```
webui界面
1、上传图片;\
2、输入提示;\
3、LoRA训练;\
4、通过鼠标选择要编辑的区域;\
5、通过鼠标标记点位;\
6、运行。\
ps:Drag以及LoRA的一些参数自行视情况修改。
## result
输入
推理结果
### 精度
测试集 `DragBench`,如上所述下载并解压好。
```
python run_lora_training.py
python run_drag_diffusion.py
python run_eval_similarity.py
python run_eval_point_matching.py
# ps:上述脚本的一些文件路径自行根据情况修改
```
| 加速卡K100_AI | 1-lpips ↑ | clip sim ↑| mean distance ↓ |
| :-----| :----- | :---- | :---- |
| paper | 0.894 | 0.971 | 33.404 |
| 优化后 | 0.885 | 0.967 | 30.206 |
ps:优化两点 1)lora训练部分的rank选择;2)drag部分采用了多层融合。
## 应用场景
### 算法类别
`AIGC`
### 热点应用行业
`零售,制造,电商,医疗,教育`
## 源码仓库及问题反馈
- https://developer.sourcefind.cn/codes/modelzoo/dragnoise_pytorch
## 参考资料
- https://github.com/haofengl/DragNoise