软件工程第一次个人作业

这个作业属于哪个课程 H202601软件工程与软件工程实践
这个作业要求在哪里 第一次作业要求
这个作业的目标 完成 GitHub 与博客园账号准备、搭建 GitHub 个人主页、调用 Hugging Face API 结合前端实现 Flux 模型交互式图像生成,并在随笔中完成技能树自评、代码量统计与 AI 学习指南分析
学号 102401511

2026 软件工程第一次作业随笔:账号准备 · GitHub 主页 · Flux 交互式图像生成 · 技能盘点

image

哈喽这里是爱昴

📅 2026 年秋季学期 · 软件工程课程 · 第 1 篇随笔

开课第一周,我把本次作业的三个板块——账号准备Hugging Face API 调用GitHub 个人主页搭建逐一完成,并借这篇随笔对自身的技术栈与能力边界做一次完整盘点。知所长,亦知所短,方能有的放矢。


一、准备工作:三大账号与班级就绪

1.1 GitHub 账号

1.2 博客园账号

  • 博客园 建立个人技术博客,完善了昵称(爱昴)、头像等个人信息,并根据个人喜好设置了博客皮肤与页面样式。
  • 博客地址:https://www.cnblogs.com/imao/

1.3 关注老师与助教的博客

身份 姓名
任课老师 黄兆武
助教 李怡涵
助教 焦圣蒙

1.4 加入班级博客

已加入博客园班级 H202601软件工程与软件工程实践,并使用实名制确认班级成员身份。

✅ 至此,准备工作全部完成。


二、GitHub 个人主页搭建

两种方案中,我选择了方案一:创建个人资料自述文件(Profile README)。理由有三:

  1. 零部署成本,无需额外维护站点构建流程;
  2. README 天然使用 Markdown,与博客写作技能互通;
  3. 访客进入我的 GitHub 主页即可直接看到完整介绍,传播路径最短。

2.1 搭建步骤

  1. 在 GitHub 上新建一个与用户名完全相同的仓库:rohitpyarepur2006-coder/rohitpyarepur2006-coder
  2. 创建时勾选 "Add a README file"(GitHub 会提示这是个人主页专用仓库);
  3. 在仓库根目录编辑 README.md,用 Markdown 撰写个人介绍;
  4. 提交后,该内容自动展示在 GitHub 个人主页最上方。

📷 image

2.2 主页内容设计

按照作业要求“介绍自己 → 展示成果与技能并自我评估 → 未来三年发展规划"的逻辑,我将 README 组织为四个板块:

① 关于我

介绍了自己的兴趣爱好:课余喜欢听音乐(周杰伦、孙燕姿、李荣浩、林俊杰),闲暇时喜欢追番放松;热爱游戏,也是各类竞技赛事的狂热观众;坚持运动健身,用出汗保持精力充沛。

② 技术栈与专业实践

  • 已掌握的核心技能:能够使用 Python 进行开发,并使用 PyTorch 框架进行模型构建与调试;具备远程服务器运维与环境配置能力,会使用 SSH / MobaXterm 在 Linux 环境下管理 Conda 虚拟环境、CUDA 依赖及代码部署。
  • 专业实践经历:深入研究并复现了多个经典与前沿的深度学习模型架构(如 UNet、Swin Transformer);在伪装目标检测(Camouflaged Object Detection)领域有一定的实践经验,曾在服务器上成功部署并调试过 OVCoser、BGNet 等开放词汇(Open-vocabulary)视觉模型;具备独立研读 CVPR/ECCV 等顶会论文的能力,能够结合数学原理(如 SVD 矩阵分解、交叉注意力机制)深度剖析模型源码。

③ 自我评估

  • 已掌握:深度学习模型构建与调试、Linux 服务器运维、前沿视觉模型工程化部署;
  • 感兴趣:大视觉语言模型(Vision-Language Models)、伪装目标检测;
  • 最希望学习:深化 VLM 领域理论储备,提升大型 AI 项目的工程化落地与全栈交互能力。

④ 未来三年发展规划

未来三年的核心规划是全力备战考研。本科阶段在深度学习与计算机视觉方向积累的兴趣,让我希望进入更高水平的院校深造,目标加入优秀的 AI 实验室,在开放词汇图像分割等垂直领域产出有价值的学术成果,为未来的科研或高端算法岗位打下坚实基础。

📷 image


三、Hugging Face API 调用:Flux 生成真实感图像

本部分作业要求:注册 Hugging Face 获取 API,调用 XLabs-AI/flux-RealismLora 模型生成一张最贴近真实世界的图像,并在调用代码基础上结合前端接口实现交互生成

3.1 注册与获取 API Token

  1. Hugging Face 官网 注册账号并完成邮箱验证;
  2. 进入 Settings → Access Tokens → New token
  3. 权限选择 Read(仅调用推理接口足够),生成后立即复制保存(Token 只显示一次)。

