构建AI智能体:二十二、双剑合璧:Qwen系列双模型在文生文、文生图中的搭配应用

62 阅读19分钟

一、温故知新

回顾前面几篇文章,我们分别对文生图的案例演示和RAG Query改写做了详细介绍,今天我们再趣味性的强化一下两者的应用途径,结合两个模型Qwen-Turbo和Qwen-Image同时使用,将自然语言处理与计算机视觉完美结合,发现两者的奥妙之处。

二、系统介绍

先看看展示界面:

示例关键词:

北极光, 日出

示例生成的文案:

极光在晨曦中缓缓舞动,淡绿色与紫色的光带如丝绸般飘荡在深蓝色的天空。太阳刚刚升起,金色的光芒从地平线洒下,照亮了覆盖着薄霜的雪原。冰湖倒映着绚丽的极光与初升的太阳,整个画面充满神秘与宁静,空气中弥漫着清冷而纯净的气息。

生成的图片:

看系统界面,清楚我们使用Gradio构建的一个演示界面,该界面将展示如何使用Qwen-Turbo生成提示词,然后使用Qwen-Image生成图像。 我们将按照之前的设计,将流程分为两个主要步骤:先生成提示词,然后生成图像。在提示词生成成功之前,直接生成图像将会给出提示先生成提示词。

系统的核心在于三个主要功能模块:关键词管理、提示词生成和图像处理。关键词管理系统提供了结构化的选择方式,用户可以从多个类别中选择感兴趣的关键词,系统会自动将这些关键词组合成有意义的查询。

提示词生成引擎是系统的智能核心,它不仅简单拼接关键词,而是理解用户的创作意图,生成富有创意和细节的图像描述。图像处理模块则负责将文本描述转换为视觉内容,支持多种风格和尺寸的定制。

系统主要包含以下功能:

**1. 关键词选择:**使用选项卡和复选框组让用户选择关键词。

**2. 参数设置:**下拉菜单选择尺寸和风格,文本框输入负面提示词。

**3. 生成提示词:**点击按钮调用Qwen-Turbo生成提示词,并显示在文本框中。

**4. 生成图像:**只有在提示词生成后才可点击,调用Qwen-Image生成图像并显示。

**5. 状态显示:**显示操作的状态信息(成功、错误、进行中)。

**6. 清除和下载功能:**清除所有选择,下载生成的图像。

三、系统流程

实际操作过程简单直观:首先在界面左侧选择相关的关键词,这些关键词按主题分类,方便快速查找和选择。接着设置图像参数,包括尺寸、风格等可选设置。

点击"生成提示词"后,系统调用Qwen-Turbo生成详细的图像描述。获得满意的提示词后,可以点击"生成图像"按钮,系统将调用Qwen-Image创建最终的视觉作品。整个过程通常只需要几分钟,具体时间取决于图像复杂度和服务器负载。

1. 流程图

2. 流程介绍

2.1 应用启动与初始化

  • 用户启动应用,加载Gradio界面
  • 系统初始化API连接和参数设置
  • 生成图像按钮初始状态为禁用

2.2 提示词生成

  • 用户选择关键词和参数
  • 点击生成提示词按钮
  • 系统验证输入有效性
  • 调用Qwen-Turbo API生成详细图像描述
  • 处理API响应,显示生成的提示词或错误信息
  • 成功生成提示词后启用生成图像按钮

2.3 图像生成

  • 点击生成图像按钮
  • 系统验证提示词存在且有效
  • 调用Qwen-Image API生成图像
  • 异步处理API响应
  • 下载生成的图像并显示在界面

四、代码参考与解析

import dashscope
from dashscope import ImageSynthesis
import requests
import tempfile
import os
import time
from PIL import Image
import io
import base64
import json
import gradio as gr

# 设置您的 DashScope API Key
DASHSCOPE_API_KEY =  os.environ.get("DASHSCOPE_API_KEY", "")  # 请替换为您的实际API Key

# 初始化 DashScope
dashscope.api_key = DASHSCOPE_API_KEY

# DashScope Qwen-Image 支持的风格参数
SUPPORTED_STYLES = {
    "自动": "auto",
    "3D卡通": "<3d cartoon>",
    "动漫": "<anime>",
    "油画": "<oil painting>",
    "水彩": "<watercolor>",
    "素描": "<sketch>",
    "中国画": "<chinese painting>",
    "扁平插画": "<flat illustration>",
    "摄影": "<photography>",
    "肖像": "<portrait>"
}

