云端部署FaceFusion-AI换脸
<img src="https://fallen.wang/p/facefusion/cover.png" alt="Featured image of post 云端部署FaceFusion-AI换脸" /><p>写在最前面:<strong>有些步骤可能需要魔法</strong></p> <p>号称***“Next generation face swapper and enhancer ”***的Facefusion 上周发布了<code>2.2.1</code> 版本。虽然对显卡要求没有以前的roop 和deepfake 那么夸张,但是GTX1650 跑起来还是比较吃力,所以决定云端部署。</p> <p>这次依然是选择了老朋友恒源云,如果有动手能力也可以尝试白嫖Colab。</p> <p>项目地址:https://github.com/facefusion/facefusion</p> <p>官方文档:https://docs.facefusion.io/</p> <p>这次创建镜像的时候选择的是<code>PyTorch</code> ><code>2.0.0</code> ><code>Cuda11.8.0</code> 刚好符合项目需求。</p> <h1 id="一文件下载">一、文件下载</h1> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1">#安装cli</span> </span></span><span class="line"><span class="cl">curl -L https://download.gpushare.com/download/gpushare-cli-linux -o /usr/local/bin/gpushare-cli </span></span><span class="line"><span class="cl">chmod u+x /usr/local/bin/gpushare-cli </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1">#验证是否安装成功</span> </span></span><span class="line"><span class="cl">gpushare-cli version </span></span></code></pre></td></tr></table> </div> </div><p>这一步是为了后续的文件传输,具体可以参考我之前的博客:https://fallen.wang/p/sovits/</p> <p>然后下载模型文件:<em><strong>此链接由Bilibili用户 @AI百晓生 提供</strong></em></p> <p><a class="link" href="https://pan.baidu.com/s/1U_vsRu9ILHn9FQ_5iph-YQ?pwd=f86f" target="_blank" rel="noopener" >https://pan.baidu.com/s/1U_vsRu9ILHn9FQ_5iph-YQ?pwd=f86f</a></p> <p>*这是为Windows 系统准备的,Linux 只需要下载其中的<code>models.7z</code>即可*</p> <p>将项目clone 到本地:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git clone https://github.com/facefusion/facefusion </span></span></code></pre></td></tr></table> </div> </div><p>如果因为<em><strong>众所周知的原因</strong></em>导致clone 失败,请使用<em><strong>魔法</strong></em>,或者自行搭建<em><strong>异次元通道</strong></em>,当然也可以下载压缩包到本地手动上传:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span><span class="lnt">12 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> /hy-tmp </span></span><span class="line"><span class="cl"><span class="c1">#上传项目压缩包然后解压</span> </span></span><span class="line"><span class="cl">unzip facefusion-master.zip </span></span><span class="line"><span class="cl"><span class="c1">#创建模型目录,注意以.开头的文件夹是隐藏的</span> </span></span><span class="line"><span class="cl"><span class="nb">cd</span> facefusion-master </span></span><span class="line"><span class="cl">mkdir .assets </span></span><span class="line"><span class="cl"><span class="c1">#下载模型文件</span> </span></span><span class="line"><span class="cl">gpushare-cli baidu down models.7z </span></span><span class="line"><span class="cl"><span class="c1">#解压,注意文件约6G需要使用7za命令解压</span> </span></span><span class="line"><span class="cl">7za x /usr/local/bin/models.7z </span></span><span class="line"><span class="cl"><span class="c1">#将解压后的models文件夹移动至/.assets内</span> </span></span><span class="line"><span class="cl">mv /models /hy-tmp/facefusion-master/.assets </span></span></code></pre></td></tr></table> </div> </div><h1 id="二环境部署">二、环境部署</h1> <h2 id="python">Python</h2> <p>该项目使用的是<code>Python3.10</code> ,而恒源云的Ubuntu 自带的是<code>Python3.8</code> ,因此需要升级:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt"> 1 </span><span class="lnt"> 2 </span><span class="lnt"> 3 </span><span class="lnt"> 4 </span><span class="lnt"> 5 </span><span class="lnt"> 6 </span><span class="lnt"> 7 </span><span class="lnt"> 8 </span><span class="lnt"> 9 </span><span class="lnt">10 </span><span class="lnt">11 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1">#更新包列表</span> </span></span><span class="line"><span class="cl">sudo apt update </span></span><span class="line"><span class="cl"><span class="c1">#安装依赖项</span> </span></span><span class="line"><span class="cl">sudo apt install -y software-properties-common </span></span><span class="line"><span class="cl"><span class="c1">#添加Python3.10 的PPA 到源列表中</span> </span></span><span class="line"><span class="cl">sudo add-apt-repository ppa:deadsnakes/ppa </span></span><span class="line"><span class="cl"><span class="c1">#若提示‘Press [ENTER] to continue or Ctrl-c to cancel adding it’则按回车</span> </span></span><span class="line"><span class="cl"><span class="c1">#安装Python3.10</span> </span></span><span class="line"><span class="cl">sudo apt install -y python3.10 </span></span><span class="line"><span class="cl"><span class="c1">#验证</span> </span></span><span class="line"><span class="cl">Python3.10 --version </span></span></code></pre></td></tr></table> </div> </div><h2 id="ffmpeg">FFmpeg</h2> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">apt install ffmpeg </span></span></code></pre></td></tr></table> </div> </div><p>若询问是否继续输入<code>y</code></p> <h2 id="curl">cURL</h2> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">apt install curl </span></span></code></pre></td></tr></table> </div> </div><p>若询问是否继续输入<code>y</code></p> <h2 id="虚拟环境">虚拟环境</h2> <p>接着创建虚拟环境:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> /hy-tmp/facefusion-master </span></span><span class="line"><span class="cl">python3.10 -m venv venv </span></span></code></pre></td></tr></table> </div> </div><p>此时却出现了这样一条报错:</p> <p><font color=#ff3030>Error: Command ‘[’/hy-tmp/venv/bin/python3.10’, ‘-m’, ’ensurepip’, ‘–upgrade’, ‘–default-pip’]’ returned non-zero exit status 1.</font></p> <p>此时已经创建了venv ,报错是因为缺少<code>ensurepip</code> 模块,具体原因尚不清楚。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span><span class="lnt">3 </span><span class="lnt">4 </span><span class="lnt">5 </span><span class="lnt">6 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1">#先把刚刚的venv删掉</span> </span></span><span class="line"><span class="cl">rm -rf venv </span></span><span class="line"><span class="cl"><span class="c1">#重新创建不带pip的venv</span> </span></span><span class="line"><span class="cl">python3.10 -m venv --without-pip venv </span></span><span class="line"><span class="cl"><span class="c1">#激活虚拟环境</span> </span></span><span class="line"><span class="cl"><span class="nb">source</span> venv/bin/activate </span></span></code></pre></td></tr></table> </div> </div><h1 id="三安装项目">三、安装项目</h1> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">python install.py </span></span></code></pre></td></tr></table> </div> </div><p>报错:<font color=#ff3030>ModuleNotFoundError: No module named ‘inquirer’</font> 尝试<code>pip</code> 却依然报错。</p> <p>查阅了官方discord后发现也有人遇到过类似问题,版主给出的解决方法是:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">python -m pip install --upgrade pip </span></span></code></pre></td></tr></table> </div> </div><p>这时却提示缺少<code>pip</code> ,因为刚刚创建虚拟环境的时候留了一个伏笔<code>--without-pip venv</code>。手动装一个:</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span><span class="lnt">2 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py </span></span><span class="line"><span class="cl">python get-pip.py </span></span></code></pre></td></tr></table> </div> </div><p>安装了最新版<code>pip</code> 之后就可以运行 <code>install.py</code>了。</p> <p>因为显卡是N卡,所以按方向键选择<code>cuda</code>,选择两次。<img src="https://fallen.wang/p/facefusion/cuda.png" width="487" height="337" srcset="https://fallen.wang/p/facefusion/cuda_hue6db1a205efefcb37953a136283cd962_10389_480x0_resize_box_3.png 480w, https://fallen.wang/p/facefusion/cuda_hue6db1a205efefcb37953a136283cd962_10389_1024x0_resize_box_3.png 1024w" loading="lazy" alt="cuda" class="gallery-image" data-flex-grow="144" data-flex-basis="346px" > 耐心等待脚本执行完毕。 大致看一眼没有报错便可进入下一步。</p> <div class="highlight"><div class="chroma"> <table class="lntable"><tr><td class="lntd"> <pre tabindex="0" class="chroma"><code><span class="lnt">1 </span></code></pre></td> <td class="lntd"> <pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">python run.py </span></span></code></pre></td></tr></table> </div> </div><p>当出现<code>Running on local URL: http://127.0.0.1:7860</code>时即为成功启动了。此时服务器端访问<code>127.0.0.1:7860</code>即可,但是毕竟服务器端没有图形化界面,所以可以在<code>launch()</code>函数里设置<code>share=True</code>以获得可供外网访问的链接:不过我个人更喜欢配置一个端口转发。</p> <p>以xshell为例,连接至实例时需要提供主机、端口、用户和密码,这些都可以在控制台界面找到。 <img src="https://fallen.wang/p/facefusion/user.png" width="521" height="342" srcset="https://fallen.wang/p/facefusion/user_hu037a3405aabe8ad6fe3c30f8a6b6be05_15660_480x0_resize_box_3.png 480w, https://fallen.wang/p/facefusion/user_hu037a3405aabe8ad6fe3c30f8a6b6be05_15660_1024x0_resize_box_3.png 1024w" loading="lazy" alt="user" class="gallery-image" data-flex-grow="152" data-flex-basis="365px" > 点击<code>登录指令</code>的<code>复制</code>按钮,得到如下信息: <code>ssh -p 41624 root@i-2.gpushare.com</code> 其中<code>41624</code> 为端口,<code>root</code> 为用户,<code>i-2.gpushare.com</code> 为主机,密码则单独列出。 新建会话,填写主机和端口,然后在侧边选项卡里找到<code>SSH</code> > <code>隧道</code>> <code>添加</code>,如图示填写: <img src="https://fallen.wang/p/facefusion/port.png" width="636" height="487" srcset="https://fallen.wang/p/facefusion/port_hu847fe2baf5811a4c09f5e63490096edc_28811_480x0_resize_box_3.png 480w, https://fallen.wang/p/facefusion/port_hu847fe2baf5811a4c09f5e63490096edc_28811_1024x0_resize_box_3.png 1024w" loading="lazy" alt="port" class="gallery-image" data-flex-grow="130" data-flex-basis="313px" > 其中<code>侦听端口</code>可随意填写。 以<code>ROOT</code> 身份登录,输入密码,成功建立会话后在本地浏览器中输入<code>127.0.0.1:8888</code>即可访问web-ui。 <img src="https://fallen.wang/p/facefusion/webui.png" width="1920" height="1080" srcset="https://fallen.wang/p/facefusion/webui_hu4148f1445820120991c9481ae02315cd_195773_480x0_resize_box_3.png 480w, https://fallen.wang/p/facefusion/webui_hu4148f1445820120991c9481ae02315cd_195773_1024x0_resize_box_3.png 1024w" loading="lazy" alt="webui" class="gallery-image" data-flex-grow="177" data-flex-basis="426px" ></p> <p>BTW,该项目引用了开源的NSFW 检测,具体代码位于<code>/facefusion/content_analyser.py</code>,可以尝试调整<code>probability</code>值。</p>