网站开发 自动生成缩略图有口碑的网站建设
网站开发 自动生成缩略图,有口碑的网站建设,深圳沙井做网站公司,百度广告费一般多少钱霜儿-汉服-造相Z-Turbo自动化测试#xff1a;编写Python脚本进行批量生成与质量评估
最近在折腾一个挺有意思的项目#xff0c;就是把那个很火的“霜儿-汉服-造相Z-Turbo”模型部署到服务器上#xff0c;给团队内部用。模型效果确实惊艳#xff0c;生成的古风汉服人像质量…霜儿-汉服-造相Z-Turbo自动化测试编写Python脚本进行批量生成与质量评估最近在折腾一个挺有意思的项目就是把那个很火的“霜儿-汉服-造相Z-Turbo”模型部署到服务器上给团队内部用。模型效果确实惊艳生成的古风汉服人像质量很高。但问题来了我一个人手动测几张图还行真要上线给大伙儿用万一同时来几十个请求服务会不会崩生成的质量会不会忽高忽低这让我意识到光把模型跑起来还不够得有一套自动化测试的“组合拳”在上线前把服务的稳定性和输出质量摸个底。今天我就把自己折腾出来的这套Python自动化测试脚本的思路和方法分享给你。咱们不搞那些虚头巴脑的理论直接上手写代码目标是写一个能模拟真实用户压力、自动评估生成图片好坏、最后还能给你一份清晰测试报告的脚本。1. 测试目标与脚本设计思路在动手写代码之前咱们先得想明白要测什么以及怎么测。对于“霜儿-汉服-造相Z-Turbo”这样的AI图像生成服务测试核心就两块扛不扛得住压力和图片质量稳不稳定。扛压力就是模拟多个用户同时来要图看服务会不会卡死、出错或者响应慢得离谱。质量稳定就是看在不同压力下或者连续生成很多张图出来的汉服人像是不是都那么好看、符合要求有没有出现鬼畜图或者质量严重下滑的情况。基于这个目标我设计的脚本主要干四件事模拟并发请求像真实用户一样一批一批地向服务发送生成请求。自动化下载与归档生成出来的图片脚本得自动下载下来并且按顺序、按批次存好方便后续查看。智能质量评估不能光靠人眼一张张看。脚本需要集成一些算法比如计算图片的清晰度、色彩丰富度或者用预训练模型如CLIP评估生成内容与提示词的匹配度给每张图打个“质量分”。生成测试报告把所有测试数据比如成功失败次数、平均响应时间、每张图的质量分汇总成一个一目了然的报告比如HTML或Markdown格式。整个脚本的流程你可以参考下面这个简单的示意图graph TD A[开始测试] -- B[读取测试配置br提示词、并发数等]; B -- C[启动并发任务池]; C -- D{发送生成请求}; D --|成功| E[下载生成图片]; D --|失败| F[记录错误信息]; E -- G[计算图片质量得分]; F -- H[汇总所有结果]; G -- H; H -- I[生成可视化测试报告]; I -- J[测试结束];接下来我们就一步步把这个流程用代码实现。2. 环境准备与核心工具库工欲善其事必先利其器。咱们这个脚本会用到几个关键的Python库。# 建议在虚拟环境中安装以下依赖 pip install requests pillow opencv-python numpy pandas matplotlib scikit-image # 如果需要更高级的语义质量评估如CLIP可能需要 # pip install torch torchvision transformers简单解释一下它们的作用requests用来发送HTTP请求到我们的图像生成服务。Pillow (PIL)和opencv-python处理图片比如打开、保存、计算一些基础指标。numpy和pandas处理数据和生成报告。matplotlib画图比如把响应时间、质量分的趋势图画出来。scikit-image提供更多图像质量评估算法比如计算结构相似性指数。如果你的服务部署在本地比如用Docker跑的API地址可能是http://localhost:8000/generate。记得先确保服务是正常启动的。3. 编写核心测试脚本我们来把脚本拆成几个功能模块一块块实现。3.1 构造请求与并发测试首先我们得知道怎么跟“霜儿-汉服-造相Z-Turbo”服务对话。假设它的API接收一个JSON数据里面包含生成参数。import requests import json import time from concurrent.futures import ThreadPoolExecutor, as_completed class HanfuAITester: def __init__(self, base_urlhttp://localhost:8000): self.base_url base_url self.generate_endpoint f{base_url}/generate # 假设的生成接口 self.results [] # 存储每次请求的结果 def build_payload(self, prompt, style古典优雅, width512, height768): 构造请求数据。你需要根据实际API文档调整。 payload { prompt: prompt, negative_prompt: 模糊 畸形 手指错误 多肢体, steps: 20, cfg_scale: 7.5, width: width, height: height, style: style, batch_size: 1 } return payload def single_request(self, task_id, prompt, style): 发送单次生成请求并记录耗时和结果。 payload self.build_payload(prompt, style) start_time time.time() try: response requests.post(self.generate_endpoint, jsonpayload, timeout120) elapsed_time time.time() - start_time if response.status_code 200: result_data response.json() # 假设API返回里有一个图片的URL image_url result_data.get(image_url) return { task_id: task_id, success: True, time_elapsed: round(elapsed_time, 2), image_url: image_url, prompt: prompt, style: style } else: return { task_id: task_id, success: False, time_elapsed: round(elapsed_time, 2), error: fHTTP {response.status_code}, prompt: prompt } except requests.exceptions.RequestException as e: return { task_id: task_id, success: False, time_elapsed: round(time.time() - start_time, 2), error: str(e), prompt: prompt } def concurrent_stress_test(self, prompt_list, max_workers5): 并发压力测试。prompt_list是提示词列表max_workers是并发数。 print(f开始并发压力测试并发数{max_workers} 总任务数{len(prompt_list)}) self.results.clear() with ThreadPoolExecutor(max_workersmax_workers) as executor: # 提交所有任务 future_to_task { executor.submit(self.single_request, idx, prompt, f风格{idx%3}): idx for idx, prompt in enumerate(prompt_list) } # 异步获取结果 for future in as_completed(future_to_task): result future.result() self.results.append(result) status 成功 if result[success] else f失败({result.get(error,未知)}) print(f任务 {result[task_id]} 完成 状态{status} 耗时{result[time_elapsed]}秒) # 打印简要统计 success_count sum(1 for r in self.results if r[success]) print(f\n压力测试完成。成功率{success_count}/{len(self.results)}) if success_count 0: avg_time sum(r[time_elapsed] for r in self.results if r[success]) / success_count print(f成功请求平均耗时{avg_time:.2f}秒)这段代码定义了一个测试类核心是concurrent_stress_test方法。它使用ThreadPoolExecutor来模拟多个用户同时发送请求。你可以通过调整max_workers来改变压力大小。3.2 图片下载与质量评估模块服务返回图片URL后我们需要下载它们并进行初步的质量评估。import os from PIL import Image import io import numpy as np from skimage.metrics import structural_similarity as ssim import cv2 class ImageProcessor: def __init__(self, save_dir./generated_images): self.save_dir save_dir os.makedirs(save_dir, exist_okTrue) def download_and_save(self, image_url, save_path): 下载图片并保存到本地。 try: resp requests.get(image_url, timeout30) resp.raise_for_status() image Image.open(io.BytesIO(resp.content)) image.save(save_path) return True, image except Exception as e: print(f下载图片失败 {image_url}: {e}) return False, None def calculate_basic_metrics(self, image_pil): 计算基础图像质量指标。 # 转换为灰度图进行计算 img_gray np.array(image_pil.convert(L)) height, width img_gray.shape # 1. 清晰度评估拉普拉斯方差法值越大通常越清晰 laplacian_var cv2.Laplacian(img_gray, cv2.CV_64F).var() # 2. 对比度评估像素值的标准差 contrast np.std(img_gray) # 3. 亮度评估像素平均值 brightness np.mean(img_gray) return { resolution: f{width}x{height}, sharpness: round(laplacian_var, 2), contrast: round(contrast, 2), brightness: round(brightness, 2) } def assess_quality(self, image_path, prompt): 综合评估单张图片质量。 try: img Image.open(image_path) metrics self.calculate_basic_metrics(img) # 这里可以添加更复杂的评估逻辑例如 # - 使用CLIP计算图文匹配度 (需要加载模型) # - 检查图像是否模糊、有噪点 # - 针对汉服场景检查颜色是否协调、人物比例是否正常这需要更专业的模型 # 简单示例基于清晰度和对比度给出一个综合分0-10 base_score min(10, (metrics[sharpness] / 1000 metrics[contrast] / 50) * 5) metrics[quality_score] round(base_score, 2) return True, metrics except Exception as e: print(f评估图片质量失败 {image_path}: {e}) return False, {}这个ImageProcessor类负责把图片弄到本地并且用一些经典的图像处理算法给图片打个“基础分”。sharpness清晰度和contrast对比度是两个很直观的指标。当然如果你想评估生成的汉服人物是否美观、是否符合提示词可能需要集成像CLIP这样能理解语义的模型那会复杂一些但原理是相通的。3.3 生成可视化测试报告数据都有了最后一步是生成一份人能看懂的报告。import pandas as pd import matplotlib.pyplot as plt class ReportGenerator: staticmethod def generate_report(test_results, image_metrics, output_filetest_report.html): 生成HTML格式的测试报告。 # 1. 准备数据 df_results pd.DataFrame(test_results) df_metrics pd.DataFrame(image_metrics) # 2. 生成统计图表 fig, axes plt.subplots(2, 2, figsize(12, 10)) # 图表1成功/失败分布 success_stats df_results[success].value_counts() axes[0, 0].pie(success_stats.values, labels[成功, 失败], autopct%1.1f%%, startangle90) axes[0, 0].set_title(请求成功/失败分布) # 图表2响应时间分布 if not df_results[df_results[success]].empty: axes[0, 1].hist(df_results[df_results[success]][time_elapsed], bins10, edgecolorblack) axes[0, 1].set_xlabel(耗时 (秒)) axes[0, 1].set_ylabel(频次) axes[0, 1].set_title(成功请求耗时分布) # 图表3质量分分布 if not df_metrics.empty and quality_score in df_metrics.columns: axes[1, 0].hist(df_metrics[quality_score], bins10, edgecolorblack, colorlightgreen) axes[1, 0].axvline(df_metrics[quality_score].mean(), colorred, linestyle--, labelf平均分: {df_metrics[quality_score].mean():.2f}) axes[1, 0].set_xlabel(质量评分) axes[1, 0].set_ylabel(图片数量) axes[1, 0].set_title(生成图片质量评分分布) axes[1, 0].legend() # 图表4清晰度与对比度散点图 if not df_metrics.empty and sharpness in df_metrics.columns and contrast in df_metrics.columns: scatter axes[1, 1].scatter(df_metrics[sharpness], df_metrics[contrast], cdf_metrics.get(quality_score, 5), cmapviridis) axes[1, 1].set_xlabel(清晰度 (拉普拉斯方差)) axes[1, 1].set_ylabel(对比度 (标准差)) axes[1, 1].set_title(清晰度 vs 对比度) plt.colorbar(scatter, axaxes[1, 1], label质量分) plt.tight_layout() chart_path test_summary_charts.png plt.savefig(chart_path, dpi150) plt.close() # 3. 生成HTML报告 html_content f html headtitle霜儿-汉服-造相Z-Turbo 自动化测试报告/title/head body h1自动化测试报告/h1 p生成时间{pd.Timestamp.now()}/p h21. 测试概览/h2 p总请求数{len(df_results)}/p p成功数{success_stats.get(True, 0)}/p p失败数{success_stats.get(False, 0)}/p p成功率{success_stats.get(True, 0)/len(df_results)*100:.1f}%/p p平均响应时间成功{df_results[df_results[success]][time_elapsed].mean():.2f} 秒/p h22. 质量评估摘要/h2 p已评估图片数{len(df_metrics)}/p p平均质量分{df_metrics[quality_score].mean() if not df_metrics.empty else N/A}/p h23. 详细数据/h2 h3请求日志前10条/h3 {df_results.head(10).to_html()} h3图片质量指标前10条/h3 {df_metrics.head(10).to_html() if not df_metrics.empty else p无数据/p} h24. 可视化图表/h2 img src{chart_path} alt测试结果图表 stylemax-width:100%; h25. 结论与建议/h2 p根据测试结果/p ul li服务在 {max_workers} 并发下表现 strong{稳定 if success_stats.get(True,0)/len(df_results) 0.95 else 有待优化}/strong。/li li平均生成耗时在预期范围内{ if df_results[df_results[success]][time_elapsed].mean() 30 else 但部分请求耗时较长需关注。}/li li图片质量整体评分集中在 {df_metrics[quality_score].mean():.1f} 分左右输出一致性 strong{较好 if df_metrics[quality_score].std() 2 else 波动较大}/strong。/li /ul /body /html with open(output_file, w, encodingutf-8) as f: f.write(html_content) print(f测试报告已生成{output_file}) return output_file这个报告生成器会把所有数据汇总计算成功率、平均耗时画出漂亮的统计图最后生成一个HTML文件。你打开这个HTML就能对这次压力测试和质量评估的结果一目了然。4. 整合与运行完整测试流程现在我们把上面的模块像拼积木一样组合起来形成一个完整的测试流程。def main(): # 0. 配置 api_base_url http://你的服务器地址:端口 # 请替换为实际地址 test_prompts [ 一位身着唐代齐胸襦裙的少女在樱花树下抚琴面容温婉背景有远山和楼阁古风唯美, 一位侠客风格的男子身穿黑色劲装汉服手持长剑立于竹林之中眼神凌厉, 华丽的明代凤冠霞帔婚服新娘妆容精致头戴金饰背景是红色宫殿喜庆大气, 宋代文人雅士穿着素雅直裰在书房中挥毫泼墨窗外有芭蕉叶意境清幽, # ... 可以准备更多样化的提示词比如不同朝代、性别、场景、动作 ] * 5 # 重复几次以增加测试量 concurrent_workers 8 # 模拟的并发用户数 output_image_dir ./stress_test_output # 1. 初始化测试器和处理器 tester HanfuAITester(base_urlapi_base_url) processor ImageProcessor(save_diroutput_image_dir) print(*50) print(开始执行霜儿-汉服-造相Z-Turbo自动化压力与质量测试) print(*50) # 2. 执行并发压力测试 tester.concurrent_stress_test(test_prompts[:20], max_workersconcurrent_workers) # 先测试20个任务 # 3. 下载图片并进行质量评估 image_metrics_list [] for result in tester.results: if result[success] and image_url in result: img_filename ftask_{result[task_id]}_{result[style]}.png img_path os.path.join(output_image_dir, img_filename) download_ok, img_obj processor.download_and_save(result[image_url], img_path) if download_ok: assess_ok, metrics processor.assess_quality(img_path, result[prompt]) if assess_ok: metrics.update({ task_id: result[task_id], file_path: img_path, prompt: result[prompt][:50] ... # 截取部分提示词 }) image_metrics_list.append(metrics) # 4. 生成测试报告 report_path ReportGenerator.generate_report(tester.results, image_metrics_list) print(\n *50) print(f测试完成) print(f- 图片保存至{output_image_dir}) print(f- 测试报告{report_path}) print(*50) if __name__ __main__: main()运行这个脚本它会自动完成从发送请求、下载图片、评估质量到生成报告的全过程。你只需要在开头填好你的服务地址和想要测试的提示词列表。5. 测试结果分析与后续优化建议跑完脚本看着生成的报告和一堆图片我们该怎么分析呢这里有一些经验之谈。首先看压力测试部分。报告里的成功率如果低于95%或者在并发数增加时响应时间急剧上升那说明服务的承载能力可能到瓶颈了。这时候你需要去检查服务器的资源使用情况CPU、内存、GPU看看是不是需要调整部署方式比如用更强大的机器或者做负载均衡。再看质量评估部分。如果质量分波动很大比如有的图9分有的图只有3分那就要注意了。这可能意味着提示词敏感某些提示词组合容易导致模型“翻车”。你可以把低分图对应的提示词拿出来分析是不是描述太模糊或者有矛盾。服务不稳定在高负载下模型推理可能受到影响。可以对比一下低分图是不是集中出现在高并发时段。评估指标局限我们用的清晰度、对比度是基础指标。一张构图精美但色调柔和的汉服图对比度分数可能不高但这不代表图不好。所以这个质量分要结合人眼判断一起看或者引入更高级的评估模型。这个脚本只是一个起点。你可以根据实际需求继续扩展它比如增加异常检测自动识别生成图片中的明显缺陷如人脸扭曲、肢体异常。长期稳定性测试让脚本定时比如每小时跑一轮连续跑几天生成趋势图观察服务是否稳定。集成到CI/CD流程在每次模型更新或服务部署后自动运行作为上线前的一道质量关卡。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。