# DashScope Qwen-Image 支持的尺寸参数
SUPPORTED_SIZES = {
    "正方形 (1024x1024)": "1024*1024",
    "横屏 (1280x720)": "1280*720",
    "竖屏 (720x1280)": "720*1280"
}

# 多组关键词选项
KEYWORD_GROUPS = {
    "自然": ["森林", "河流", "山脉", "星空", "湖泊", "海洋", "沙漠", "冰川", "草原", "瀑布", 
              "峡谷", "岛屿", "火山", "洞穴", "森林小径", "珊瑚礁", "热带雨林", "北极光", "温泉", "绿洲"],
    "城市": ["高楼", "街道", "公园", "夜景", "桥梁", "广场", "地铁", "商业区", "住宅区", "地标建筑",
              "咖啡馆", "博物馆", "美术馆", "火车站", "机场", "港口", "书店", "餐厅", "购物中心", "体育场"],
    "人物": ["儿童", "老人", "情侣", "家庭", "学生", "医生", "艺术家", "运动员", "上班族", "旅行者",
              "科学家", "教师", "音乐家", "舞蹈家", "演员", "作家", "摄影师", "厨师", "农民", "消防员", "解放军"],
    "动物": ["猫咪", "小狗", "熊猫", "老虎", "狮子", "大象", "海豚", "鸟类", "蝴蝶", "兔子",
              "猴子", "长颈鹿", "斑马", "企鹅", "考拉", "袋鼠", "熊", "狐狸", "狼", "马"],
    "植物": ["樱花", "玫瑰", "竹子", "松树", "向日葵", "仙人掌", "荷叶", "枫叶", "薰衣草", "郁金香",
              "百合", "牡丹", "菊花", "桂花", "茉莉花", "桃花", "杜鹃花", "梅花", "向日葵", "绿萝"],
    "物品": ["礼帽", "手杖", "书本", "咖啡杯", "吉他", "相机", "钟表", "花瓶", "雨伞", "背包",
              "眼镜", "围巾", "手套", "项链", "耳环", "戒指", "手表", "钱包", "手机", "笔记本电脑"],
    "天气": ["晴天", "雨天", "雪天", "雾天", "日落", "日出", "彩虹", "雷电", "阴天", "微风",
              "大风", "暴雨", "暴雪", "冰雹", "台风", "霜冻", "露水", "雾霾", "多云", "晴朗"],
    "场景": ["咖啡馆", "图书馆", "博物馆", "海滩", "山脉", "森林", "花园", "未来城市", "赛博朋克", "太空站", 
              "海底世界", "古代城堡", "乡村小屋", "豪华别墅", "小木屋", "沙漠帐篷", "雪山营地", "太空飞船", "阅兵式"]
}

def generate_prompt_with_qwen(keywords_dict, style=None):
    """
    使用通义千问Turbo模型根据关键词生成详细的图像描述提示词
    """
    url = "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation"
    
    headers = {
        "Content-Type": "application/json",
        "Authorization": f"Bearer {DASHSCOPE_API_KEY}"
    }
    
    # 构建风格提示
    style_prompt = ""
    if style and style != "自动":
        style_name = style
        style_prompt = f",风格为{style_name}"
    
    # 从字典中提取所有选中的关键词
    all_keywords = []
    for group, keywords in keywords_dict.items():
        if keywords:
            all_keywords.extend(keywords)
    
    # 如果没有选择任何关键词,返回错误
    if not all_keywords:
        return None, "请至少选择一个关键词"
    
    # 将关键词列表组合成字符串
    keywords_str = ",".join(all_keywords)
    
    # 构建请求体
    payload = {
        "model": "qwen-turbo",
        "input": {
            "messages": [
                {
                    "role": "system",
                    "content": "你是一个专业的图像描述生成助手。你的任务是根据用户提供的关键词,生成一段150字以内的详细、生动、富有想象力的图像描述,用于AI文生图模型。描述应该包含场景、主体、动作、环境、光线、色彩、情绪等细节,使AI能够生成高质量的图像。"
                },
                {
                    "role": "user",
                    "content": f"请根据以下关键词生成一段详细的图像描述{style_prompt},描述应该具体、生动,包含足够的细节,适合用于AI文生图:{keywords_str}。请直接给出描述文本,不要包含任何解释或其他内容。"
                }
            ]
        },
        "parameters": {
            "temperature": 0.8,
            "top_p": 0.8,
            "result_format": "message"
        }
    }
    
    try:
        print(f"发送请求到Qwen-Turbo API: {json.dumps(payload, ensure_ascii=False)}")
        response = requests.post(url, headers=headers, json=payload)
        response_data = response.json()
        
        print(f"Qwen-Turbo API响应: {json.dumps(response_data, ensure_ascii=False, indent=2)}")
        
        if response.status_code == 200 and "output" in response_data:
            # 提取生成的提示词
            generated_prompt = response_data["output"]["choices"][0]["message"]["content"]
            return generated_prompt, None
        else:
            error_msg = f"Qwen-Turbo API调用失败,状态码: {response.status_code}"
            if "message" in response_data:
                error_msg += f", 错误信息: {response_data['message']}"
            return None, error_msg
            
    except Exception as e:
        error_msg = f"调用Qwen-Turbo时发生异常: {str(e)}"
        print(error_msg)
        import traceback
        traceback.print_exc()
        return None, error_msg