⚠️ 安全提醒:API Token 相当于账号密钥。我在项目中使用 .env 文件配合 python-dotenv 加载密钥,避免将 Token 明文硬编码在源码中,并确保 .env 不会提交到公开仓库。

3.2 模型与调用方案选择

XLabs-AI/flux-RealismLora 是 XLabs 团队为 FLUX.1-dev 文生图模型训练的真实感 LoRA 适配器,专门用于提升出图的照片级真实感。直接调用它的 Serverless Inference API 时,LoRA 需要与基础模型组装,冷启动慢、参数控制也不直观。

经过调研,我选择了更工程化的路线:通过社区发布的 Space 应用 damarjati/FLUX.1-RealismLora 来调用该模型——这个 Space 已经封装好完整的 LoRA 推理链路,并对外暴露了 /run_lora 接口,支持直接调节 cfg_scalestepsseedwidthheightlora_scale 等关键参数。客户端方面使用官方 Python SDK gradio_client,将 Gradio 应用当作可编程的 API 使用,前端则基于 Gradio 搭建交互界面。

3.3 环境准备

pip install gradio gradio_client python-dotenv

项目根目录创建 .env 文件保存密钥与目标 Space:

HF_TOKEN=hf_********************(秘密 三连后可查看:D)
HF_SPACE_ID=damarjati/FLUX.1-RealismLora

3.4 接口探测与排错

第一次直接调用时,gradio_client 抛出的异常字符串中包含 404 Not Found——说明我猜测的接口名并不存在。排错思路是:

  1. 打开 Space 页面底部的 Use via API 面板,查看该应用实际暴露的接口列表;
  2. 确认正确的端点为 /run_lora,并核对它的参数签名(promptcfg_scalestepsrandomize_seedseedwidthheightlora_scale);
  3. 修正代码后重新调用,成功返回图像。

💡 这次排错让我体会到:调用第三方 API 时,“接口名与参数签名必须与提供方文档一致"是第一步要确认的事情,盲猜接口是走弯路的主要原因。

3.5 完整实现代码

app.py

import os
import random
import gradio as gr
from gradio_client import Client
from dotenv import load_dotenv

# 加载同目录下的 .env 文件
load_dotenv(override=True)
SPACE_ID = os.getenv("HF_SPACE_ID", "").strip()
HF_TOKEN = os.getenv("HF_TOKEN", "").strip()

# 初始化 Hugging Face Space 客户端
if not SPACE_ID:
    print("警告: .env 文件中未配置 HF_SPACE_ID!")

try:
    client = Client(SPACE_ID, token=HF_TOKEN or None, verbose=False)
except Exception as e:
    client = None
    print(f"客户端初始化失败: {e}")

def generate_image_stable(prompt):
    if not prompt.strip():
        return None, "❌ 提示词不能为空!"
    if client is None:
        return None, "❌ Space Client 未初始化,请检查 .env 中的 SPACE_ID 设置。"

    try:
        seed = random.randint(0, 2 ** 32 - 1)
        steps = 28
        lora_scale = 0.85

        # 调用探测到的正确 API 接口 /run_lora
        result = client.predict(
            prompt=prompt,
            cfg_scale=3.5,
            steps=steps,
            randomize_seed=False,
            seed=seed,
            width=1024,
            height=1024,
            lora_scale=lora_scale,
            api_name="/run_lora"
        )

        # /run_lora 接口返回的是 (image_dict, seed) 元组
        if isinstance(result, (list, tuple)) and len(result) >= 1:
            image_value = result[0]
        else:
            image_value = result

        if isinstance(image_value, dict):
            image_path = image_value.get("path")
        elif hasattr(image_value, "path"):
            image_path = image_value.path
        else:
            image_path = str(image_value)

        return image_path, f"✅ API调用成功 (HTTP Status: 200 OK)\n参数记录 -> 步数: {steps} | LoRA权重: {lora_scale} | 种子: {seed}"

    except Exception as e:
        error_msg = str(e)
        return None, f"❌ API调用失败\n错误详情: {error_msg}"

# --- 构建 Gradio 前端 ---
with gr.Blocks(theme=gr.themes.Soft()) as demo:
    gr.Markdown("# FLUX-RealismLora 真实世界图像生成器")
    gr.Markdown("软件工程作业 - 采用 gradio_client 架构的稳定版 API 调用")

    with gr.Row():
        with gr.Column():
            prompt_input = gr.Textbox(
                label="请输入提示词 (Prompt)",
                placeholder="例如: A hyper-realistic macro photography of a cat...",
                lines=4
            )
            generate_btn = gr.Button("🚀 调用云端 Space 生成图像", variant="primary")

        with gr.Column():
            output_image = gr.Image(label="API返回的生成结果", type="filepath")
            status_output = gr.Textbox(label="运行状态与参数记录", interactive=False)

    generate_btn.click(
        fn=generate_image_stable,
        inputs=prompt_input,
        outputs=[output_image, status_output]
    )

