软件工程第一次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/202601SofwareEngineering
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/202601SofwareEngineering/homework/15712
这个作业的目标 通过调用 HuggingFace API 生成写实图像并搭建前端交互,掌握用代码调用大模型的基本流程;同时搭建 GitHub 个人主页,梳理个人技能与学习规划
学号 102401334

一、HuggingFace API 的调用

1.1 准备工作

  1. 在 HuggingFace 官网注册账号,并在 Settings → Access Tokens 生成一个 Read 权限的 token。
  2. 由于 XLabs-AI/flux-RealismLora 是一个 LoRA,需叠加在底模 black-forest-labs/FLUX.1-dev 上,而 FLUX.1-dev 是 gated 模型,因此需先在模型页接受许可。

image

1.2 调用方案说明

XLabs-AI/flux-RealismLora 本质是一个 LoRA,不能单独调用,需要基于 FLUX.1-dev 底模加载。考虑到本地显卡(8G 显存)难以流畅运行完整的 FLUX.1-dev 模型,本次采用 HuggingFace 云端 Inference API 进行调用:通过 huggingface_hub 库的 InferenceClient,在服务端调用 FLUX.1-dev 生成图像,再由 Flask 提供前端接口实现交互生成。

后端核心代码 app.py:

import os
import time

from flask import Flask, jsonify, render_template, request
from huggingface_hub import InferenceClient

app = Flask(__name__)

# Token 通过环境变量传入,不硬编码进代码,避免泄露
HF_TOKEN = os.environ.get("HF_TOKEN")
MODEL_ID = "black-forest-labs/FLUX.1-dev"

def _get_client() -> InferenceClient:
    if not HF_TOKEN:
        raise RuntimeError("未设置 HF_TOKEN 环境变量")
    return InferenceClient(token=HF_TOKEN)

@app.get("/")
def index():
    return render_template("index.html")

@app.post("/generate")
def generate():
    data = request.get_json(silent=True) or {}
    prompt = (data.get("prompt") or "").strip()
    if not prompt:
        return jsonify({"error": "提示词不能为空"}), 400

    negative_prompt = (data.get("negative_prompt") or "").strip() or None

    seed = data.get("seed")
    try:
        seed = int(seed) if str(seed).strip() not in ("", "None") else None
    except (TypeError, ValueError):
        seed = None

    try:
        client = _get_client()
        image = client.text_to_image(
            prompt=prompt,
            model=MODEL_ID,
            negative_prompt=negative_prompt,
            num_inference_steps=int(data.get("steps") or 28),
            guidance_scale=3.5,
            height=768,
            width=1024,
            seed=seed,
        )
    except Exception as e:
        return jsonify({"error": f"生成失败:{e}"}), 500

    os.makedirs("static", exist_ok=True)
    filename = f"flux_{int(time.time())}.png"
    image.save(os.path.join("static", filename))
    return jsonify({"image_url": f"/static/{filename}"})

if __name__ == "__main__":
    app.run(host="127.0.0.1", port=5001, debug=True, use_reloader=False)

独立验证 API 的脚本 test_direct.py:

import os, time
from huggingface_hub import InferenceClient

client = InferenceClient(token=os.environ["HF_TOKEN"])

prompt = ("A photorealistic close-up portrait of an elderly Chinese farmer, "
          "deep wrinkles, warm golden-hour side light, 85mm lens, "
          "shallow depth of field, ultra detailed skin texture, 8k")

image = client.text_to_image(
    prompt=prompt,
    model="black-forest-labs/FLUX.1-dev",
    negative_prompt="blurry, cartoon, low quality, deformed",
    num_inference_steps=28,
    guidance_scale=3.5,
    height=768, width=1024, seed=42,
)

os.makedirs("static", exist_ok=True)
path = f"static/direct_{int(time.time())}.png"
image.save(path)
print("调用成功:", path)

1.3 前端交互界面

前端使用 Flask 模板 + 原生 HTML/CSS/JS 实现:用户输入提示词、负面提示词、步数、种子,点击"生成"后通过 fetch 请求 /generate 接口,后端调用模型后返回图片并展示。

image

1.4 提示词设计思路与修改过程

写实图像的关键不是"越美越好",而是加入真实世界的瑕疵,并用镜头/相机参数模拟真实拍摄

提示词片段 作用
photorealistic close-up portrait 定调"照片级写实 + 特写",排除绘画/动漫风格
elderly Chinese farmer, deeply wrinkled sun-baked skin 具体主体 + 特征,皱纹、晒黑皮肤是最强的"真实感"锚点
warm golden-hour side lighting 侧光突出皮肤纹理与立体感
85mm lens, f/1.8, shallow depth of field 人像镜头参数,背景虚化,模拟真实拍摄
razor-sharp eyes, visible skin pores, fine facial hair 细节词,毛孔、胡茬这些"不完美"最显真
natural imperfections, hyper-detailed, 8k, full-frame DSLR 画质词 + 自然瑕疵,避免过度磨皮的假脸