def generate_image_direct(prompt, size, style=None, negative_prompt=None):
    """
    直接使用HTTP请求调用DashScope API,避免dashscope库的问题
    """
    if not DASHSCOPE_API_KEY or DASHSCOPE_API_KEY == "":
        return "请先设置您的 DashScope API Key"
    
    url = "https://dashscope.aliyuncs.com/api/v1/services/aigc/text2image/image-synthesis"
    
    headers = {
        "Content-Type": "application/json",
        "Authorization": f"Bearer {DASHSCOPE_API_KEY}",
        "X-DashScope-Async": "enable"  # 启用异步调用
    }
    
    # 构建请求体
    payload = {
        "model": "wanx-v1",
        "input": {
            "prompt": prompt
        },
        "parameters": {
            "size": size,
            "n": 1
        }
    }
    
    # 添加风格参数(如果提供且不是"自动")
    if style and style != "自动":
        # 将中文风格名称转换为API支持的格式
        style_code = SUPPORTED_STYLES.get(style, "auto")
        payload["parameters"]["style"] = style_code
        
    # 添加负面提示(如果提供)
    if negative_prompt and negative_prompt.strip():
        payload["parameters"]["negative_prompt"] = negative_prompt
    
    try:
        print(f"发送请求到DashScope API: {json.dumps(payload, ensure_ascii=False)}")
        response = requests.post(url, headers=headers, json=payload)
        response_data = response.json()
        
        print(f"API响应: {json.dumps(response_data, ensure_ascii=False, indent=2)}")
        
        if response.status_code == 200:
            # 检查是否为异步任务
            if "output" in response_data and "task_status" in response_data["output"]:
                task_id = response_data["output"]["task_id"]
                print(f"异步任务已创建,任务ID: {task_id}")
                
                # 轮询任务状态
                return poll_task_result(task_id)
            elif "output" in response_data and "results" in response_data["output"]:
                # 同步响应,直接获取结果
                if len(response_data["output"]["results"]) > 0:
                    image_url = response_data["output"]["results"][0]["url"]
                    return download_and_save_image(image_url)
                else:
                    return "API响应中未包含有效结果"
            else:
                return "API响应格式不正确"
        else:
            error_msg = f"API调用失败,状态码: {response.status_code}"
            if "message" in response_data:
                error_msg += f", 错误信息: {response_data['message']}"
            return error_msg
            
    except Exception as e:
        error_msg = f"发生异常: {str(e)}"
        print(error_msg)
        import traceback
        traceback.print_exc()
        return error_msg

