尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

sd-webui-controlnet 全量覆盖率测试(Full Coverage Tests)实战指南:环境变量启用机制、用例体系与本地回归流程

sd-webui-controlnet 全量覆盖率测试(Full Coverage Tests)实战指南:环境变量启用机制、用例体系与本地回归流程 人工智能媒体生成计算机视觉深度学习【免费下载链接】sd-webui-controlnetWebUI extension for ControlNet项目地址https://gitcode.com/gh_mirrors/sd/sd-webui-controlnet点击查看免费下载本篇指南聚焦 sd-webui-controlnet 仓库中位于 tests/web_api/full_coverage/ 的 Full Coverage 测试目录它们是一组只在本机运行、要求全部模型就绪的端到端 Web API 回归测试通过设置CONTROLNET_TEST_FULL_COVERAGE环境变量即可启用。读完本文你将掌握该测试套件的启用方式、模板化测试基础设施APITestTemplate的工作原理以及深度估计、局部重绘Inpaint和 IP-Adapter 三大类全量用例的具体覆盖点并能据此在本机复现整套回归流程。Full Coverage 测试是什么定位与设计动机tests/web_api/full_coverage/README.md 对该目录给出了精炼的定义Full Coverage Tests —— Tests that only run locally with all models available. Set environment variableCONTROLNET_TEST_FULL_COVERAGEto any value to enable these tests.翻译过来即Full Coverage 测试是一组只在本机运行的测试前提是本机已备齐全部模型只要把环境变量CONTROLNET_TEST_FULL_COVERAGE设置为任意值即可启用。它与常规 Web API 测试tests/web_api/ 下的用例的核心差异在于运行环境和资源前提常规 API 测试可在 CI/CPU 环境执行tests/web_api/template.py 中的disable_in_cq装饰器会跳过不适用于 CQ 运行的用例且is_cq_run模式下会自动把steps降为 3、宽高降为 64 以加速Full Coverage 测试则刻意不进入 CI它们需要逐一下载、加载并推理大量 ControlNet 模型含 SD15 与 SDXL 两代模型家族只有本机资源充裕时才有意义。目录本身的结构共 6 个文件清晰地体现了职责划分文件职责README.md套件说明与启用开关template.py模板化测试基础设施图片读取、载荷构造、结果对比depth_test.py深度估计类预处理器与模型的组合矩阵测试inpaint_test.py局部重绘/扩展绘制的多模式、多缩放策略测试ipadapter_test.pyIP-Adapter 系列含 FaceID与多输入组合测试__init__.py包标识空文件启用方式CONTROLNET_TEST_FULL_COVERAGE 环境变量启用机制在 template.py 中实现仅一行判断is_full_coverage os.environ.get(CONTROLNET_TEST_FULL_COVERAGE, None) is not None也就是说只要该环境变量被设置值是什么并不重要空字符串也算is_full_coverage即为True。各测试类的setUp会据此决定是否运行例如class TestInpaintFullCoverage(unittest.TestCase): def setUp(self): if not is_full_coverage: pytest.skip()未设置该变量时所有 Full Coverage 用例都会被pytest.skip()直接跳过这正是 README 所谓启用的准确含义——它并非默认运行的测试。启用后还需配合另一个变量CONTROLNET_TEST_SD_VERSION决定被测的模型家族同样定义于 template.pysd_version StableDiffusionVersion( int(os.environ.get(CONTROLNET_TEST_SD_VERSION, StableDiffusionVersion.SD1x.value)) )StableDiffusionVersion枚举的取值为UNKNOWN 0、SD1x 1、SD2x 2、SDXL 3默认 1即 SD1.x。这与 tests/README.md 中的说明一致1 对应 SD1.x、2 对应 SD2.x、3 对应 SDXL。IP-Adapter 用例会依据该值自动选择 SD15 或 SDXL 的模型清单而深度用例则会主动跳过 SDXL见 depth_test.py 的注释 TODO test SDXL。测试基础设施APITestTemplate 与模板化载荷所有 Full Coverage 用例都复用 template.py 中定义的APITestTemplate类它把构造请求 → 调用 A1111 Web API → 保存/对比输出图封装成一行调用。默认 ControlNet 单元参数用例未覆盖的单元字段全部取自default_unit字典default_unit { control_mode: Balanced, # 控制模式平衡 enabled: True, # 启用该单元 guidance_end: 1, # 引导结束步数比例 guidance_start: 0, # 引导开始步数比例 low_vram: False, # 低显存模式 pixel_perfect: True, # 像素完美自动匹配分辨率 processor_res: 512, # 预处理器分辨率 resize_mode: Crop and Resize, # 缩放模式裁剪并缩放 threshold_a: -1, # 阈值 a-1 表示自动/默认 threshold_b: -1, # 阈值 b-1 表示自动/默认 weight: 1, # 控制强度 }可见这套全量测试默认采用Balanced 控制模式 像素完美开启 Crop and Resize 缩放的经典配置threshold_a/b传-1则交由底层预处理器回退到各自默认值常规 API 测试中-100会被判定为非法值并打印告警见 tests/web_api/generation_test.py。生成请求模板模板同时内置了img2img_payload与txt2img_payload两套完整请求体核心字段包括通用batch_size: 1、cfg_scale: 7、steps: 10、sampler_name: Euler a、seed: 42、正向提示词(masterpiece: 1.3), (highres: 1.3), best quality,img2img 专属denoising_strength: 0.75、resize_mode: 0、mask 相关mask_blur: 4、inpaint_full_res: 0等txt2img 专属高分辨率修复enable_hr: False、hr_upscaler: Latent、hr_scale: 2与tiling: False等。构造时用{**base_payload, **payload_overrides}合并覆盖ControlNet 单元则统一写入alwayson_scripts[ControlNet][args]列表天然支持多单元场景template.py。执行与结果对比exec()的核心流程是向http://localhost:7860/sdapi/v1/{txt2img|img2img}发起 POST 请求取回 JSON 中的imagesbase64 PNG解码后写入目标目录然后与期望图逐像素对比template.py写期望模式当环境变量CONTROLNET_SET_EXP为True默认值时输出图写入expectations/目录作为黄金标准回归验证模式当CONTROLNET_SET_EXP非True时输出图写入results/test_result_{时间戳}/目录并与expectations/中的同名图比对。对比算法expect_same_imagetemplate.py使用 OpenCV 计算像素差要求np.isclose(img1, img2, rtol0.5, atol1)的匹配像素占比不低于 95%才算通过失败时还会把超过阈值 30 的差异像素高亮保存为*_diff.png便于人工排查。此外测试资源图片统一从 tests/web_api/ 的images目录加载1girl.png、mask.png、mask_small.png、portrait/人像集、living_room.webp客厅图等均通过cv2.imread base64 编码为字符串嵌入请求体。深度估计全量用例模块 × 模型组合矩阵depth_test.py 中的TestDepthFullCoverage将 5 个深度预处理器与 3 个深度模型做笛卡尔积遍历general_depth_modules [ depth, depth_leres, depth_leres, depth_anything, depth_anything_v2, ] hand_refiner_module depth_hand_refiner general_depth_models [ control_sd15_depth_anything [48a4bc3a], control_v11f1p_sd15_depth [cfd03158], t2iadapter_depth_sd15v2 [3489cd37], ] hand_refiner_model control_sd15_inpaint_depth_hand_fp16 [09456e54]每个子用例命名为depth_txt2img_{module}_{model}以txt2img方式生成payload 覆盖为steps: 20、width: 768、height: 512输入图固定为living_room_img并附带general_negative_prompt一组高强度负面提示词权重最高达(fused fingers:1.61051)。值得注意的是这里调用exec(result_onlyFalse)即保存并对比全部输出图而非只取第一张。depth_hand_refiner模块及其配套的control_sd15_inpaint_depth_hand_fp16模型也在清单中用于验证手部深度细化链路。局部重绘全量用例双生成类型 × 三种缩放 × 三种模块inpaint_test.py 是覆盖维度最密集的测试文件test_inpaint同时遍历生成类型img2imgmask 放在 A1111 请求体的init_images/mask字段与txt2imgmask 放在 ControlNet 单元的image字段内格式为{image: ..., mask: ...}缩放模式Just Resize不保持比例直接缩放、Crop and Resize、Resize and Fill且针对每种模式给出了对应的输出画布尺寸Crop 对应 512×512内切适配、Resize and Fill 对应 768×768外切填充img2img 模式下同步设置 A1111 侧的resize_mode重绘模块inpaint_only、inpaint、inpaint_onlylama模型统一为control_v11p_sd15_inpaint [ebff9138]。其余用例则分别锁定特定语义值得逐条关注用例验证点test_inpaint_no_mask不提供 mask 时重绘应失败且输出中不应包含 ControlNet 检测图test_inpaint_double_maskA1111 请求体与 ControlNet 单元同时提供 mask 时应优先使用 ControlNet 单元的 mask对应 mask_small 与 mask 尺寸不同的可辨识场景test_img2img_mask_on_unit仅把 mask 放在单元上inpaint_global_harmonious的用法场景test_outpaint_without_mask使用inpaint_onlylama在无 mask条件下向外扩图img2img 与 txt2img 各验证一次画布扩至 768×768test_inpaint_crop结合 A1111 的inpaint_full_res: True对比 ControlNet 单元inpaint_crop_input_image: True/False两种裁剪行为的输出差异这些用例印证了 ControlNet 局部重绘的核心行为约定mask 既可在 A1111 侧传入也可作为单元输入传入后者具备更高优先级并且inpaint_onlylama模块可以脱离 mask 独立完成扩图任务Lama 模型负责填充缺失区域见 scripts/preprocessor/lama_inpaint.py 与 annotator/lama/。IP-Adapter 全量用例SD15/SDXL 模型族与多输入组合ipadapter_test.py 覆盖了 IP-Adapter 的两大模型家族。AdapterSetting命名元组封装了module预处理器与model适配器模型并支持附加 LoRAsd15_normal AdapterSetting(ip-adapter_clip_sd15, ip-adapter_sd15 [6a3f6166]) sd15_light AdapterSetting(ip-adapter_clip_sd15, ip-adapter_sd15_light [be1c9b97]) sd15_plus_face AdapterSetting(ip-adapter_clip_sd15, ip-adapter-plus-face_sd15 [71693645]) sd15_full_face AdapterSetting(ip-adapter_clip_sd15, ip-adapter-full-face_sd15 [852b9843]) sdxl_normal AdapterSetting(ip-adapter_clip_sdxl, ip-adapter_sdxl [d5d53548]) sdxl_vit AdapterSetting(ip-adapter_clip_sdxl_plus_vith, ip-adapter_sdxl_vit-h [75a08f84]) sdxl_plus_vit AdapterSetting(ip-adapter_clip_sdxl_plus_vith, ip-adapter-plus_sdxl_vit-h [f1f19f7d]) sdxl_plus_vit_face AdapterSetting(ip-adapter_clip_sdxl_plus_vith, ip-adapter-plus-face_sdxl_vit-h [c60d7d48])测试类依据sd_version自动选择清单SD1.x 下测 4 个 SD15 变体SDXL 下测 4 个 SDXL 变体。所有用例均以 txt2img 生成 512×512 图、20 步且额外叠加一个 openpose 单元固定姿态以便在不同设置之间进行公平的图对比。正向提示词使用1girl, simple background, (white_background: 1.2), portrait并分别以带general_negative_prompt/ 不带负面提示词两种条件各跑一遍。三个方法分别验证 IP-Adapter 的输入形态test_adapter单张人像输入test_adapter_multi_inputsportrait/目录全部人像作为多个独立单元输入每个单元权重均分为1 / len(portrait_imgs)test_adapter_real_multi_inputs一张图内包含多张参考图的列表image: [{image: img} for img in portrait_imgs]验证真实多输入格式。FaceID 变体TestIPAdapterFaceIdFullCoverage进一步覆盖人脸身份保持系列SD1.x 下包括ip-adapter-faceid_sd15配ip-adapter-faceid_sd15_lora、faceid-plus、faceid-plusv2与faceid-portrait四种设置SDXL 下为ip-adapter-faceid_sdxlLoRA 通过提示词lora:{name}:0.6注入AdapterSetting.lora_prompt属性。其多输入用例同样分为多单元均分权重与列表式多输入两种形态。本地运行流程从启动测试服务到执行全量用例结合 tests/README.md 的说明完整本地流程如下注意当前工作目录必须是 A1111 根目录安装测试依赖pip install -r requirements-test.txt启动测试服务CPU 环境即可需要--api-server-stop支持自动关停python -m coverage run \ --data-file.coverage.server \ launch.py \ --skip-prepare-environment \ --skip-torch-cuda-test \ --test-server \ --do-not-download-clip \ --no-half \ --disable-opt-split-attention \ --use-cpu all \ --api-server-stop启用 Full Coverage 并指定模型家族设置CONTROLNET_TEST_FULL_COVERAGE1任意值均可与CONTROLNET_TEST_SD_VERSION1SD1.x2SD2.x3SDXL首次运行保持CONTROLNET_SET_EXPTrue以生成期望图执行测试python -m pytest -vv --junitxmltest/results.xml \ --cov ./extensions/sd-webui-controlnet \ --cov-reportxml \ --verify-base-url ./extensions/sd-webui-controlnet/tests查看覆盖率文本报告python -m coverage report -iHTML 报告python -m coverage html -i。另外 tests/conftest.py 会预先设置IGNORE_CMD_ARGS_ERRORS1避免 WebUI 误解析 pytest 的命令行参数导致测试启动失败。使用建议与注意事项期望图是团队的回归资产expectations/目录下的 PNG 是后续每次运行对比的基准变更模型版本或预处理器行为时应有意识地重新生成将CONTROLNET_SET_EXP置为True结果目录自带时间戳results/test_result_{YYYYMMDD-HHMMSS}/按运行时刻隔离失败时同时产出_diff.png差异高亮图方便定位是预处理器输出变化还是采样器行为漂移资源开销大是设计使然本套件要求所有模型就绪深度用例约 15 组组合、重绘用例约 18 组组合、IP-Adapter 用例每设置各跑 2 类负面条件在 GPU 环境下运行更为实际若要快速冒烟可回归常规 tests/web_api/ 用例集。总的来说Full Coverage 测试套件以极简的开关设计一个环境变量承载了仓库最核心的三类模型能力的端到端回归验证是评估 sd-webui-controlnet 在全部模型就绪前提下行为是否稳定的重要本地测试手段。赞分享人工智能媒体生成计算机视觉深度学习【免费下载链接】sd-webui-controlnetWebUI extension for ControlNet项目地址https://gitcode.com/gh_mirrors/sd/sd-webui-controlnet点击查看免费下载相关推荐wvp-GB28181-pro GB28181 视频平台Docker 三步部署与生产避坑指南wvp GB28181 pro GB28181 视频平台Docker 三步部署与生产避坑指南 wvp GB28181 pro 是一个开箱即用的 GB28181后端音视频前端axe-core 全量集成测试Full Integration Tests运行机制与实战指南axe core 全量集成测试Full Integration Tests运行机制与实战指南 导读 本文以 axe core 仓库中 test/integ测试Agent Zero 配置全指南settings.json、LLM 角色体系与 A0_SET_ 环境变量覆盖机制Agent Zero 配置全指南settings.json、LLM 角色体系与 A0_SET_ 环境变量覆盖机制 Agent ZeroA0将全部运行配置收人工智能大模型AI AgentAgent 框架自主智能体多智能体工具调用MCP 服务浏览器控制上一篇GoodWeBot 快速上手从下载到跑通的 AI 微信机器人完整安装指南下一篇终极指南如何在Docker与Kubernetes中集成ssl-cert-check实现SSL证书监控创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表