Skip to content

Commit

Permalink
first commit
Browse files Browse the repository at this point in the history
  • Loading branch information
Dian-Yi committed Oct 26, 2021
1 parent e8e719b commit 9d12526
Show file tree
Hide file tree
Showing 41 changed files with 6,323 additions and 1 deletion.
28 changes: 27 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,28 @@
# faceswap_cxx
FaceSwap, Realtime using cpu, 3D, c++
3D FaceSwap, Using cpu realtime
# realtime face swap using cpu with 3D model

## Introduction
- c++版使用cpu实时换脸,参考git: https://github.com/MarekKowalski/FaceSwap
- 换脸逻辑
- 初始化: 根据上传的src图片初始化人脸3D模型参数
- 检测识别: 摄像头读取每帧图,检测dst的脸和landmark位置
- 人脸关键点滤波: oneEuroFilter算法
- 计算3D模型顶点位置: 使用GaussNewton算法计算相关参数(共20个参数:0-5为缩放,平移,旋转相关, 6-20为shape相关)
- 人脸融合贴回视频帧

## Directory structure
- 外部依赖项: ./dep/
- 3D 画图依赖相关: ./deps, ./Eigen, ./GL, ./GLFW, ./zlib
- 人脸检测,landmarks检测依赖相关:./onnxruntime
- ./lib 依赖lib文件: Debug和Release
- ./dll 依赖dll文件: Debug和Release
- ./include 项目头文件目录
- ./src 项目cpp文件目录
- ./resource 人脸3D模型,网络模型等需要的资源路径