def poll_task_result(task_id, max_attempts=30, delay=2):
    """
    轮询异步任务结果
    """
    if not DASHSCOPE_API_KEY or DASHSCOPE_API_KEY == "":
        return "请先设置您的 DashScope API Key"
    
    url = f"https://dashscope.aliyuncs.com/api/v1/tasks/{task_id}"
    
    headers = {
        "Authorization": f"Bearer {DASHSCOPE_API_KEY}"
    }
    
    attempt = 0
    
    while attempt < max_attempts:
        try:
            print(f"轮询任务状态,尝试 {attempt + 1}/{max_attempts}")
            response = requests.get(url, headers=headers)
            response_data = response.json()
            
            print(f"任务状态响应: {json.dumps(response_data, ensure_ascii=False, indent=2)}")
            
            if response.status_code == 200:
                if "output" not in response_data:
                    return "API响应格式不正确,缺少output字段"
                
                task_status = response_data["output"].get("task_status", "UNKNOWN")
                
                if task_status == "SUCCEEDED":
                    if ("output" in response_data and 
                        "results" in response_data["output"] and 
                        len(response_data["output"]["results"]) > 0):
                        
                        image_url = response_data["output"]["results"][0]["url"]
                        return download_and_save_image(image_url)
                    else:
                        return "任务成功但未包含有效结果"
                elif task_status in ["FAILED", "CANCELED"]:
                    error_msg = f"任务失败,状态: {task_status}"
                    if "message" in response_data["output"]:
                        error_msg += f", 错误信息: {response_data['output']['message']}"
                    return error_msg
                else:
                    # 任务仍在处理中,等待后再次尝试
                    time.sleep(delay)
                    attempt += 1
            else:
                return f"获取任务状态失败,状态码: {response.status_code}"
                
        except Exception as e:
            error_msg = f"轮询任务时发生异常: {str(e)}"
            print(error_msg)
            time.sleep(delay)
            attempt += 1
    
    return "任务处理超时"

def download_and_save_image(image_url):
    """
    下载图像并保存到临时文件
    """
    try:
        img_response = requests.get(image_url)
        if img_response.status_code == 200:
            # 创建临时文件保存图像
            with tempfile.NamedTemporaryFile(delete=False, suffix='.png') as f:
                f.write(img_response.content)
                image_path = f.name
            
            print("图像下载成功!")
            return image_path
        else:
            return f"下载图像失败,状态码: {img_response.status_code}"
    except Exception as e:
        return f"下载图像时发生异常: {str(e)}"

