| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 |
- """
- AI换脸换装服务使用示例
- 展示如何使用AISwapService进行换脸换装操作
- """
- import os
- import sys
- import time
- from datetime import datetime
- # 添加项目根目录到Python路径
- sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
- from backend.services.ai_swap_service import AISwapService, process_swap_with_record
- from backend.modules.database.operations import DatabaseOperations
- from backend.utils.logger_config import setup_logger
- logger = setup_logger(__name__)
- def create_test_user():
- """创建测试用户"""
- db_ops = DatabaseOperations()
-
- # 检查用户是否已存在
- existing_user = db_ops.get_user_by_username("test_user")
- if existing_user:
- logger.info(f"测试用户已存在: {existing_user['id']}")
- return existing_user["id"]
-
- # 创建新用户
- user = db_ops.create_user(
- username="test_user",
- password_hash="test_password_hash",
- is_admin=False
- )
-
- logger.info(f"创建测试用户成功: {user['id']}")
- return user["id"]
- def create_test_images(user_id: int):
- """创建测试图片记录"""
- db_ops = DatabaseOperations()
-
- # 检查是否已有测试图片
- existing_images = db_ops.get_user_images(user_id, page_size=10)
- if existing_images["total"] >= 2:
- logger.info("测试图片已存在")
- face_images = [img for img in existing_images["images"] if img["image_type"] == "face"]
- cloth_images = [img for img in existing_images["images"] if img["image_type"] == "cloth"]
-
- if face_images and cloth_images:
- return face_images[0]["id"], cloth_images[0]["id"]
-
- # 创建测试图片记录(这里只是创建记录,实际文件需要手动上传)
- # 在实际项目中,你需要先上传图片文件,然后创建记录
-
- # 模拟图片路径
- test_face_path = "backend/data/face.png"
- test_cloth_path = "backend/data/cloth.png"
-
- if not os.path.exists(test_face_path) or not os.path.exists(test_cloth_path):
- logger.warning("测试图片文件不存在,请先准备测试图片")
- return None, None
-
- # 创建人脸图片记录
- face_record = db_ops.create_image_record(
- user_id=user_id,
- image_type="face",
- original_filename="test_face.png",
- stored_path=test_face_path,
- file_size=os.path.getsize(test_face_path)
- )
-
- # 创建服装图片记录
- cloth_record = db_ops.create_image_record(
- user_id=user_id,
- image_type="cloth",
- original_filename="test_cloth.png",
- stored_path=test_cloth_path,
- file_size=os.path.getsize(test_cloth_path)
- )
-
- logger.info(f"创建测试图片记录成功: 人脸={face_record['id']}, 服装={cloth_record['id']}")
- return face_record["id"], cloth_record["id"]
- def test_ai_swap_service():
- """测试AI换脸换装服务"""
- logger.info("开始测试AI换脸换装服务")
-
- try:
- # 1. 创建测试用户
- user_id = create_test_user()
-
- # 2. 创建测试图片记录
- face_image_id, cloth_image_id = create_test_images(user_id)
-
- if not face_image_id or not cloth_image_id:
- logger.error("无法获取测试图片,测试终止")
- return
-
- # 3. 创建服务实例
- ai_swap_service = AISwapService()
-
- # 4. 执行换脸换装
- logger.info("开始执行换脸换装...")
- start_time = time.time()
-
- result = ai_swap_service.process_swap_with_record(
- user_id=user_id,
- face_image_id=face_image_id,
- cloth_image_id=cloth_image_id,
- prompt="美女站在海边,阳光明媚,穿着时尚的连衣裙"
- )
-
- end_time = time.time()
- processing_time = end_time - start_time
-
- # 5. 输出结果
- if result["success"]:
- logger.info("✅ 换脸换装成功!")
- logger.info(f"处理时间: {processing_time:.2f}秒")
- logger.info(f"处理记录ID: {result['process_record_id']}")
- logger.info(f"结果图片ID: {result['result_image_id']}")
- logger.info(f"生成的文案: {result['copywriter_text']}")
- logger.info(f"历史提示词: {result['history_prompt']}")
-
- # 6. 查询历史记录
- logger.info("\n查询处理历史...")
- history = ai_swap_service.get_user_process_history(user_id, page=1, page_size=5)
- logger.info(f"用户共有 {history['total']} 条处理记录")
-
- # 7. 查询处理详情
- if history["records"]:
- latest_record = history["records"][0]
- detail = ai_swap_service.get_process_detail(latest_record["id"])
- if detail:
- logger.info(f"最新处理详情: 记录ID={detail['process_record']['id']}")
- logger.info(f"人脸图片: {detail['face_image']['original_filename']}")
- logger.info(f"服装图片: {detail['cloth_image']['original_filename']}")
- logger.info(f"结果图片: {detail['result_image']['original_filename']}")
-
- else:
- logger.error("❌ 换脸换装失败!")
- logger.error(f"错误信息: {result['error']}")
- logger.error(f"错误类型: {result['error_type']}")
-
- except Exception as e:
- logger.error(f"测试过程中发生异常: {str(e)}", exc_info=True)
- def test_convenience_function():
- """测试便捷函数"""
- logger.info("开始测试便捷函数")
-
- try:
- # 使用便捷函数
- result = process_swap_with_record(
- user_id=1,
- face_image_id=1,
- cloth_image_id=2,
- prompt="美女在花园里拍照"
- )
-
- if result["success"]:
- logger.info("✅ 便捷函数测试成功!")
- logger.info(f"结果: {result}")
- else:
- logger.error("❌ 便捷函数测试失败!")
- logger.error(f"错误: {result['error']}")
-
- except Exception as e:
- logger.error(f"便捷函数测试异常: {str(e)}", exc_info=True)
- def test_error_handling():
- """测试错误处理"""
- logger.info("开始测试错误处理")
-
- ai_swap_service = AISwapService()
-
- # 测试无效用户ID
- try:
- result = ai_swap_service.process_swap_with_record(
- user_id=99999, # 不存在的用户ID
- face_image_id=1,
- cloth_image_id=2,
- prompt="测试"
- )
- logger.info(f"无效用户ID测试结果: {result}")
- except Exception as e:
- logger.info(f"无效用户ID测试异常: {str(e)}")
-
- # 测试无效图片ID
- try:
- result = ai_swap_service.process_swap_with_record(
- user_id=1,
- face_image_id=99999, # 不存在的图片ID
- cloth_image_id=2,
- prompt="测试"
- )
- logger.info(f"无效图片ID测试结果: {result}")
- except Exception as e:
- logger.info(f"无效图片ID测试异常: {str(e)}")
-
- # 测试空提示词
- try:
- result = ai_swap_service.process_swap_with_record(
- user_id=1,
- face_image_id=1,
- cloth_image_id=2,
- prompt="" # 空提示词
- )
- logger.info(f"空提示词测试结果: {result}")
- except Exception as e:
- logger.info(f"空提示词测试异常: {str(e)}")
- def main():
- """主函数"""
- logger.info("=" * 50)
- logger.info("AI换脸换装服务测试开始")
- logger.info("=" * 50)
-
- # 1. 测试错误处理
- test_error_handling()
-
- # 2. 测试便捷函数
- test_convenience_function()
-
- # 3. 测试完整服务
- test_ai_swap_service()
-
- logger.info("=" * 50)
- logger.info("AI换脸换装服务测试完成")
- logger.info("=" * 50)
- if __name__ == "__main__":
- main()
|