软工第一次作业

软件工程实践第一次作业

这个作业属于哪个课程 H202601软件工程与软件工程实践
这个作业要求在哪里 软件工程实践第一次作业要求
这个作业的目标 完成开发环境与个人主页搭建:注册 GitHub 与博客园账号并加入班级;调用 Hugging Face 的 Flux 模型(XLabs-AI/flux-RealismLora)生成贴近真实世界的图像,并结合前端实现交互生成;梳理个人技能树与三年规划
学号 102401512

一、准备工作

1.1 GitHub 账号

1.2 博客园账号

  • 注册博客园账号,设置昵称(实名制)、头像等个人信息,并选择博客皮肤样式(LessIsMore)。
  • 已关注任课老师黄兆武、助教李怡涵与焦圣蒙的博客。
  • 已加入班级博客 H202601软件工程与软件工程实践,并在班级成员列表中确认实名加入成功。

二、Hugging Face API 调用:用 Flux 模型生成真实感图像

2.1 任务描述

在 Hugging Face 注册账号并获取 API,调用 Flux 模型(模型地址:XLabs-AI/flux-RealismLora)生成一张最贴近真实世界的图像,在调用模型的代码基础上结合前端接口,实现交互生成。

2.2 技术方案

flux-RealismLora 是一个 LoRA 微调模型,不能单独运行,必须挂载在基础模型上使用。最初方案是调用 HF 官方推理 API 的基础模型 black-forest-labs/FLUX.1-dev,通过请求参数 "adapter": "XLabs-AI/flux-RealismLora" 挂载 LoRA。但联调中发现 hf-inference 已于 2026 年弃用 FLUX.1 系列(返回 HTTP 410 deprecated),最终改用 Hugging Face Space 上社区部署的 flux-RealismLora 应用(Gradio API)——模型仍是作业指定的 XLabs-AI/flux-RealismLora,运行在 HF 的 ZeroGPU 上。

  • 主用 Space:DamarJati/FLUX.1-RealismLora(接口 /run_lora
  • 备用 Space:prithivMLmods/FLUX-REALISM(接口 /run,模型选项 flux.1-dev-realism

2.3 操作步骤

  1. https://huggingface.co 注册账号并登录

  2. 右上角头像 → Settings → Access Tokens → Create new token(类型选 Fine-grained,勾选 Make calls to Inference Providers 与 Read access to public gated repos)→ 复制 hf_ 开头的 token

    📷 截图 5:Access Token 创建页面(token 已打码)
    alt text

  3. 打开 https://huggingface.co/black-forest-labs/FLUX.1-dev 点击 Agree and access repository 接受许可

  4. 将 token 填入后端代码 app.pyHF_TOKEN 变量

  5. pip install -r requirements.txt 安装依赖后运行 python app.py

  6. 浏览器打开 http://127.0.0.1:5000 ,输入提示词、调整参数、点击「生成图像」

  7. 首次调用需等待 ZeroGPU 排队(约 10~60 秒),生成结果展示在右侧并可下载

2.4 核心代码

后端 Flask 调用 HF Space Gradio API(app.py 关键片段):

from gradio_client import Client

# 带 HF token 认证连接 Space(匿名 ZeroGPU 配额很少)
client = Client("DamarJati/FLUX.1-RealismLora", token=HF_TOKEN)

# 调用 /run_lora 接口:prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora_scale
result = client.predict(
    prompt,
    3.5,        # cfg_scale:引导系数
    28,         # steps:采样步数
    True,       # randomize_seed:随机种子
    0,          # seed
    1024, 1024, # width, height
    1.0,        # lora_scale:LoRA 强度
    api_name="/run_lora",
)
img_path, used_seed = result[0], result[1]  # 图片路径 + 实际使用的种子

前端 templates/index.html 通过 fetch("/generate") 提交提示词与参数,实时展示生成结果,并用 localStorage 持久化「API 调用记录」面板(时间、提示词、HTTP 状态码、耗时、结果)。

2.5 API 调用成功的记录

实测成功调用记录(2026-09-08):

字段
目标服务 https://DamarJati/FLUX.1-RealismLora.hf.space(HF Space Gradio API)
接口 /run_lora
模型 XLabs-AI/flux-RealismLora(Space 内置加载)
图片尺寸 1024 × 1024
采样步数 28
引导系数 3.5
HTTP 状态码 200
耗时 37.62 s
实际随机种子 498756648
保存文件 static/generated/20260908_225738_632994.webp

📷 截图 7:前端页面生成成功的完整截图(含结果图与「API 调用记录」面板)
image

📷 截图 8:「API 调用记录」面板特写
image

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

一条高质量的写实提示词包含五个要素:主体 + 场景 + 光线 + 镜头参数 + 质感词

以「老者人像」为例的迭代过程:

版本 提示词 效果与问题
初版 a realistic photo of an old man 画面笼统,皮肤有"塑料感",背景杂乱
第二版 portrait of an elderly Chinese fisherman, wrinkled skin, silver beard 主体特征明确,但光线平淡像随手拍
最终版 ultra realistic close-up portrait of an elderly Chinese fisherman, deeply wrinkled weathered skin, silver beard, warm golden hour side lighting, shot on Canon EOS R5, 85mm lens, f/1.8, shallow depth of field, film grain, photorealistic, 8k 黄昏侧光塑造立体感,85mm f/1.8 大光圈虚化背景,film grain 与 photorealistic/8k 强化真实质感

设计心得:

  1. 主体描述越具体越好("fisherman"比"old man"能联想出更多真实细节)
  2. 镜头参数是"真实感密码"(85mm lens, f/1.8, shallow depth of field
  3. 光线决定氛围(golden hour side lighting 比"光线充足"更接近真实摄影)
  4. 质感词收尾(film grain, photorealistic, 8k
  5. 群体场景容易失真:生成「大学阶梯教室」场景时,将"二十名左右大学生"改为 a class of university students,并用 no anime, no cartoon, no plastic skin 显式排除二次元风格

📷 截图 9:最终生成图像(贴近真实世界的一张)特写截图
image

2.7 排障记录

本次调用共排除了 6 个问题(详见下表),完整过程记录在项目 作业报告.md

# 问题 根因 解决
1 SSL 连接被重置 旧域名 api-inference.huggingface.co 被 DNS 污染(解析到 Facebook IP 段) 改用 router.huggingface.co 新域名
2 Python 直连失败、浏览器正常 requests 不读 Windows 系统代理 代码自动探测注册表系统代理
3 HTTP 403 未接受 FLUX.1-dev gated 许可 通过 ask-access 接口完成许可接受
4 HTTP 403 权限不足 Fine-grained token 未勾选推理权限 token 设置中勾选 Make calls to Inference Providers
5 HTTP 410 hf-inference 弃用 FLUX.1 系列 改用 HF Space Gradio API
6 接口不统一 / ZeroGPU 配额 两个 Space 接口差异大;匿名配额耗尽 每个 Space 独立适配函数;带 token 认证

2.8 体验与心得

  1. API 调用门槛低:HF 把复杂模型封装成 HTTP 接口,几十行代码即可调用最先进的生成模型,无需本地 GPU。
  2. 提示词工程是真正的门槛:模型能力再强,提示词不好输出依然平庸;"主体+光线+镜头参数+质感词"的组合对真实感提升显著。
  3. API 方案要随平台演进调整:hf-inference 弃用 FLUX.1 是题面没有预料到的情况,最终通过 Space 的 Gradio API 达成同样目标——调用第三方 API 时,平台服务状态本身就是变量,有备选路径的方案(本项目双 Space 容灾)很重要。
  4. 排障方法论比单个知识点更有价值:六个问题覆盖网络层(DNS/代理)、认证层(token)、授权层(许可/权限)、服务层(模型弃用),"逐层验证、对比实验、读错误信息"的方法论在任何 API 联调中通用。
  5. Token 安全:Bearer Token 是唯一凭证,必须保管好,截图打码、不提交公开仓库。

三、GitHub 个人主页建设

我采用方案一(个人资料自述文件):新建一个与 GitHub ID 同名的仓库,在仓库根目录 README.md 中撰写个人介绍。GitHub 会自动在个人主页展示该 README。

README 内容包括:自我介绍(兴趣爱好、想分享的经历)、个人成果与技能评估、未来三年发展规划。完整内容如下(该内容已整理为单独的 README.md 文件并上传至 GitHub 仓库):

# 👋 Hello, I'm 任奥辉

福州大学计算机与大数据学院 2024 级计算机科学与技术专业本科生。
对软件工程、Web 开发与人工智能应用充满热情。

## 🎯 关于我
- 兴趣爱好:游戏、足球、科幻小说;喜欢把学到的东西做成小工具分享给同学
- 想分享的经历:大二暑期参加了学校组织的企业实训,第一次完整经历
  "需求 → 开发 → 测试 → 上线"的流程,深刻体会到团队协作与版本管理的重要性

## 🛠 技能与成果
- 编程语言:C/C++、Java、Python(熟悉)
- 课程项目:学生信息管理系统(C++/Qt)、简单聊天室(Java Socket)、
  基于 Flask 的 AI 图像生成 Web 应用(本次软工实践)
- 工具链:Git/GitHub、VS Code、Linux 基础操作、MySQL 基本使用
- 自我评估:已掌握数据结构与算法、面向对象编程、数据库基本原理;
  对 AI 应用开发与前后端协作最感兴趣;最希望学习软件架构设计、
  自动化测试与工程化开发流程

## 🗺 未来三年规划
- 大三(本学期):系统学习软件工程方法学,完成课程项目,
  积累代码量到 2 万行以上
- 大三下~大四:争取进入互联网企业实习,在真实项目里锻炼工程能力;
  大四秋招拿到心仪 offer
- 毕业后第一年:在工作中持续学习架构与工程化,成为能独立负责模块的工程师

四、技能树梳理与自我评估

已具备的专业知识与能力

  • 能力 A:程序设计基础。熟练使用 C/C++ 与 Python,Java 可阅读与编写中等规模程序;数据结构与算法课程成绩良好,掌握常见数据结构与基本算法思想,具备 LeetCode 中等题目的解题能力。
  • 能力 B:面向对象与数据库。理解封装、继承、多态,完成过 Qt 桌面应用课程设计;掌握 SQL 基本语法与 ER 图设计,能独立完成小型业务系统的表结构设计。
  • 能力 C:Web 开发入门。了解 HTTP 协议与前后端交互流程,会用 Flask 搭建带接口的 Web 应用,能编写 HTML/CSS/JavaScript 页面(本次 HF 图像生成作业即为一次完整实践)。
  • 能力 D:开发工具链。使用 Git/GitHub 进行版本管理(commit、分支、PR),VS Code 高效编码,Linux 基本命令与服务器环境配置。

感兴趣的技术方向

AI 应用开发、Web 全栈、软件工程方法学(需求分析、设计模式、测试)。

尚欠缺的能力

  1. 工程化能力:大型项目的模块划分、架构设计经验不足,没接触过 CI/CD、容器化部署
  2. 代码质量意识:单元测试、代码评审参与少,代码规范性有待加强
  3. 算法深度:动态规划、图论等高级算法不熟练,竞赛/笔试压力大
  4. 英语阅读:阅读英文技术文档速度慢,依赖翻译工具

五、代码量统计与目标

  • 截至目前代码量:约 5000行(主要来源:C/C++ 课程与数据结构作业约 2000 行、Java/数据库课设约 1000 行、Python 脚本与本次软工作业约 1000 行、其他课程小项目约 1000 行)。
  • 本学期课程结束目标1.5 万行以上。通过软工实践大项目(预计 5000+ 行)与日常刷题、工具脚本积累达成。

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

  • 最期待:软件需求分析方法(如何把模糊的用户想法变成可验收的规格说明)、团队协作流程(Git 协作规范、任务分工与进度管理)、测试与质量保障(单元测试、代码评审的实战)
  • 希望获得的收获:完整经历一次"从需求到上线"的团队项目开发;建立工程化思维——代码不仅要"能跑",更要"可维护、可协作、可交付";提升文档撰写与表达汇报能力

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

我使用 DeepSeek 生成了一份软件工程课程学习指南,原文如下:

软件工程课程学习指南(DeepSeek 生成)

  1. 理解软件生命周期:从需求分析、设计、编码、测试到维护,掌握每个阶段的核心活动与交付物。
  2. 掌握需求工程:学会用例图、用户故事等需求表达工具,多练习把口头需求转成可验证的规格。
  3. 重视设计模式与架构:掌握常用设计模式(工厂、观察者、单例等),了解 MVC、微服务等架构风格。
  4. 实践版本控制与协作:熟练使用 Git(分支策略、冲突解决),在团队中实践 PR 评审流程。
  5. 动手做项目,而不是只看书:软件工程是实践学科,建议以小组项目为主线贯穿学习。
  6. 学习测试与质量保障:单元测试、集成测试、代码覆盖率的基本概念与实践。
  7. 定期复盘与文档化:每个阶段写文档并复盘,训练表达与总结能力。

分析:这份指南整体合理。它抓住了软件工程的核心——生命周期、需求、设计、测试、协作,且强调"动手做项目"与"定期复盘",与本课程的实践导向一致。对我有帮助的部分是第 2、5 条:我此前写代码习惯"边写边想需求",导致返工;按需求工程的方法先固定规格再开发,能明显减少无效劳动。不足的是:指南偏向宏观原则,缺少可执行的具体计划(如每周做什么、读什么书),第 4 条对 Git 协作的细节(如冲突处理场景)展开不够,需要我结合课程进度自行细化。

八、作业编写说明

  • 本随笔使用 Markdown 编辑器 编写(博客园「设置 → 编辑器」切换为 Markdown)。
  • 作业开头已按课程要求附上「课程信息表格」。

📷 截图 11:博客园后台博文编辑页面截图(证明使用 Markdown 编辑器)
image

posted @ 2026-09-09 15:04  ren3717  阅读(29)  评论(0)    收藏  举报