# 创建 Gradio 界面
def create_interface():
    with gr.Blocks(title="Qwen-Image 智能文生图演示", theme=gr.themes.Soft()) as demo:
        gr.Markdown("# 🎨 Qwen-Turbo 关键字生成文本 + Qwen-Image 智能文生图演示")
        gr.Markdown("使用通义千问Turbo模型将关键词转换为详细描述,再用通义万相生成图像  ")
        
        # 创建关键词选项卡
        keyword_components = {}
        
        with gr.Row():
            with gr.Column(scale=1):
                # 关键词选项卡 - 移除了不支持的label参数
                with gr.Tabs():
                    for group_name, keywords in KEYWORD_GROUPS.items():
                        with gr.Tab(group_name):
                            # 为每组关键词创建多选框,并存储在字典中
                            keyword_components[group_name] = gr.CheckboxGroup(
                                choices=keywords,
                                label=f"{group_name}类关键词",
                                interactive=True
                            )
                    
                # 使用gr.Row()将图像尺寸和图像风格合并成一行显示
                with gr.Row():
                    with gr.Column(scale=1):
                        # 使用支持的尺寸选项
                        size = gr.Dropdown(
                            choices=list(SUPPORTED_SIZES.keys()),
                            value="横屏 (1280x720)",
                            label="图像尺寸"
                        )
                    
                    with gr.Column(scale=1):
                        # 使用支持的风格选项
                        style = gr.Dropdown(
                            choices=list(SUPPORTED_STYLES.keys()),
                            value="自动",
                            label="图像风格"
                        )
                
                negative_prompt = gr.Textbox(
                    label="负面提示词 (可选)",
                    placeholder="请输入不希望出现在图像中的内容",
                    lines=1
                )
                
                with gr.Row():
                    generate_prompt_btn = gr.Button("Qwen-Turbo 生成提示词", variant="primary")
                    generate_image_btn = gr.Button("Qwen-Image 生成图像", variant="secondary")
                
                # 生成的提示词显示
                generated_prompt = gr.Textbox(
                    label="生成的详细提示词",
                    placeholder="这里将显示通义千问生成的详细提示词",
                    lines=3,
                    interactive=True
                )
                
            with gr.Column(scale=1):
                # 将已选关键词显示框移到生成的图像上方
                selected_keywords_display = gr.Textbox(
                    label="已选关键词",
                    placeholder="这里将显示所有已选择的关键词",
                    lines=1,
                    interactive=False
                )
                
                output_image = gr.Image(
                    label="生成的图像",
                    interactive=False
                )
                
                status_text = gr.Textbox(
                    label="状态信息",
                    interactive=False,
                    lines=1
                )
                
                with gr.Row():
                    download_btn = gr.Button("下载图像", variant="primary")
                    clear_btn = gr.Button("清除", variant="stop")
        
        # 将使用说明移到主Row外部,实现全屏显示
        with gr.Row():
            with gr.Column():
                gr.Markdown("### 使用说明")
                gr.Markdown("""
                __1.__ 在左侧选项卡中选择您想要图像的关键词,可以从多组不同类型中选择关键词&nbsp;&nbsp;&nbsp;&nbsp; __2.__ 选择图像尺寸和风格
                &nbsp;&nbsp;&nbsp;&nbsp;  __3. 可选:__ 在负面提示词框中输入不希望出现在图像中的内容        
                __4.__ 点击"生成提示词"按钮生成详细描述 &nbsp;&nbsp;&nbsp;&nbsp; __5.__ 点击"生成图像"按钮根据提示词生成图像
                &nbsp;&nbsp;&nbsp;&nbsp; __6.__  注意使用前必须先设置好 __DashScope API Key__。
                """)
                
        # 添加一个函数,用于即时更新已选关键词显示
        def update_selected_keywords_display(*args):
            # args包含所有关键词选择组件的当前值
            all_selected_keywords = []
            
            for selected in args:
                if selected:
                    all_selected_keywords.extend(selected)
            
            # 将已选关键词格式化为字符串显示
            keywords_display = ", ".join(all_selected_keywords)
            return keywords_display
        
        # 处理生成提示词按钮点击事件
        def on_generate_prompt_click(*args):
            # 前 len(KEYWORD_GROUPS) 个参数是每组关键词的选择结果
            selected_keywords_dict = {}
            all_selected_keywords = []
            
            for i, group_name in enumerate(KEYWORD_GROUPS.keys()):
                selected_keywords_dict[group_name] = args[i]
                # 收集所有已选关键词
                if args[i]:
                    all_selected_keywords.extend(args[i])
            
            # 下一个参数是尺寸,再下一个是风格
            style = args[len(KEYWORD_GROUPS) + 1]
            
            if not any(selected_keywords_dict.values()):
                yield None, "", "⚠️ 警告:请至少选择一个关键词!"
                return
                
            if not DASHSCOPE_API_KEY or DASHSCOPE_API_KEY == "您的API_KEY":
                yield None, "", "⚠️ 警告:请先设置您的 DashScope API Key!"
                return
                
            # 更新状态
            status = "正在使用通义千问生成详细提示词..."
            # 将已选关键词格式化为字符串显示
            keywords_display = ", ".join(all_selected_keywords)
            yield None, keywords_display, status
            
            # 使用通义千问生成详细提示词
            prompt, error = generate_prompt_with_qwen(selected_keywords_dict, style)
            if error:
                yield None, keywords_display, f"❌ 生成提示词失败: {error}"
            else:
                yield prompt, keywords_display, "✅ 提示词生成成功!"
        
        # 处理生成图像按钮点击事件
        def on_generate_image_click(prompt, size, style, negative_prompt):
            if not prompt.strip():
                yield None, "⚠️ 异常提醒:请先生成提示词!"
                return
                
            if not DASHSCOPE_API_KEY or DASHSCOPE_API_KEY == "您的API_KEY":
                yield None, "⚠️ 异常提醒:请先设置您的 DashScope API Key!"
                return
                
            # 更新状态
            status = "正在生成图像,这可能需要一些时间..."
            yield None, status
            
            # 将用户友好的尺寸名称转换为API格式
            api_size = SUPPORTED_SIZES.get(size, "1024*1024")
            
            # 调用API生成图像
            result = generate_image_direct(prompt, api_size, style, negative_prompt)
            
            # 检查结果是图像路径还是错误信息
            if isinstance(result, str) and result.endswith('.png') and os.path.exists(result):
                yield result, "✅ 图像生成成功!"
            else:
                yield None, f"❌ 生成图像失败: {result}"
        
        # 处理清除按钮点击事件
        def on_clear_click():
            # 清除关键词选择
            clear_keywords = [[] for _ in range(len(KEYWORD_GROUPS))]
            # 清除其他组件
            return clear_keywords + [None, "", "已清除图像和提示词"]
        
        # 准备输入参数列表:所有关键词组件 + [尺寸, 风格]
        generate_prompt_inputs = list(keyword_components.values()) + [size, style]
        generate_prompt_btn.click(
            fn=on_generate_prompt_click,
            inputs=generate_prompt_inputs,
            outputs=[generated_prompt, selected_keywords_display, status_text]
        )
        
        generate_image_btn.click(
            fn=on_generate_image_click,
            inputs=[generated_prompt, size, style, negative_prompt],
            outputs=[output_image, status_text],
            api_name="generate_image",
            show_progress=True
        )
        
        # 处理下载按钮点击事件
        def on_download_click(image):
            if image is None:
                return "没有可下载的图像"
            
            # 获取当前时间作为文件名
            timestamp = int(time.time())
            filename = f"qwen_image_{timestamp}.png"
            
            try:
                # 如果图像是文件路径
                if isinstance(image, str) and os.path.exists(image):
                    import shutil
                    shutil.copy2(image, filename)
                    return f"图像已保存为 {filename}"
                else:
                    return "无法保存图像:无效的图像路径"
            except Exception as e:
                return f"保存图像时发生错误: {str(e)}"
        
        download_btn.click(
            fn=on_download_click,
            inputs=output_image,
            outputs=status_text
        )
        
        # 准备清除按钮的输出参数
        clear_outputs = list(keyword_components.values()) + [output_image, generated_prompt, selected_keywords_display, status_text]
        clear_btn.click(
            fn=on_clear_click,
            inputs=None,
            outputs=clear_outputs
        )
        
        # 为每个关键词选择组件添加事件监听,实现即时更新已选关键词显示
        for component in keyword_components.values():
            component.change(
                fn=update_selected_keywords_display,
                inputs=list(keyword_components.values()),
                outputs=selected_keywords_display
            )
    
    return demo

