5 Commits
Author SHA1 Message Date
Jeffrey Wu 98f51b1f6b Merge pull request #14 from jberube/patch-1
Fix typos in README.md
2026-04-03 10:14:56 +08:00
Julien Bérubé 3c6be6306a Fix typos in README.md 2025-05-17 11:10:24 -04:00
Jeffrey Wu 7632ae8b70 Merge pull request #13 from ComfyNodePRs/update-publish-yaml
Update Github Action for Publishing to Comfy Registry
2025-04-07 10:19:37 +08:00
Jeffrey Wu 17b165c319 fix: update facefusion assets url 2025-02-12 11:31:05 +08:00
snomiao 7651cd5360 chore(publish): update GitHub Actions workflow for node publishing
- Add permissions for writing issues
- Update action version to v1 for publish-node-action
- Add condition to run job only for 'jeffy5' repository owner
2025-01-20 21:30:02 +00:00
3 changed files with 112 additions and 100 deletions
+5 -1
View File
@@ -7,15 +7,19 @@ on:
paths: paths:
- "pyproject.toml" - "pyproject.toml"
permissions:
issues: write
jobs: jobs:
publish-node: publish-node:
name: Publish Custom Node to registry name: Publish Custom Node to registry
runs-on: ubuntu-latest runs-on: ubuntu-latest
if: ${{ github.repository_owner == 'jeffy5' }}
steps: steps:
- name: Check out code - name: Check out code
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Publish Custom Node - name: Publish Custom Node
uses: Comfy-Org/publish-node-action@main uses: Comfy-Org/publish-node-action@v1
with: with:
## Add your own personal access token to your Github Repository secrets and reference it here. ## Add your own personal access token to your Github Repository secrets and reference it here.
personal_access_token: ${{ secrets.REGISTRY_ACCESS_TOKEN }} personal_access_token: ${{ secrets.REGISTRY_ACCESS_TOKEN }}
+2 -2
View File
@@ -37,7 +37,7 @@ All models is same as facefusion which can be found in [facefusion assets](https
Now it will use the following models by default. In the future, dynamic model selection will be supported. Please download the model based on the directory structure. Now it will use the following models by default. In the future, dynamic model selection will be supported. Please download the model based on the directory structure.
Put all into directory `CmofyUI/models/faceless`. Put all into directory `ComfyUI/models/faceless`.
``` ```
|-- face_detector |-- face_detector
@@ -55,7 +55,7 @@ Put all into directory `CmofyUI/models/faceless`.
`-- rmbg.pth `-- rmbg.pth
``` ```
You can download models by running `download_models.py` script under directory `CmofyUI/custom_nodes/comfyui-faceless-node`. You can download models by running `download_models.py` script under directory `ComfyUI/custom_nodes/comfyui-faceless-node`.
```bash ```bash
# Install default required models # Install default required models
+104 -96
View File
@@ -4,132 +4,140 @@ from urllib.request import urlretrieve
parser = argparse.ArgumentParser(description="Download faceless models") parser = argparse.ArgumentParser(description="Download faceless models")
parser.add_argument('--all', action='store_true', help='Download all models, or just download required models', default=False) parser.add_argument(
"--all",
action="store_true",
help="Download all models, or just download required models",
default=False,
)
args = parser.parse_args() args = parser.parse_args()
base_path = os.path.dirname(os.path.realpath(__file__)) base_path = os.path.dirname(os.path.realpath(__file__))
models_dir = os.path.normpath(os.path.join(base_path, "../../models/faceless")) models_dir = os.path.normpath(os.path.join(base_path, "../../models/faceless"))
facefusion_assets_url = (
"https://github.com/facefusion/facefusion-assets/releases/download/models-3.0.0"
)
# Define the directory structure # Define the directory structure
model_sets = { model_sets = {
'face_detector': [ "face_detector": [
{ {
'name': 'yoloface_8n.onnx', "name": "yoloface_8n.onnx",
'url': 'https://github.com/facefusion/facefusion-assets/releases/download/models/yoloface_8n.onnx', "url": facefusion_assets_url + "/yoloface_8n.onnx",
'required': True "required": True,
} }
], ],
'face_landmarker': [ "face_landmarker": [
{ {
'name': '2dfan4.onnx', "name": "2dfan4.onnx",
'url': 'https://github.com/facefusion/facefusion-assets/releases/download/models/2dfan4.onnx', "url": facefusion_assets_url + "/2dfan4.onnx",
'required': True "required": True,
}, },
{ {
'name': 'face_landmarker_68_5.onnx', "name": "face_landmarker_68_5.onnx",
'url': 'https://github.com/facefusion/facefusion-assets/releases/download/models/face_landmarker_68_5.onnx', "url": facefusion_assets_url + "/face_landmarker_68_5.onnx",
'required': True "required": True,
},
],
"face_recognizer": [
{
"name": "arcface_w600k_r50.onnx",
"url": facefusion_assets_url + "/arcface_w600k_r50.onnx",
"required": True,
} }
], ],
'face_recognizer': [ "face_swapper": [
{ {
'name': 'arcface_w600k_r50.onnx', "name": "inswapper_128.onnx",
'url': 'https://github.com/facefusion/facefusion-assets/releases/download/models/arcface_w600k_r50.onnx', "url": facefusion_assets_url + "/inswapper_128.onnx",
'required': True "required": True,
} },
{
"name": "inswapper_128_fp16.onnx",
"url": facefusion_assets_url + "/inswapper_128_fp16.onnx",
"required": False,
},
{
"name": "simswap_256.onnx",
"url": facefusion_assets_url + "/simswap_256.onnx",
"required": False,
},
{
"name": "simswap_512_unofficial.onnx",
"url": facefusion_assets_url + "/simswap_512_unofficial.onnx",
"required": False,
},
{
"name": "blendswap_256.onnx",
"url": facefusion_assets_url + "/blendswap_256.onnx",
"required": False,
},
{
"name": "uniface_256.onnx",
"url": facefusion_assets_url + "/uniface_256.onnx",
"required": False,
},
], ],
'face_swapper': [ "face_restoration": [
{ {
'name': 'inswapper_128.onnx', "name": "gfpgan_1.2.onnx",
'url': 'https://github.com/facefusion/facefusion-assets/releases/download/models/inswapper_128.onnx', "url": facefusion_assets_url + "/gfpgan_1.2.onnx",
'required': True "required": False,
}, },
{ {
'name': 'inswapper_128_fp16.onnx', "name": "gfpgan_1.3.onnx",
'url': 'https://github.com/facefusion/facefusion-assets/releases/download/models/inswapper_128_fp16.onnx', "url": facefusion_assets_url + "/gfpgan_1.3.onnx",
'required': False "required": False,
}, },
{ {
'name': 'simswap_256.onnx', "name": "gfpgan_1.4.onnx",
'url': 'https://github.com/facefusion/facefusion-assets/releases/download/models/simswap_256.onnx', "url": facefusion_assets_url + "/gfpgan_1.4.onnx",
'required': False "required": True,
}, },
{ {
'name': 'simswap_512_unofficial.onnx', "name": "codeformer.onnx",
'url': 'https://github.com/facefusion/facefusion-assets/releases/download/models/simswap_512_unofficial.onnx', "url": facefusion_assets_url + "/codeformer.onnx",
'required': False "required": False,
}, },
{ {
'name': 'blendswap_256.onnx', "name": "gpen_bfr_256.onnx",
'url': 'https://github.com/facefusion/facefusion-assets/releases/download/models/blendswap_256.onnx', "url": facefusion_assets_url + "/gpen_bfr_256.onnx",
'required': False "required": False,
}, },
{ {
'name': 'uniface_256.onnx', "name": "gpen_bfr_512.onnx",
'url': 'https://github.com/facefusion/facefusion-assets/releases/download/models/uniface_256.onnx', "url": facefusion_assets_url + "/gpen_bfr_512.onnx",
'required': False "required": False,
} },
{
"name": "gpen_bfr_1024.onnx",
"url": facefusion_assets_url + "/gpen_bfr_1024.onnx",
"required": False,
},
{
"name": "gpen_bfr_2048.onnx",
"url": facefusion_assets_url + "/gpen_bfr_2048.onnx",
"required": False,
},
{
"name": "restoreformer_plus_plus.onnx",
"url": facefusion_assets_url + "/restoreformer_plus_plus.onnx",
"required": False,
},
], ],
'face_restoration': [ ".": [
{ {
'name': 'gfpgan_1.2.onnx', "name": "gender_age.onnx",
'url': 'https://github.com/facefusion/facefusion-assets/releases/download/models/gfpgan_1.2.onnx', "url": facefusion_assets_url + "/gender_age.onnx",
'required': False "required": True,
}, },
{ {
'name': 'gfpgan_1.3.onnx', "name": "rmbg.pth",
'url': 'https://github.com/facefusion/facefusion-assets/releases/download/models/gfpgan_1.3.onnx', "url": "https://huggingface.co/briaai/RMBG-1.4/resolve/main/model.pth?download=true",
'required': False "required": True,
}, },
{
'name': 'gfpgan_1.4.onnx',
'url': 'https://github.com/facefusion/facefusion-assets/releases/download/models/gfpgan_1.4.onnx',
'required': True
},
{
'name': 'codeformer.onnx',
'url': 'https://github.com/facefusion/facefusion-assets/releases/download/models/codeformer.onnx',
'required': False
},
{
'name': 'gpen_bfr_256.onnx',
'url': 'https://github.com/facefusion/facefusion-assets/releases/download/models/gpen_bfr_256.onnx',
'required': False
},
{
'name': 'gpen_bfr_512.onnx',
'url': 'https://github.com/facefusion/facefusion-assets/releases/download/models/gpen_bfr_512.onnx',
'required': False
},
{
'name': 'gpen_bfr_1024.onnx',
'url': 'https://github.com/facefusion/facefusion-assets/releases/download/models/gpen_bfr_1024.onnx',
'required': False
},
{
'name': 'gpen_bfr_2048.onnx',
'url': 'https://github.com/facefusion/facefusion-assets/releases/download/models/gpen_bfr_2048.onnx',
'required': False
},
{
'name': 'restoreformer_plus_plus.onnx',
'url': 'https://github.com/facefusion/facefusion-assets/releases/download/models/restoreformer_plus_plus.onnx',
'required': False
}
], ],
'.': [
{
'name': 'gender_age.onnx',
'url': 'https://github.com/facefusion/facefusion-assets/releases/download/models/gender_age.onnx',
'required': True
},
{
'name': 'rmbg.pth',
'url': 'https://huggingface.co/briaai/RMBG-1.4/resolve/main/model.pth?download=true',
'required': True
}
]
} }
# Create the directories they don't exist # Create the directories they don't exist
@@ -141,9 +149,9 @@ for model_type in model_sets:
# Download and save the models # Download and save the models
for model_type, models in model_sets.items(): for model_type, models in model_sets.items():
for model in models: for model in models:
name = model['name'] name = model["name"]
url = model['url'] url = model["url"]
required = model['required'] required = model["required"]
if not args.all and not required: if not args.all and not required:
continue continue
@@ -152,6 +160,6 @@ for model_type, models in model_sets.items():
if os.path.exists(file_path): if os.path.exists(file_path):
continue continue
print(f'Start downloading `{name}`') print(f"Start downloading `{name}`")
urlretrieve(url, file_path) urlretrieve(url, file_path)
print(f'Downloaded `{name}`') print(f"Downloaded `{name}`")