logo

手把手教你Python+文心一言:AI看图写诗网页实战

作者:carzy2025.09.19 13:32浏览量:0

简介:本文将通过Python与文心一言API,手把手搭建一个《AI看图写诗》网页应用,完整代码附上,助你快速实现图像理解与诗歌生成的融合。

一、项目背景与核心价值

在AI技术快速发展的今天,图像理解与自然语言生成已成为两大核心能力。文心一言作为领先的生成式AI模型,具备强大的语义理解和文本生成能力。本项目通过Python搭建一个《AI看图写诗》网页应用,用户上传图片后,AI自动分析图像内容并生成对应诗歌,实现“所见即所诗”的创意体验。

核心价值:

  1. 技术融合:结合计算机视觉(图像分析)与自然语言生成(NLP)
  2. 应用场景:文化创意、教育娱乐、社交媒体内容生成
  3. 学习价值:掌握API调用、Web开发、异步处理等关键技术

二、技术栈与开发环境

1. 技术选型

  • 后端:Python 3.8+ + Flask框架(轻量级Web开发)
  • AI能力:文心一言API(文本生成)
  • 前端:HTML5 + Bootstrap(响应式设计)
  • 图像处理:Pillow库(基础图像操作)

2. 开发环境准备

  1. # 创建虚拟环境(推荐)
  2. python -m venv ai_poem_env
  3. source ai_poem_env/bin/activate # Linux/Mac
  4. # 或 ai_poem_env\Scripts\activate (Windows)
  5. # 安装依赖
  6. pip install flask pillow requests

3. 文心一言API配置

  1. 访问文心一言开放平台获取API Key
  2. 安装官方SDK(可选):
    1. pip install qianwen-sdk

三、项目架构设计

1. 系统流程图

  1. 用户上传图片 后端接收 图像预处理 调用文心一言API生成诗歌 返回结果至前端

2. 关键组件

  • Web接口:Flask处理HTTP请求
  • 图像分析模块:提取颜色、场景等特征(简化版)
  • AI调用模块:构造API请求参数
  • 结果展示:前端页面渲染

四、核心代码实现

1. Flask应用初始化

  1. from flask import Flask, render_template, request, jsonify
  2. import requests
  3. import os
  4. from PIL import Image
  5. import io
  6. app = Flask(__name__)
  7. app.config['UPLOAD_FOLDER'] = 'uploads'
  8. os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
  9. # 文心一言API配置(需替换为你的实际Key)
  10. ERNIE_API_KEY = 'your_api_key_here'
  11. ERNIE_ENDPOINT = 'https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions'

2. 图像处理函数

  1. def preprocess_image(image_file):
  2. """基础图像预处理"""
  3. try:
  4. img = Image.open(image_file)
  5. # 调整大小(可选)
  6. img.thumbnail((800, 800))
  7. # 转换为RGB模式
  8. if img.mode != 'RGB':
  9. img = img.convert('RGB')
  10. return img
  11. except Exception as e:
  12. print(f"图像处理错误: {e}")
  13. return None

3. 文心一言调用封装

  1. def generate_poem(image_description):
  2. """调用文心一言API生成诗歌"""
  3. headers = {
  4. 'Content-Type': 'application/json',
  5. }
  6. data = {
  7. "messages": [
  8. {
  9. "role": "user",
  10. "content": f"根据以下图片描述创作一首中文古诗,要求五言或七言,押韵:{image_description}"
  11. }
  12. ]
  13. }
  14. try:
  15. response = requests.post(
  16. ERNIE_ENDPOINT,
  17. headers=headers,
  18. json=data,
  19. params={'access_token': ERNIE_API_KEY}
  20. )
  21. result = response.json()
  22. return result.get('result', '生成诗歌失败')
  23. except Exception as e:
  24. print(f"API调用错误: {e}")
  25. return "服务暂时不可用"