# 启动 Gradio 应用
if __name__ == "__main__":
    # 检查API密钥是否已设置
    if not DASHSCOPE_API_KEY or DASHSCOPE_API_KEY == "您的API_KEY":
        print("警告: 请先设置您的 DashScope API Key")
        print("您可以在代码中设置 DASHSCOPE_API_KEY 变量")
    
    # 创建并启动 Gradio 界面
    demo = create_interface()
    demo.launch(
        server_name="0.0.0.0",  # 允许外部访问
        server_port=7861,       # 设置端口
        share=False,            # 不创建公开链接
        debug=True              # 启用调试模式
    )

结构分析:

1. 导入和初始化

import dashscope
from dashscope import ImageSynthesis
import requests
import tempfile
import os
import time
from PIL import Image
import io
import base64
import json
import gradio as gr
# 设置API密钥
DASHSCOPE_API_KEY = os.environ.get("DASHSCOPE_API_KEY", "")
dashscope.api_key = DASHSCOPE_API_KEY
  • 导入必要的库,包括DashScope SDK、HTTP请求、文件处理、图像处理和Gradio界面库
  • 从环境变量获取API密钥并进行初始化

2. 参数配置

# 支持的风格和尺寸参数
SUPPORTED_STYLES = {...}
SUPPORTED_SIZES = {...}

# 多组关键词选项
KEYWORD_GROUPS = {
    "自然": ["森林", "河流", ...],
    "城市": ["高楼", "街道", ...],
    # ... 其他类别
}
  • 定义了API支持的图像风格和尺寸选项
  • 创建了分类的关键词库,方便用户选择

3. 核心功能函数

3.1 提示词生成函数

def generate_prompt_with_qwen(keywords_dict, style=None):
  • 使用Qwen-Turbo模型根据用户选择的关键词生成详细的图像描述
  • 构建系统提示词,指导模型生成适合AI绘画的描述
  • 处理API响应并提取生成的提示词
  • 输入:用户选择的关键词和风格参数
    处理:构建API请求,调用Qwen-Turbo模型
    输出:生成的详细图像描述提示词

3.2 图像生成函数

def generate_image_direct(prompt, size, style=None, negative_prompt=None):
  • 直接使用HTTP请求调用DashScope API生成图像
  • 支持异步任务处理和轮询机制
  • 处理风格、尺寸和负面提示词参数
  • 输入:生成的提示词和用户设置的参数
    处理:构建API请求,调用Qwen-Image模型
    输出:图像URL或任务ID(异步任务)

3.3 辅助函数

def poll_task_result(task_id, max_attempts=30, delay=2):
def download_and_save_image(image_url):
  • 实现异步任务状态轮询
  • 下载生成的图像并保存到临时文件

