2026秋软件工程第一次个人作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/2026-01SoftwareEngineeringandSoftwareEngineeringPractice
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/2026-01SoftwareEngineeringandSoftwareEngineeringPractice/homework/16716
这个作业的目标 搭好三个平台(GitHub/博客园/Hugging Face) / 跑通一个 AI 图像生成 Demo / 写一篇展示自我认知的随笔 / 建一个含三年规划的个人主页并通过博客园班级入口正式提交。
学号 102402104

自我介绍

  1. 👐Hello,我是王可人(asakinza)
    福州大学2024级大数据专业本科生,来自江苏省南通市
    关于我
    ✅掌握Python、c++等基础编程语言
    ✅能够搭建简易web平台并且完成相关项目
    ✳️对数据处理以及流媒体与大数据的融合充满兴趣

  2. 个人爱好
    家里蹲爱好者,喜欢绘画和看番,正在制作自己的作品集

  3. 未来规划
    备考研究生,聚焦大数据与流媒体技术方向,系统学习分布式计算、实时数据处理与视频传输优化。

一、个人主页搭建

  1. https://asakinza.github.io/

b1f7fd7e409e29530e9bd126bbeae731

  1. https://home.cnblogs.com/

02363adf116dae52cac77a3aff472fcd

二、huggingface-API的调用

  1. 背景与方案选择

本次作业原计划通过 Hugging Face 官方 API 调用 XLabs-AI/flux-RealismLora 模型生成写实图像。
实际操作中遇到两个障碍:

  • Hugging Face 官网无法打开,在线 API 无法访问;
  • 本地硬件不足:设备为 Intel Iris Xe 核显(无 CUDA 支持),内存仅暂时不足,远低于 FLUX.1-dev 基础模型的运行要求,本地部署不可行。

因此改用国内可直接访问的硅基流动(SiliconFlow)平台完成 API 调用,模型选用免费可用的 Kwai-Kolors/Kolors,并通过 Gradio 搭建交互式前端。
以下记录完整操作流程。

  1. API 调用操作步骤
  • 配置 Python 环境
    由于系统 Python 3.14 过新、且 Anaconda base 环境受保护,创建独立的 conda 环境:
conda create -n flux python=3.10 -y
conda activate flux

安装依赖(CPU 版 PyTorch,因无 NVIDIA 显卡):

pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu
pip install diffusers transformers accelerate gradio huggingface_hub requests pillow
  • 获取硅基流动 API 密钥
    访问 siliconflow.cn 注册账号,在控制台“API 密钥”页面新建密钥(以 sk- 开头),保存到本地。
  1. 编写调用代码 + Gradio 前端
    完整代码保存为 siliconflow_flux.py:
import os
import requests
import gradio as gr
from PIL import Image
from io import BytesIO
# 配置区
API_KEY = os.environ.get("SILICONFLOW_API_KEY", "sk-vtkqefnwbjhozjmveultlknakafyeysnlfdstdfergddhgnd"
)
API_URL = "https://api.siliconflow.cn/v1/images/generations"
MODEL = "Kwai-Kolors/Kolors"
#调用
def generate_image(prompt, image_size="1024x1024"):
    if not prompt.strip():
        raise gr.Error("请输入提示词")
    headers = {
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json",
    }
    payload = {
        "model": MODEL,
        "prompt": prompt,
        "image_size": image_size,
        "num_inference_steps": 20,
        "guidance_scale": 3.5,
    }
    resp = requests.post(API_URL, json=payload, headers=headers, timeout=120)
    if resp.status_code != 200:
        raise gr.Error(f"API 返回错误 {resp.status_code}: {resp.text[:200]}")
    data = resp.json()
    image_url = data["images"][0]["url"]
    img_resp = requests.get(image_url, timeout=60)
    image = Image.open(BytesIO(img_resp.content))
    image.save("flux_output.png")
    return image
