この記事では自分の作って配布したnsfw-shorier_comfyuiというComfyUIのカスタムノードを紹介します。内容は主にこれを作ったきっかけと重要性と使い方の説明です。
ComfyUIの使い方や、ComfyUIのカスタムノードは何なのか、どうやって作るかについてはここに説明しませんが、参考リンクはこの記事の最後に貼ってあります。
はじめに
私はComfyUIを使い始めてからもう既に1年経ちました。ComfyUIを使う時に普段色んな便利なカスタムノードをインストールする必要がありますね。そしてそのカスタムノードは誰でも簡単に作れると知ったら、自分でも作ってみたいと思うようになってきました。
去年も実は一度カスタムノードを作りました。このノードも興味があれば使っていただけたら嬉しいです。
ただしpaint by exampleは既に古い技術とも言えます。私も実は今全く使っていません。FLUX.1やQwen-Imageに嵌ってからStable Diffusionすら使わなくなりました。
しかし今回作ったNSFWを処理するカスタムノードは、たとえStable DiffusionでもFLUX.1を使う時でも役に立ちます。
画像生成AIを使ったことある人なら知っていると思いますが、NSFWというのはNot Safe for Work (職場では安全ではない) という意味です。
モデルにもよりますが、生成された画像は18禁など不適切なものも含まれる可能性があります。これを適切に処理するのは大事です。
私も今回NSFW対策が必要なので、自分で作るきっかけになりました。
今までの他のNSFW関連のカスタムノード
実はNSFW関連のComfyUIカスタムノードは今までたくさんあります。私も去年の記事で一部紹介して、自分も使っていました。
しかし実はあの時紹介したカスタムノードの他にもまだもっとたくさんあります。ここではとりあえずまとめておきます。
パッケージ名 | ノード名 | NSFWモデル | 機能 | 公開日 |
trumanwong / ComfyUI-NSFW-Detection |
NSFWDetection | Falconsai | ・置き換え | 2024-02-02 |
katalist-ai / comfyUI-nsfw-detection |
NudenetDetector | NudeNet | ・モザイク | 2024-04-24 |
BetaDoggo / ComfyUI YetAnotherSafetyChecker |
YetAnotherSafetyChecker | AdamCodd | ・真っ黒 ・スコア |
2024-07-19 |
iamandeepsandhu / ComfyUI-NSFW-Check |
NSFWScore |
Falconsai |
・スコア | 2024-11-22 |
phuvinh010701 / ComfyUI-Nudenet |
ApplyNudenet | NudeNet | ・局部モザイク ・局部ぼかし ・置き換え |
2025-01-03 |
shabri-arrahim (nino) / ComfyUI-Safety-Checker |
・FalconsAISafetyChecker ・CompVisSafetyChecker |
・Falconsai ・CompVis |
・真っ黒 ・判定 |
2025-01-17 |
tighug / comfyui-rating-checker |
・RatingCheckerNudeNet ・RatingCheckerGantMan ・RatingCheckerMarqo |
・NudeNet ・GantMan ・Marqo |
・スコア ・部分特定 |
2025-04-26 |
chaorenai (xiaodu) / nsfw_No |
nsfw_no |
Falconsai |
・入れ替え | 2025-05-07 |
42lux / ComfyUI-safety-checker |
Safety_Checker | CompVis | ・真っ黒 ・判定 |
現在 非公開 |
ຫ = 以下はNSFW処理も含まれた多目的パッケージ = ຫ | ||||
SOELexicon / ComfyUI-LexTools |
NSFWClassifierNode |
umairrkhn |
・スコア ・判定 |
2023-08-05 |
Acly / ComfyUI Nodes for External Tooling |
ETN_NSFWFilter | CompVis | ・ぼかし | 2023-08-28 |
zhangp365 / ComfyUI-utils-nodes |
DetectorForNSFW | NudeNet | ・局部真っ黒 ・判定 |
2024-03-20 |
機能項目の補足。
- スコア :NSFWらしさを意味する0~1の数字を返す
- 判定 :指定の閾値でNSFWかどうかの
True
/False
値を返す - 真っ黒 :NSFWだったら真っ黒画像にする
- ぼかし :NSFWだったらぼかす
- モザイク:NSFWだったらモザイク化する
- 置き換え:NSFWだったら準備しておいた画像で置き換える
- 局部・・:画像の中のNSFWの部分だけ処理する(NudeNetモデルのみ)
実際にどのモデルも最初はスコアをくれるが、閾値を設定してこれを基準としてNSFWかどうかを判定できます。
そしてNSFWだと判定された画像をどう処理するかも次の話。単に真っ暗にすることもあれば、ぼかしやモザイク処理もあります。更に個別で準備した画像に置き換える処理もあります。
又この中でNudeNetというモデルだけはNSFWが置かれた位置情報もくれるので、このモデルを使って特定の部分だけ処理するという処理もあります。
このようにNSFW対策のためのカスタムノードはいっぱいありますが、どれもある特定のモデルや機能しか持っていません。
だったらもし私は全部のモデルを使って全部の機能が使用可能な総合カスタムノードパッケージを作ってみたらどうかな?……と考えるようになりました。
そうしたらこのパッケージをインストールするだけで全部のNSFW関連の処理ができて便利なはずです。そう考えて実行に移しました。
又上述のパッケージ名はどれも似ていてどっちなのか覚えにくくて紛らわしいので、今回私は独特の名前を考えることにしました。
とはいえ、複雑に考えたわけではありません。「shorier」というのはただ日本語の「処理」に「er」を付けただけです。単純ですが、重複することはないでしょう。
モデル纏め
以上紹介したカスタムノードで使われているモデルをここに纏めておきます。
モデル | 機能 | これを採用したノード制作者 |
CompVis | 色んなNSFW要素のスコア | shabri-arrahim、42lux、Acly |
Falconsai | NSFW/SFW分類 | trumanwong、iamandeepsandhu、shabri-arrahim、chaorenai |
AdamCodd | NSFW/SFW分類 | BetaDoggo |
umairrkhn | NSFW/SFW分類 | SOELexicon |
Marqo | NSFW/SFW分類 | tighug |
GantMan | 5クラス分類 | tighug |
NudeNet | NSFW関連要素のある部分を検出 | katalist-ai、phuvinh010701、tighug、zhangp365 |
Falconsai、AdamCodd、umairrkhn、umairrkhnはどっちも単にNSFWかSFWかを判定するもので基本的に同じです。ただニューラルネットワーク構造や訓練データの違いによって結果が違います。
その中でFalconsaiは一番よく使われているものですが、他のモデルと比べてあまり正確ではないという不評もあります。
GantManモデルはdrawings、hentai、neutral、porn、sexyの5クラス分類ですが、その中でhentai、porn、sexyはNSFWで、drawings、neutralはSFWとなります。
CompVisはStable Diffusion公式で使われているモデルなので、一番信用できるモデルと考えられます。実際に私が試して比較してみた結果これは本当に一番正確だと感じました。だから今回私が作ったカスタムノードではこのモデルを既定のモデルにしました。
NudeNetは他のモデルと違ってNSFW部分の位置情報までわかるので便利です。ただし精度はあまり良くなくて、見逃しや誤認識も多いという印象です。
NudeNetには320pxと640pxの2種類があって、640px版は細かいところまで検索できて、320pxよりもいい結果できますが、モデルファイルのサイズが大きくて、計算時間が長くなります。
以上7種類のモデルは全部私のカスタムノードで使用できるようにしています。ただしNudeNetは320pxと640pxがあるので、全部8種類選択できます。
インストール
GitHubのリポジトリはここにあるので、cloneしてComfyUI/custom_nodes/
フォルダに配置したら使えます。
又comfy.orgにも登録されているので、ここのからもダウンロードできます。
とはいえ、今殆どの人はComfyUI Managerを使っていると思います。shoriとか検索したらすぐ見つかるはずです。ここから簡単にインストールできます。
ノード一覧
使う目的によって使い分けできるように色んなノードを作りました。全部9つあります。
ノード | 機能 | 出力 | 使うモデル |
GetNsfwScore | NSFWらしいスコア | ・0.0 ~ 1.0 |
・CompVis ・Falconsai ・AdamCodd ・umairrkhn ・Marqo ・GantMan ・NudeNet |
IsNsfw | NSFW判定 |
・True/False ・0.0 ~ 1.0 |
|
ReplaceIfNsfw | NSFWなら置き換え |
・画像 ・True/False ・0.0 ~ 1.0 |
|
FilterNsfw | NSFWなら処理する |
・画像 ・True/False ・0.0 ~ 1.0 |
|
FilterNsfwWithText | NSFWなら処理して文字を入れる |
・画像 ・True/False ・0.0 ~ 1.0 |
|
SaveImageSfw | NSFWを処理してから画像を保存する | 無し | |
FindNudenetPart | 全部のNudenetの検出結果 | ・json | NudeNetのみ |
FindNsfwPart | NSFWらしいNudenetの検出結果 | ・json | |
CensorNsfwPart | Nudenetの検出結果を基にNSFW部分だけ処理する |
・画像 ・json |
基本的にどのノードも同じようにモデル選択できます。ただし最後の3つのノードはNudeNetのみです。NudeNetは内容の位置情報も返すから、特別に位置情報を使う処理ノードも作ることにしました。
各ノードの解説
- GetNsfwScore
一番基本のノードで、NSFWコンテンツの可能性を示す0~1のスコアを出力します。
モデルによって判定基準が異なり、出力されるスコアも大きく異なる場合があります。
- IsNsfw
GetNsfwScore
の機能に加え、スコアからthreshold
(閾値)を設定して画像がNSFWかどうかを判定します。閾値が低いほどNSFWと判定されやすくなります。
- ReplaceIfNsfw
NSFWと判定された部分をカスタム画像で置き換えます。resize
をtrue
に設定すると、置換画像のサイズが元画像に合わせて調整されます。
- FilterNsfw
NSFW画像に対して処理を行います。ぼかし、モザイク処理、全面黒・白への置き換えなど、処理モードを選択できます。
- FilterNsfwWithText
FilterNsfw
と同じ機能に加え、テキストの追加をサポートします。この方法はComfyUI-TextOverlayパッケージに基づいています。PC内のフォントやカスタムフォントファイル(例:字魂手刻宋.ttfやmeiryoub.ttc)を使用できます。フォントファイルは本リポジトリのfont
フォルダに配置してください。ComfyUI-TextOverlayパッケージを既にインストールしている場合は、そのfonts
フォルダ内のフォントファイルも使用できます。
- SaveImageSfw
元のSaveImage
ノードと同様に画像を保存しますが、NSFWと判定された場合は黒く変換されます。さらに、画像をjpg
またはwebp
形式で保存するかを選択できます。このノードはcomfyui-saveimage-plusを基に編集されています。
- FindNudenetPart及びFindNsfwPart
nudenetモデルを使用して画像内の特定要素を識別します。FindNudenetPart
はすべての要素を検出し、FindNsfwPart
は通常NSFWと見なされるコンテンツのみ識別します。閾値設定もできます。
このノードはComfyUI-utils-nodesを基に編集されています。
model_resulution
は各バージョンのNudeNetモデルを示します。320と640を選択できます。
nudenetモデルはGetNsfwScore
や他のノードでも使用できますが、その場合出力されるスコアは検出された最高スコアの要素のみを表し、要素の位置情報は提供しません。
- CensorNsfwPart
FindNsfwPart
と同様にNSFW部分を識別し、これらの領域に対して特定の処理を行います。使用できる処理方法はFilterNsfw
と同じですが、識別された特定領域にのみ適用されます。
NSFWちゃん
因みに上の例の処理モード「NSFW-chan」は、今回カスタムノード作成をきっかけに作ったキャラクターです。このカスタムノードのロゴとしても使っています。この画像はこの前の記事で紹介したFLUX.1 depth devを使って生成されたものです。
FilterNsfw
とCensorNsfwPart
の処理モードの一つとして選択できます。
終わりに
今回は色んな使い方ができる多機能のカスタムノードを作ったつもりです。よろしければ沢山の人に使っていただければ嬉しいです。もし気に入ってGitHubで☆をいただけたら更に開発し続けるための励みになります。
参考
カスタムノードの作り方
- ComfyUIのプラグインを作る!
- ComfyUIのカスタムノードを作るには
- 【ComfyUI ノードを作ろう #1】とりあえず動くノードを作る!ノード名の付け方
- [ComfyMaster53] カスタムノードを自作!(前編) 〜ComfyUIの仕組みとカスタムノードの基礎理解〜 #ComfyUI
- [ComfyMaster54] カスタムノードを自作!(後編) 〜ゼロから学ぶオープンソースのノード開発〜
- ComfyUIに自作カスタムノードが登録されるまでの過程の話@Githubでの作業