4. Gradio界面构建

def create_interface():
  • 创建多选项卡关键词选择界面
  • 设计图像参数配置区域(尺寸、风格、负面提示词)
  • 设置提示词生成和图像生成按钮
  • 添加状态显示和结果展示区域

5. 事件处理逻辑

def on_generate_prompt_click(*args):
def on_generate_image_click(prompt, size, style, negative_prompt):
def on_clear_click():
def on_download_click(image):
  • 处理用户交互事件
  • 协调提示词生成和图像生成流程
  • 实现状态更新和结果反馈

6. 函数的执行流程

这是一个简化流程图,清晰地展示了Qwen-Turbo和Qwen-Image协同工作的核心流程

五、应用场景与案例赏析

这一技术在实际应用中展现出巨大价值。在创意设计领域,设计师可以快速生成概念图、灵感素材;在内容创作方面,自媒体工作者能够为文章配图、制作吸引人的封面;在教育领域,教师可以创建教学插图、可视化教材。

商业应用案例同样丰富:电商企业可以用其生成产品展示图,营销团队可以创作广告素材,甚至房地产行业也能用于生成房产概念图。这些应用不仅提高了工作效率,更重要的是开启了新的创作可能性。

  • 案例1


**关键词:**森林, 绿洲, 日落, 乡村小屋
**生成的文案:**夕阳西下,金色的余晖洒在宁静的森林中,一片绿洲悄然浮现。绿洲中央矗立着一座古朴的乡村小屋,屋顶覆盖着青苔,木窗透出温暖的灯光。小屋前的小径铺满落叶,微风轻拂,树叶沙沙作响。天空染上橙红与紫罗兰的渐变色彩,映照在绿洲的水面上,波光粼粼,宛如梦境。整个画面充满温馨与安宁,仿佛时间在此静止。
生成的图片:

  • 案例2


**关键词:**山脉, 星空, 摄影师, 晴朗
**生成的文案:**摄影师伫立在巍峨的山脉之巅,夜空如墨,繁星点点,银河横跨天际,璀璨夺目。他专注地调整着相机参数,镜头对准那片神秘的星空,脸上带着沉静而兴奋的神情。四周寂静无声,只有微风轻拂山岩,月光洒落在雪峰之上,银白与深蓝交织,营造出宁静而壮丽的氛围。
生成的图片:

  • 案例3

**关键词:**森林小径, 手机, 古代城堡
**生成的文案:**幽深的森林小径蜿蜒穿过茂密的树影,青苔覆盖的石板上残留着昨夜的露水。一位旅人手持老旧手机,神情专注地查看屏幕,仿佛在寻找某种指引。远处,一座古老的城堡矗立在薄雾中,尖顶刺破灰蓝色的天空,墙壁爬满藤蔓,散发着神秘与沧桑的气息。阳光透过树叶洒下斑驳光影,营造出一种静谧而略带忧郁的氛围。
生成的图片:

  • 案例4

**关键词:**高楼, 暴雪, 赛博朋克
**生成的文案:**高楼在暴雪中闪烁着冷艳的霓虹光芒,赛博朋克风格的灯光在白色雪花中投下斑斓的光影。街道上行人稀少,穿着厚重羽绒服的影子在闪烁的广告屏下匆匆而过。巨大的全息投影在空中浮现,模糊的数字代码在风雪中若隐若现,整个城市仿佛被冻结在未来的梦境之中。
生成的图片:

六、总结

       为了获得最佳效果,我们也应该掌握一些实用技巧:在关键词选择时,尽量选择相关性强、具体的词汇;在提示词生成后,可以适当编辑优化;对于图像生成,可以尝试不同的风格参数组合。
代码性能方面,通过合理的API调用策略和缓存机制,可以优化提高响应速度。同时,还应该了解各种参数对生成结果的影响,以便更好地控制输出质量。
随着AI技术的不断发展,这一领域仍有巨大提升空间。未来的版本可能会支持更复杂的提示词结构、更精细的风格控制、更快的生成速度。同时,应用场景也将进一步扩展,可能涵盖视频生成、3D模型创建等更复杂的视觉内容生产。
Qwen-Turbo与Qwen-Image的组合不仅是一次思维的风暴,也是AI内容创作的实际落地。双模型架构不仅技术先进,更重要的是实用性强,能够真正解决实际创作中的痛点。