# Gradio 前端 
with gr.Blocks(title="Flux 写实图像生成器") as demo:
    gr.Markdown("# Flux 写实图像生成器(硅基流动 API)")
    gr.Markdown("输入英文提示词,生成贴近真实世界的图像。")
    with gr.Row():
        with gr.Column():
            prompt_input = gr.Textbox(
                label="提示词(建议英文)",
                lines=4,
                placeholder="photorealistic photo, quiet city street at sunrise, soft golden sunlight, shot on Sony A7M4, 35mm lens, f/1.8",
            )
            size_input = gr.Dropdown(
                choices=["1024x1024", "768x1024", "1024x768", "576x1024", "1024x576"],
                value="1024x1024",
                label="图像尺寸",
            )
            btn = gr.Button("生成图片", variant="primary")
        with gr.Column():
            output_image = gr.Image(label="生成结果")

    btn.click(generate_image, inputs=[prompt_input, size_input], outputs=output_image)
demo.launch(server_name="127.0.0.1", server_port=7860)

说明:

  • API_URL 为硅基流动统一的图像生成端点;
  • 请求头 Authorization: Bearer 完成鉴权;
  • negative_prompt 是 Kolors 支持的负面提示词字段,用于排除不想要的特征。
  1. 运行并生成图像
python siliconflow_flux.py

终端输出 Running on local URL: http://127.0.0.1:7860 ,浏览器访问该地址,输入提示词点击生成。

  1. 遇到的问题与解决
问题 报错信息 解决方法
模型被禁用 403 原 FLUX.1-schnell 免费额度已结束

| 模型不存在 | 400 {"code":20012,"message":"Model does not exist."} | 模型名需严格匹配平台列表 |

最终解决:改用 Kwai-Kolors/Kolors 该模型当前免费可用,调用成功

  1. 提示词设计思路与修改过程
  • 设计思路
    图像内容为“桌面上的笔筒”。由于目标是贴近真实世界的图像,提示词不采用艺术化描述,而是模拟摄影师的拍摄说明,包含以下要素:
要素 作用
主体与场景 明确拍摄对象(木质笔筒 + 桌面)
光线条件 决定真实感(自然窗光、暖色晨光)
镜头参数 模拟真实拍摄(50mm、f/2.0、浅景深)
设备/胶卷 增加摄影质感(Fujifilm X-T4、film grain)
构图与背景 控制画面层次(candid still life、blurred background)
  • 修改过程
    初稿:
    Photorealistic close-up photograph of a wooden pen holder on a tidy desk, filled with a few pens and pencils. Soft natural window light from the left, shallow depth of field, 50mm lens, warm morning atmosphere.
    改进:加入光线方向、镜头参数、氛围描述,方向正确,但生成结果仍存在:笔太多且色块模糊、桌面杂乱、色调偏冷的问题。
    屏幕截图 2026-09-11 213213
    修改版:
    A single wooden pen holder on a clean desk, containing exactly three pens and two pencils. Soft warm morning sunlight from the left window, gentle shadows. Shot with a 50mm lens at f/1.8, shallow depth of field. The background is blurred, showing only a white coffee mug. Fujifilm film simulation, warm color tone, natural wood grain texture, minimalist composition, no clutter, professional product photography.
    屏幕截图 2026-09-11 213810

  • 改进要点:
    用 exactly three pens and two pencils 限定数量,避免模型随意填充;
    用 clean desk、no clutter、minimalist composition 约束构图;
    强化暖色光(warm morning sunlight、warm color tone),修正原图偏冷的问题;
    加入 professional product photography,提升产品级画质。

  1. API 调用体验与心得

调用体验

  • 接口设计友好:硅基流动的 /images/generations 接口采用标准 RESTful 风格,请求体为 JSON,返回图片 URL,requests 库即可直接调用,无需额外 SDK。
  • 图片 URL 时效性:生成图片的链接仅 1 小时有效,必须在代码中立即下载保存(本代码已用 Image.open(BytesIO(...)) 处理)。
  • 模型选择是关键:同一接口下不同模型可用性差异很大。FLUX.1-schnell 曾限时免费但现已禁用,Kolors 当前免费可用,切换模型是解决问题的核心。