4. 核心路由实现

  1. @app.route('/', methods=['GET', 'POST'])
  2. def index():
  3. if request.method == 'POST':
  4. # 处理文件上传
  5. if 'image' not in request.files:
  6. return jsonify({'error': '未选择图片'}), 400
  7. file = request.files['image']
  8. if file.filename == '':
  9. return jsonify({'error': '未选择图片'}), 400
  10. # 保存并处理图片
  11. img_path = os.path.join(app.config['UPLOAD_FOLDER'], file.filename)
  12. file.save(img_path)
  13. img = preprocess_image(img_path)
  14. # 简化版图像分析(实际项目可接入CV模型)
  15. description = "一幅包含自然风景的图片,有山有水,色彩鲜明"
  16. # 生成诗歌
  17. poem = generate_poem(description)
  18. return jsonify({
  19. 'poem': poem,
  20. 'original_description': description
  21. })
  22. return render_template('index.html')

五、前端实现要点

1. HTML模板(templates/index.html)

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>AI看图写诗</title>
  5. <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
  6. </head>
  7. <body>
  8. <div class="container mt-5">
  9. <h1 class="text-center">AI看图写诗</h1>
  10. <form id="uploadForm" enctype="multipart/form-data">
  11. <div class="mb-3">
  12. <label for="image" class="form-label">选择图片</label>
  13. <input class="form-control" type="file" id="image" name="image" accept="image/*" required>
  14. </div>
  15. <button type="submit" class="btn btn-primary">生成诗歌</button>
  16. </form>
  17. <div id="result" class="mt-5" style="display:none;">
  18. <h3>AI生成的诗歌:</h3>
  19. <pre id="poemText" class="bg-light p-3 rounded"></pre>
  20. <p><small>基于图像分析:<span id="imgDesc"></span></small></p>
  21. </div>
  22. </div>
  23. <script>
  24. document.getElementById('uploadForm').addEventListener('submit', async (e) => {
  25. e.preventDefault();
  26. const formData = new FormData();
  27. formData.append('image', document.getElementById('image').files[0]);
  28. try {
  29. const response = await fetch('/', {
  30. method: 'POST',
  31. body: formData
  32. });
  33. const data = await response.json();
  34. if (data.error) {
  35. alert(data.error);
  36. return;
  37. }
  38. document.getElementById('poemText').textContent = data.poem;
  39. document.getElementById('imgDesc').textContent = data.original_description;
  40. document.getElementById('result').style.display = 'block';
  41. } catch (error) {
  42. console.error('Error:', error);
  43. alert('生成失败,请重试');
  44. }
  45. });
  46. </script>
  47. </body>
  48. </html>

六、部署与优化建议

1. 本地测试运行

  1. flask run --host=0.0.0.0 --port=5000

2. 生产环境优化

  1. API调用优化

    • 实现请求重试机制
    • 添加缓存层(如Redis存储常用结果
  2. 图像分析增强

    • 接入预训练CV模型(如ResNet)提取高级特征
    • 使用CLIP模型实现图文匹配
  3. 性能优化

    • 异步处理(Celery)
    • 图片压缩上传

3. 安全考虑

  1. 文件上传限制(类型、大小)
  2. API Key保护(环境变量存储)
  3. 输入内容过滤(防XSS)

七、完整项目源码获取

本项目完整代码已整理至GitHub仓库:
GitHub链接(示例)
包含:

  • 所有Python源码
  • HTML模板文件
  • 部署说明文档
  • 测试用例

八、扩展功能建议

  1. 多风格诗歌:增加选项选择古诗/现代诗风格
  2. 社交分享:集成分享功能
  3. 历史记录:保存用户生成记录
  4. 移动端适配:优化移动设备体验

九、技术难点解析

1. 图像描述生成

实际项目中,简单的文字描述不足以表达图像内容。建议:

  1. 使用预训练模型提取特征
  2. 构建图像标签系统
  3. 实现多模态描述生成

2. API调用稳定性

处理API限流和错误:

  1. import time
  2. def safe_api_call(func, max_retries=3):
  3. for i in range(max_retries):
  4. try:
  5. return func()
  6. except Exception as e:
  7. if i == max_retries - 1:
  8. raise
  9. time.sleep(2 ** i) # 指数退避

十、总结与展望

本项目通过Python和文心一言API实现了图像到诗歌的生成系统,展示了AI在创意领域的强大潜力。未来发展方向:

  1. 更精准的图像理解
  2. 多语言诗歌生成
  3. 个性化诗歌风格定制

完整项目代码已提供,建议开发者

  1. 先在本地运行测试
  2. 逐步添加增强功能
  3. 参考官方文档优化API调用

(全文约3200字)

相关文章推荐

发表评论