## Note
- 本项目使用vs2019编译能成功, 如果需要更换编译器版本,遇到错误可能需要重新编译./lib中的依赖相关文件
- debug 模式下运行时会出现"__acrt_first_block == header", 由opencv中的convexHull()函数引起。具体原因是opencv使用MD编译, 本项目使用MT编译
- debug模式下, 使用 #include "vld.h" 对本项目进行内存泄漏检测。如果检测结果没有具体定位位置:需要设置Linker 下 Generate Debug Info 选为(/DEBUG:FULL)。\
注意一定要程序运行完退出时,才会在vs Output中显示内存检测信息
Binary file added demo/putin.mp4
Binary file not shown.
Binary file added demo/putin2trump.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added faceswap.VC.db
Binary file not shown.
31 changes: 31 additions & 0 deletions faceswap.sln
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.28307.757
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "faceswap", "faceswap.vcxproj", "{9A48AB52-27BF-405F-B327-6252E9D7F536}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{9A48AB52-27BF-405F-B327-6252E9D7F536}.Debug|x64.ActiveCfg = Debug|x64
{9A48AB52-27BF-405F-B327-6252E9D7F536}.Debug|x64.Build.0 = Debug|x64
{9A48AB52-27BF-405F-B327-6252E9D7F536}.Debug|x86.ActiveCfg = Debug|Win32
{9A48AB52-27BF-405F-B327-6252E9D7F536}.Debug|x86.Build.0 = Debug|Win32
{9A48AB52-27BF-405F-B327-6252E9D7F536}.Release|x64.ActiveCfg = Release|x64
{9A48AB52-27BF-405F-B327-6252E9D7F536}.Release|x64.Build.0 = Release|x64
{9A48AB52-27BF-405F-B327-6252E9D7F536}.Release|x86.ActiveCfg = Release|Win32
{9A48AB52-27BF-405F-B327-6252E9D7F536}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {E6472A33-0C43-480B-B423-4E865D1A2706}
EndGlobalSection
EndGlobal
170 changes: 170 additions & 0 deletions faceswap.vcxproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>15.0</VCProjectVersion>
<ProjectGuid>{9A48AB52-27BF-405F-B327-6252E9D7F536}</ProjectGuid>
<RootNamespace>faceswap</RootNamespace>
<WindowsTargetPlatformVersion>10.0.19041.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v142</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
<UseOfMfc>false</UseOfMfc>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<IncludePath>.\dep\onnxruntime\include;.\include;.\dep\zlib;.\dep\GLFW;.\dep\GL;.\dep\;.\dep\deps\;$(IncludePath)</IncludePath>
<LibraryPath>.\lib\Debug;$(LibraryPath)</LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<IncludePath>.\dep\;.\dep\deps\;.\dep\zlib;.\dep\onnxruntime\include;.\include;.\dep\GL;.\dep\GLFW;$(IncludePath)</IncludePath>
<LibraryPath>.\lib\Release\;$(LibraryPath)</LibraryPath>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<ConformanceMode>true</ConformanceMode>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<WholeProgramOptimization>false</WholeProgramOptimization>
<LanguageStandard>stdcpp14</LanguageStandard>
</ClCompile>
<Link>
<AdditionalDependencies>onnxruntime.lib;opencv_world340d.lib;zlibd.lib;freeglutd.lib;ade.lib;glfw3.lib;%(AdditionalDependencies)</AdditionalDependencies>
<GenerateDebugInformation>DebugFull</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<ConformanceMode>true</ConformanceMode>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<WholeProgramOptimization>true</WholeProgramOptimization>
<LanguageStandard>
</LanguageStandard>
</ClCompile>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>onnxruntime.lib;opencv_world340.lib;zlibstatic.lib;freeglut.lib;ade.lib;glfw3.lib;%(AdditionalDependencies)</AdditionalDependencies>
<LinkTimeCodeGeneration>UseFastLinkTimeCodeGeneration</LinkTimeCodeGeneration>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="include\dllmain.h" />
<ClInclude Include="include\filter.h" />
<ClInclude Include="include\NonLinearLeastSquares.h" />
<ClInclude Include="include\cnpy.h" />
<ClInclude Include="include\FaceDetector.h" />
<ClInclude Include="include\FaceRender.h" />
<ClInclude Include="include\FaceSwap.h" />
<ClInclude Include="include\LandmarksDetector.h" />
<ClInclude Include="include\OrthographicProjectionBlendshapes.h" />
<ClInclude Include="include\PQ.Webcam.h" />
<ClInclude Include="include\util.h" />
<ClInclude Include="include\VideoDecode.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="src\dllmain.cpp" />
<ClCompile Include="src\FaceRender.cpp" />
<ClCompile Include="src\filter.cpp" />
<ClCompile Include="src\glad_gl.c" />
<ClCompile Include="src\NonLinearLeastSquares.cpp" />
<ClCompile Include="src\cnpy.cpp" />
<ClCompile Include="src\FaceDetector.cpp" />
<ClCompile Include="src\LandmarksDetector.cpp" />
<ClCompile Include="src\main.cpp" />
<ClCompile Include="src\OrthographicProjectionBlendshapes.cpp" />
<ClCompile Include="src\util.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
90 changes: 90 additions & 0 deletions faceswap.vcxproj.filters
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="include\cnpy.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\FaceDetector.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\LandmarksDetector.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\FaceRender.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\FaceSwap.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\OrthographicProjectionBlendshapes.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\NonLinearLeastSquares.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\util.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\filter.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\PQ.Webcam.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\dllmain.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="include\VideoDecode.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="src\main.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\cnpy.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\FaceDetector.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\LandmarksDetector.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\OrthographicProjectionBlendshapes.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\NonLinearLeastSquares.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\FaceRender.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\util.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\filter.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\dllmain.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\glad_gl.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>
14 changes: 14 additions & 0 deletions faceswap.vcxproj.user
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
<LocalDebuggerEnvironment>PATH=.\dll\Debug</LocalDebuggerEnvironment>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
<LocalDebuggerAttach>false</LocalDebuggerAttach>
</PropertyGroup>
<PropertyGroup>
<ShowAllFiles>false</ShowAllFiles>
</PropertyGroup>
</Project>
43 changes: 43 additions & 0 deletions include/FaceDetector.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
#pragma once
#include <onnxruntime_c_api.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

#include <vector>

using namespace std;
using namespace cv;

typedef struct {
float box[4];
float prob;
} detection;

class FaceDetector
{
private:
int img_width = 1920;
int img_height = 1080;
int net_w = 320;
int net_h = 240;
int net_c;
float *input_data;
float prob_threshold = 0.85;
size_t boxes_size; // cls shape: [1,boxes_size, 2], boxes shape: [1, boxes_size, 4]
size_t input_size;
vector<int64_t> input_node_dims;
vector<const char*> input_node_names;
vector<const char*> output_node_names;
OrtSession* session;
detection *dets;
const OrtApi* g_ort;

public:
~FaceDetector();
bool CheckStatus(OrtStatus* status);
FaceDetector() {};
bool init(const OrtApi* g_ort_only, OrtEnv* env, const wchar_t *model_path);
vector<vector<float>> predict(float *image);
float* get_input(Mat& image);
};
Loading

0 comments on commit 9d12526

Please sign in to comment.