遇到的问题与收获

  • 环境问题是第一道坎:Python 版本过新、Anaconda base 环境受保护、无 CUDA 支持,这些问题都需要通过创建独立 conda 环境、安装 CPU 版 PyTorch 来解决。
  • 模型可用性需要主动确认:不能假设某个模型一定可用,遇到 Model disabled 或 Model does not exist 时,应及时查阅平台“模型广场”或 API 文档,切换到当前可用模型。
  • 提示词的具体程度决定生成质量:写实模型对数量、光线方向、构图约束的敏感度远高于泛泛的“high quality”。加入 exactly three pens、no clutter 等约束后,可控性显著提升。
  • 负面提示词很有价值:Kolors 支持 negative_prompt,显式排除“杂乱、冷光、模糊”等特征,比单纯堆叠正向词更有效。

方案对比反思

方案 优点 缺点
Hugging Face 在线 API 模型丰富、官方支持 官网访问受限,无法使用
本地部署 FLUX.1-dev 无调用次数限制 需 GPU(≥8GB 显存)和 32GB+ 内存,硬件不满足
硅基流动 API 国内可访问、免费模型可用、接口简单 模型可用性会调整,需及时切换

总结

  • 在硬件和网络条件受限的情况下,选择国内可访问的 API 平台是务实之举。本次作业不仅完成了“API 调用 + 前端交互”的技术目标,更在实践中理解了模型选择、提示词设计、参数调优三者的关系——提示词决定“拍什么”,参数决定“怎么拍”,模型决定“拍得好不好”。

三、软件工程随笔

  1. 已具备的专业知识与能力:
  • 能力 A:编程语言基础
    掌握 C/C++ 和 Python 的基本语法,能独立完成数据结构与算法的课程作业,理解面向对象编程思想(类、继承、多态)。Java 有初步了解,能读懂简单项目代码,但独立开发经验较少。

  • 能力 B:前端开发入门
    了解 HTML/CSS/JavaScript 基础,能搭建静态页面,使用过 Bootstrap 做简单响应式布局。本学期刚接触 Gradio 和 Hugging Face API 调用,能完成“模型调用 + 前端交互”的最小闭环(如用 Gradio 封装文生图模型)。

  • 能力 C:开发工具与协作
    熟悉 Git 基本操作(clone/fork/commit/push),能在 GitHub 上进行仓库管理和 Pages 部署。会用 VS Code、PyCharm 等 IDE,了解 Markdown 写作和基础命令行操作。

  • 能力 D:算法与数据结构
    掌握数组、链表、栈、队列、树、图等基本结构,能实现常见排序和查找算法,理解时间/空间复杂度分析。LeetCode 简单题可独立完成,中等题需要参考思路。

  1. 感兴趣的技术方向
  • AI 应用开发:尤其是大模型 API 调用、提示词工程、AI 与前端结合的交互产品(如本次作业中的 Flux 模型调用)。
  • 全栈开发:希望打通“前端界面 + 后端逻辑 + 数据库”的完整链路,做出可上线的 Web 应用。
  • 软件工程方法论:对需求分析、架构设计、敏捷开发、代码规范等工程化实践感兴趣,想了解真实项目是如何从 0 到 1 推进的。
    还欠缺的能力
  • 工程化能力不足:能写“能跑”的代码,但缺乏模块化、可维护、可测试的意识;不会写单元测试,没用过 CI/CD。
  • 后端与数据库经验薄弱:没独立搭过服务器、写过 API 接口,SQL 只会基础增删改查,不了解 ORM、缓存、消息队列等。
    团队协作开发经验少:Git 只停留在个人仓库操作,没经历过多人分支协作、Code Review、Issue 跟踪的完整流程。
  • 系统设计能力欠缺:面对一个稍复杂的项目,不知道如何拆解模块、设计接口、权衡技术选型。
  • 调试与排错能力有限:遇到报错常靠搜索和试错,缺乏系统性的定位思路和工具使用经验(如断点调试、日志分析)。
  1. 代码量说明与目标
  • 截至目前代码量:约 1500行(含课程作业、算法练习、零星小项目)。
  • 本学期课程后希望达到的代码量:5000行。
  1. 最期待学习的知识:
  • 软件生命周期与工程化流程:一个软件从需求到上线到底要经历哪些阶段,每个阶段产出什么文档、用什么工具。
  • 版本控制与团队协作:Git 分支模型(如 Git Flow)、Pull Request、Code Review 的实际操作。
  • 设计模式与架构基础:如何写出可扩展、可维护的代码,而不是“一次性脚本”。
  • 测试与质量保障:单元测试、集成测试怎么写,如何保证代码质量。
  • 项目管理与敏捷实践:Scrum、看板、Issue 管理、迭代规划等真实团队做法。
  1. 希望获得的收获:
  • 从“会写代码”到“会做软件”:不再只是完成一个函数或一个页面,而是能独立或协作交付一个完整的、可用的软件产品。
  • 工程思维:遇到问题时,能用工程化的方式拆解、设计、验证,而不是上来就写代码。
  • 协作能力:能在一个多人团队中清楚表达自己的设计、理解他人的代码、有效参与 Review。
  • 一份拿得出手的项目经历:希望期末能做出一个自己愿意放进简历、能讲清楚设计取舍的项目。
  • 对“软件工程”这个专业的真实认知:知道它和“写代码”的区别,也明白自己未来想往哪个方向深入。