if __name__ == "__main__":
    demo.launch(server_name="127.0.0.1", server_port=7860)

实现要点:

要点 说明
密钥管理 通过 .env + python-dotenv 加载 Token,源码中不出现明文密钥
随机种子 每次生成随机 seed(0 ~ 2³²-1),并在状态栏回显,保证结果可复现
参数控制 steps=28cfg_scale=3.5lora_scale=0.851024×1024,在真实感与耗时之间取得平衡
返回值解析 /run_lora 返回 (image_dict, seed) 元组,做了类型兼容处理
状态回显 前端状态栏实时显示调用成功/失败信息与完整参数记录
异常兜底 客户端初始化失败、空提示词、调用异常三种情况均有明确的错误提示

3.6 前端交互界面

运行 python app.py 后,Gradio 自动在浏览器打开 http://127.0.0.1:7860,交互流程为:

输入提示词 → 点击 🚀 调用云端 Space 生成图像 按钮 → 后端经 gradio_client 调用云端 Space 的 /run_lora 接口 → 图像返回并显示在页面右侧,同时状态栏输出调用记录。

📷 6fb0c28bc4c89264cb080e3ddff6a92c

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

作业要求生成"最贴近真实世界的图像",因此我以猫咪微距摄影为主题,经历了三轮提示词迭代。

第 1 轮:初步尝试

a cat sitting on a wooden table
  • 效果与问题:画面偏插画感,毛发细节模糊,背景杂乱。
  • 修改思路:加入写实摄影关键词,改用微距视角。

第 2 轮:引入摄影参数

A hyper-realistic macro photography of a cat, detailed fur texture,
natural window light, 85mm lens, f/1.8, shallow depth of field
  • 效果与问题:真实感明显提升,但光影平淡,缺乏氛围。
  • 修改思路:补充具体的光线与场景细节,用镜头参数强化摄影感。

第 3 轮:确定最终提示词

RAW photo, extreme macro shot of a tabby cat face, golden hour sunlight
through window, dust particles floating in light beam, sharp whiskers,
detailed iris and fur texture, 85mm f/1.8, ultra detailed, 8k
  • 效果与问题:细节、光影与质感已接近真实摄影,最终选定。
  • 修改思路:确定最终提示词。

设计心得总结:

  1. hyper-realistic / RAW photo 等词直接决定出图风格基调;
  2. 镜头参数(85mm lens, f/1.8, shallow depth of field)能显著增强"摄影感";
  3. 具体的光影细节(golden hour 阳光、光束中的尘埃、锐利的胡须)比堆砌形容词更能提升真实感与叙事性;
  4. FLUX 模型对自然语言理解较强,无需刻意使用标签式堆词。

3.8 最终生成结果

📷 8da765e061da96666625c301002ecb75

📷 80f7a5473eac86847a0df07a83d4995e

3.9 API 调用体验与心得

  1. 模型即服务 的思维转变:以往跑视觉模型需要配置 CUDA、管理权重文件、处理显存溢出;而这次通过 gradio_client 直接调用了云端 Space 中封装好的 Flux 真实感模型。模型能力真正变成了可组合的基础设施,一行 client.predict() 就完成了从提示词到 1024×1024 图像的完整推理;
  2. 接口探测是调用第三方服务的基本功:从 404 报错到通过 Space 的 "Use via API" 面板确认 /run_lora 端点与参数签名,我体会到"接口名与参数必须与文档一致"是第一步要确认的事;
  3. 参数即控制力seed 让结果可复现,lora_scale 调节真实感强度,steps 在质量与耗时之间权衡——理解每个参数的含义,才算真正"驾驭"了模型;
  4. 密钥安全意识.env 分离密钥、源码零明文,是从本次作业开始养成的好习惯;
  5. 排错经验:调用过程中遇到过 404(接口名错误)与客户端初始化失败等问题,学会通过异常字符串与状态栏回显快速定位,是这次作业最有价值的收获之一。

四、技能树与技术偏好自我评估

在深入软件工程课程之前,我对自己的技术栈和能力边界进行了梳理。

4.1 已具备的专业知识与能力 ✅