修改过程:最初的提示词过于笼统(如 a realistic person),生成结果细节缺失、不够真实;逐步加入光线、镜头参数、皮肤细节等关键词后,写实程度明显提升。负面提示词中加入 blurry, cartoon, low quality 进一步抑制了非写实风格。
direct_1789015100
flux_1789015613
flux_1789015940

1.5 API 调用操作步骤

  1. 注册 HuggingFace 账号,生成 Read 权限的 Access Token。
  2. 接受 FLUX.1-dev 模型的 gated 许可。
  3. 安装依赖:pip install flask huggingface_hub pillow
  4. 设置环境变量:$env:HF_TOKEN = "hf_xxx"
  5. 运行 python test_direct.py 直接验证 API 调用成功。
  6. 运行 python app.py 启动 Flask 服务,浏览器访问 http://127.0.0.1:5001,在前端输入提示词交互生成。

1.6 体验与心得

  • 第一次真正"调用大模型",体会到 HuggingFace 把底层模型的复杂度封装成了统一 API,调用门槛大大降低。
  • 过程中踩了几个坑:Windows 的 5000 端口被系统保留导致服务起不来(改用 5001 解决);token 不能硬编码进代码(用环境变量解决);gated 模型需先接受许可。
  • 提示词对结果影响巨大,写实效果靠"真实瑕疵 + 镜头参数"而非简单堆叠"好看"的形容词。
  • 本地 8G 显存跑不动完整 FLUX 模型,学会用云端 API 替代,理解了"算力受限时如何选择调用方式"。

二、GitHub个人主页

image


三、技能树与自我评估

已具备的能力

  • 能力 A:Python + Flask Web 开发 —— 能独立完成简单的后端接口开发,本次作业即用 Flask 搭建了前后端交互的生成服务。
  • 能力 B:Java(入门)+ SpringBoot —— 了解面向对象编程思想,能搭建基础的 SpringBoot 项目。
  • 能力 C:C/C++ 语言基础 —— 掌握基础语法、指针、结构体等,能编写简单程序。
  • 能力 D:调用第三方 API —— 已实践 HuggingFace Inference API 的调用流程。

感兴趣的技术方向

  • AI 方向:大模型应用、图像生成、AI 接口调用,是当前最感兴趣、最想深入的方向。

还欠缺的能力

  • 前端开发:HTML/CSS/JS 只够做简单页面,缺少完整的前端工程能力。
  • 数据库:SQL 基础与数据库设计能力不足。
  • 数据结构与算法:熟练度不够,影响解决复杂问题的能力。
  • 软件工程规范:需求分析、设计模式、自动化测试等工程化实践欠缺。
  • 大型项目协作经验:缺少多人协作、代码评审、版本管理规范的经验。

四、代码量说明

  • 截至目前的代码量:约 8000 行(以 Python、Java、C 为主)。
  • 完成本学期课程后期望达到的代码量:约 20000 行。通过课程小组项目和持续的 AI 应用实践,期望在代码量和代码质量上都有明显提升。

五、本课程最期待学习的知识与收获

  • 最期待学习的知识:软件工程的核心方法论(需求分析、设计、测试、团队协作),以及如何把 AI 工具应用到软件开发流程中。
  • 希望获得的收获:完整的项目开发经验、规范的工程习惯、团队协作能力,以及"从需求到交付"的完整流程认知。

六、AI 工具生成的软件工程学习指南及分析

以下指南由 AI 工具(Claude Code)生成:

软件工程课程学习指南

  1. 知识地图:软件生命周期(需求→设计→编码→测试→维护)、需求工程、软件设计(高内聚低耦合)、编码与实现、软件测试(黑盒/白盒)、项目管理与协作(Git/Scrum)、过程模型(瀑布/迭代/敏捷)。
  2. 学习路径:第 1-3 周掌握 Git + GitHub;第 4-6 周需求分析与 UML 设计;第 7-10 周小组项目实践;第 11-14 周测试与文档完善;期末交付可运行软件 + 文档。
  3. 必备工具:Git/GitHub、一个 IDE、Markdown、测试框架、一个 AI 编程助手。
  4. 学习方法:项目驱动(软件工程是"做"出来的)、重视文档、重视多人协作、善用 AI 但要能看懂并验证其输出。

分析:

  • 是否合理:合理。指南覆盖了软件工程的核心内容(生命周期、需求、设计、测试、协作),学习路径按周推进、循序渐进,工具清单也都是实际开发中真正会用到的东西。
  • 能否帮助自己:有帮助。其中"项目驱动"和"重视文档、协作"的建议点出了软件工程与普通编程课程的本质区别——重点不在写出代码,而在于用规范的方法、多人协作地交付软件。我会重点实践"项目驱动"这一点,尽早组队做小项目。

image

posted @ 2026-09-10 13:58  王翔鹏  阅读(12)  评论(0)    收藏  举报