四、软件工程课程学习指南生成及分析

学习指南采用deepseek生成

  1. 课程核心目标
    掌握软件从需求分析、设计、编码、测试到维护的完整生命周期,理解软件工程思想、开发流程、建模方法与项目管理,能够规范完成小型软件项目开发,区分编程实现和软件工程的差异(软件工程不止写代码,更强调流程、质量、协作)。

  2. 重点知识模块
    软件工程基础概念:软件危机、软件工程定义、软件生命周期、软件模型(瀑布、增量、原型、敏捷),区分各类模型适用场景。
    需求工程:需求分类(功能性、非功能性),需求获取方法,编写需求规格说明书,需求评审。
    软件设计:概要设计(模块划分、架构设计)、详细设计;UML建模:用例图、类图、时序图、活动图;高内聚低耦合设计原则。
    软件实现与编码:编码规范、代码评审、版本控制(Git),面向对象开发思想。
    软件测试及测试分类:单元测试、集成测试、系统测试、验收测试;黑盒测试、白盒测试;测试用例设计。
    软件维护与项目管理:四种维护类型;项目计划、进度管理、风险管理、质量保证。
    敏捷开发
    敏捷宣言、Scrum核心角色、迭代开发,对比传统瀑布模型。

  3. 学习建议
    理论结合实践:不要只背概念,尽量动手做小项目:用UML画图表、写需求文档、编写测试用例,体会完整开发流程。
    重视建模工具:熟练看懂、绘制UML图,这是考试和课程设计高频考点。

  4. 常见考点
    软件危机产生原因与解决途径
    各软件开发模型优缺点与适用场景
    软件需求分类,需求规格说明书
    UML各类图识别与绘制
    内聚、耦合概念
    测试的各个阶段,黑盒/白盒测试
    软件维护分类、敏捷开发核心思想

  5. 学习资源
    教材:软件工程经典教材,重点看生命周期、UML、测试部分
    工具:Draw.io(画UML)、Git(版本管理)
    练习:做历年习题,多做项目文档练习

  6. 学习误区提醒
    ❌误区:软件工程就是学写代码
    ✅正确:代码只是其中一环,课程重点是流程、文档、质量、团队协作。

合理性分析
合理之处:

  1. 知识模块从基础概念 → 需求 → 设计 → 实现 → 测试 → 维护 → 项目管理,符合经典教材主线。
  2. 强调“软件工程不止写代码”,点出了课程核心。
  3. 突出 UML 建模、模型对比、测试分类等高频考点。
  4. 误区提醒切中要害,能纠正“软件工程 = 写代码”的错误认知。

不足之处:

  1. 偏理论复习提纲,实践指导较少(如测试用例设计方法、Git 协作流程未展开)。
  2. 缺少工具链建议(只提了 Draw.io 和 Git)。
  3. 没有涉及课程实际作业体系(博客园、GitHub Pages、API 调用等)

总结:有帮助,但需结合自身情况调整。

posted @ 2026-09-11 22:43  asakinza  阅读(25)  评论(0)    收藏  举报