能力 具体内容
能力 A:深度学习模型构建与调试 熟练使用 Python 与 PyTorch,能够独立配置 CUDA 等计算依赖;深度研读过 UNet、Swin Transformer 等视觉经典架构。
能力 B:前沿视觉算法的工程部署 熟悉 Linux 服务器环境,能熟练通过 MobaXterm 与 SSH 进行远程运维及 Conda 环境管理。在伪装目标检测(尤其是 Open-vocabulary 领域)有实战经验,成功部署跑通了 OVCoser、BGNet 等前沿模型。
能力 C:第三方云端 API 交互与排错 具备对接云端算力平台的能力,能使用 gradio_client 接入 Hugging Face Spaces 构建可视化 Web 原型(本次作业即为一次完整实践);解决过网络劫持(SSL 错误)、接口抓包分析等工程化排错问题。

4.2 感兴趣的技术方向 🎯

  • 多模态视觉语言模型(Vision-Language Models)的深度研发;
  • 探索将计算机视觉与深度学习技术应用于伪装目标检测

4.3 当前欠缺的核心能力 ❌

欠缺能力 具体短板
欠缺能力 A:系统性的软件生命周期管理 目前写代码更多停留在“实现算法脚本"的单兵作战阶段,缺乏对需求分析、架构设计、测试用例编写的系统认知。
欠缺能力 B:团队协同与规范化开发 极度缺乏大型项目的 Git 分支管理协同经验,对敏捷开发(Agile)、代码审查(Code Review)流程较为陌生。
欠缺能力 C:全栈工程化落地架构 能够搭建简单的 Gradio 演示界面,但在企业级后端框架、数据库高并发设计及前后端分离部署上仍是短板。

五、代码量统计与学期目标

项目 说明
当前代码量 4,000 行
学期目标 学期末累计达到 10,000 行 🚀

六、课程期待与希望获得的收获

🎓 最期待学习的知识

未来希望能进一步深化在大视觉语言模型领域的理论储备,并提升大型 AI 项目的工程化落地与全栈交互能力

🤝 希望获得的收获

  • 通过课程的团队项目,真正体验一次标准软件企业的开发节奏
  • 产出一个不仅能“跑通",更能稳定运行、具备完整文档和测试覆盖率的作品;
  • 结交志同道合的队友,提升自己的沟通与技术协作能力

七、AI 工具辅助生成的学习指南及自我分析

💡 我选择 Gemini 作为本次的 AI 工具,让它生成了一份《简要软件工程课程学习指南》。

📘 AI 生成:软件工程 4 步学习指南

Step 1|切忌直接动手写代码
将 40% 的时间分配给需求分析与原型设计,使用 UML 或流程图理清系统逻辑,这能避免后期的灾难性重构。

Step 2|拥抱版本控制(Git)
尽早掌握 Git Flow 工作流。强制自己每次只提交一个独立功能(Atomic Commits),并写清楚 Commit Message。

Step 3|防御性编程与测试驱动
不要相信用户的任何输入。尝试在编写核心业务逻辑前,先写好单元测试(TDD 思想),确保代码修改不会引发连锁崩溃。

Step 4|重视复盘与文档
代码是写给机器的,但软件是交接给人的。保持 README 的更新,使用 Swagger 等工具自动生成 API 文档,项目结束后的复盘比敲代码本身带来的成长更多。

🔍 我的分析

维度 分析
是否合理 这份指南比较合理,一针见血地指出了我们计算机学生常犯的错误——“重代码,轻设计"。它涵盖了设计、协作、质量控制、文档四个软件工程最核心的维度。
能否带来帮助 帮助极大。特别是第一点“切忌直接动手",精准命中了我的盲区——我以往在调试视觉模型时,习惯于上来就改脚本参数,这在大型软件开发中是致命的。这份指南为我接下来的团队大作业提供了一个宏观的规范框架,提醒我在冲动敲代码前,先和团队把需求文档和 API 接口定义梳理清楚,有助于我从“算法调参侠"真正向“软件工程师"蜕变。

八、博客园 Markdown 编辑器设置与后台截图

按照作业要求,我已将博客园编辑器切换为 Markdown 编辑器

  1. 登录博客园 → 管理 → 选项;
  2. 在“编辑器”处选择 Markdown
  3. 保存设置后,新建随笔即可直接使用 Markdown 语法写作。

📷 image


结语

✍️ 本次作业让我完成了三件事:把散落的账号与个人主页搭建成“线上的自己";用 gradio_client + Gradio 打通了第一次完整的“模型即服务"交互链路;并在随笔中把“会什么、缺什么、想学什么"写清楚。

站在软件工程课程的起点,期待学期末回看这篇随笔时,欠缺的能力已变成新的技能点。

如果屏幕前的你读到了这里,那我向你表达由衷的感谢!!!

image

GitHub 主页:https://github.com/rohitpyarepur2006-coder
博客园地址:https://www.cnblogs.com/imao/
联系邮箱:2432417639@qq.com

posted @ 2026-09-10 17:22  爱昴  阅读(11)  评论(0)    收藏  举报