一、免责声明
免责声明:
仅用于记录测试之用,修改后需自行承担相关风险和责任。
项目地址:
请注意:该项目 原作者已经停止更新了!
二、关键文件与修改点
(一)关键文件
主要涉及改动两个文件:
1、core.py
core.py 文件在项目中的路径:
roop\roop\core.py
这个文件(roop/roop/core.py
)中包含了 NSFW 检测的调用,主要体现在对predictor.py中相关检测函数的使用,具体如下:
主要功能
-
图像 NSFW 检测调用
在处理图像时,通过predict_image
函数检测目标图像是否为 NSFW 内容:# 处理图像到图像的流程中 if has_image_extension(roop.globals.target_path): if predict_image(roop.globals.target_path): # 调用NSFW图像检测 destroy() # 若检测到NSFW内容,终止程序 # 后续处理逻辑...
-
视频 NSFW 检测调用
在处理视频时,通过predict_video
函数检测目标视频是否包含 NSFW 内容:# 处理图像到视频的流程中 if predict_video(roop.globals.target_path): # 调用NSFW视频检测 destroy() # 若检测到NSFW内容,终止程序 # 后续处理逻辑...
依赖与实现
这些调用与predictor.py中实现的 NSFW 检测功能相呼应,是 Roop 项目防止处理不当内容的核心措施之一,符合其免责声明中提到的内容审核机制。
2、predictor.py
predictor.py 文件在项目中的路径:
roop\roop\predictor.py
这个文件(roop/roop/predictor.py
)主要用于实现对图像和视频内容的 NSFW(Not Safe For Work,不适宜工作场合)检测功能,是 Roop 项目中用于内容审核的模块。其核心功能和实现细节如下:
主要功能
-
NSFW 检测模型管理
- 通过
get_predictor()
函数初始化并获取 NSFW 检测模型(基于opennsfw2
库构建),使用线程锁确保模型初始化的线程安全。 - 提供
clear_predictor()
函数用于清除已加载的模型。
- 通过
-
多类型内容检测
- 帧检测(
predict_frame
):对视频帧(Frame
类型)进行检测,将帧转换为图像后预处理,通过模型预测其 NSFW 概率,若超过阈值(MAX_PROBABILITY = 0.85
)则返回True
。 - 图像检测(
predict_image
):直接检测指定路径的图像文件,返回是否为 NSFW 内容。 - 视频检测(
predict_video
):对视频文件进行检测,每隔 100 帧采样一次,若存在任一帧超过阈值则返回True
。
- 帧检测(
依赖与实现
- 依赖
opennsfw2
库提供的模型和预处理工具,以及PIL
、numpy
、keras
等用于图像处理和模型运行的库。 - 通过设置阈值(0.85)判断内容是否属于 NSFW,帮助 Roop 项目过滤不当内容,符合其免责声明中提到的 “防止软件用于不当内容(如裸露内容)” 的措施。
(二)修改点
1、core.py
在 Roop 项目中,若出于研究和测试目的需要屏蔽 NSFW 检测功能,可通过修改代码中调用 NSFW 检测的相关逻辑来实现。以下是具体方法:
方法:注释或移除 NSFW 检测调用代码
在 roop/roop/core.py
文件中,NSFW 检测主要通过 predict_image
和 predict_video
函数实现,只需屏蔽这两处调用即可。
-
处理图像时的 NSFW 检测
找到start()
函数中处理图像的部分,注释掉检测图像是否为 NSFW 的代码:# 原始代码 if has_image_extension(roop.globals.target_path): # 注释掉此行以屏蔽图像NSFW检测 # if predict_image(roop.globals.target_path): # destroy() shutil.copy2(roop.globals.target_path, roop.globals.output_path) # 后续处理逻辑...
-
处理视频时的 NSFW 检测
找到start()
函数中处理视频的部分,注释掉检测视频是否包含 NSFW 内容的代码:# 原始代码 # 注释掉此行以屏蔽视频NSFW检测 # if predict_video(roop.globals.target_path): # destroy() update_status('Creating temporary resources...') create_temp(roop.globals.target_path) # 后续处理逻辑...
说明
- 上述修改直接跳过了对目标图像 / 视频的 NSFW 检测,使得程序不会因检测到不当内容而终止。
- 该操作仅适用于合法的研究和测试场景,需遵守项目的免责声明和相关法律法规,不得用于不当内容处理。
- 项目原本的 NSFW 检测是为了防止滥用,修改后需自行承担相关风险和责任。
2、predictor.py
若需屏蔽 NSFW 检测结果(即让检测始终返回 “无不当内容”),可通过修改检测函数的返回值实现,具体修改如下:
方法:强制返回False
在predictor.py中,将所有检测函数的返回值改为False
,使程序始终判定内容为 “安全”:
# 修改 predict_frame 函数
def predict_frame(target_frame: Frame) -> bool:
# 注释原有检测逻辑,强制返回False
# image = Image.fromarray(target_frame)
# image = opennsfw2.preprocess_image(image, opennsfw2.Preprocessing.YAHOO)
# views = numpy.expand_dims(image, axis=0)
# _, probability = get_predictor().predict(views)[0]
# return probability > MAX_PROBABILITY
return False
# 修改 predict_image 函数
def predict_image(target_path: str) -> bool:
# 注释原有检测逻辑,强制返回False
# return opennsfw2.predict_image(target_path) > MAX_PROBABILITY
return False
# 修改 predict_video 函数
def predict_video(target_path: str) -> bool:
# 注释原有检测逻辑,强制返回False
# _, probabilities = opennsfw2.predict_video_frames(video_path=target_path, frame_interval=100)
# return any(probability > MAX_PROBABILITY for probability in probabilities)
return False
说明
- 上述修改直接跳过了实际的 NSFW 概率计算,无论内容是否包含不当信息,均返回
False
(即 “未检测到 NSFW 内容”)。 - 该操作仅适用于合法的研究和测试场景,需严格遵守项目的免责声明及相关法律法规,不得用于处理不当内容。
- 修改后,程序将不再因 NSFW 检测结果终止运行,但需自行承担由此带来的风险和责任。
三、总结
为探索 NSFW 检测的研究需求,本次采取的技术思路是:修改predictor.py
中核心检测函数的返回逻辑,将predict_frame
、predict_image
、predict_video
三个函数的返回值强制设为False
,跳过原有的概率计算与阈值判断流程,使程序始终判定内容为 “安全”。
此修改仅用于技术研究场景,需严格遵守法律法规及项目协议,禁止用于处理不当内容,使用者自行承担相关责任。
仅用于记录测试之用,修改后需自行承担相关风险和责任。