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

哈喽这里是爱昴
📅 2026 年秋季学期 · 软件工程课程 · 第 1 篇随笔
开课第一周,我把本次作业的三个板块——账号准备、Hugging Face API 调用、GitHub 个人主页搭建逐一完成,并借这篇随笔对自身的技术栈与能力边界做一次完整盘点。知所长,亦知所短,方能有的放矢。
一、准备工作:三大账号与班级就绪
1.1 GitHub 账号
- 在 GitHub 官网 注册账号,完善了头像、个人简介(Bio)等各项个人信息。
- 用户名:
rohitpyarepur2006-coder - 主页地址:https://github.com/rohitpyarepur2006-coder
1.2 博客园账号
- 在 博客园 建立个人技术博客,完善了昵称(爱昴)、头像等个人信息,并根据个人喜好设置了博客皮肤与页面样式。
- 博客地址:https://www.cnblogs.com/imao/
1.3 关注老师与助教的博客
| 身份 | 姓名 |
|---|---|
| 任课老师 | 黄兆武 |
| 助教 | 李怡涵 |
| 助教 | 焦圣蒙 |
1.4 加入班级博客
已加入博客园班级 H202601软件工程与软件工程实践,并使用实名制确认班级成员身份。
✅ 至此,准备工作全部完成。
二、GitHub 个人主页搭建
两种方案中,我选择了方案一:创建个人资料自述文件(Profile README)。理由有三:
- 零部署成本,无需额外维护站点构建流程;
- README 天然使用 Markdown,与博客写作技能互通;
- 访客进入我的 GitHub 主页即可直接看到完整介绍,传播路径最短。
2.1 搭建步骤
- 在 GitHub 上新建一个与用户名完全相同的仓库:
rohitpyarepur2006-coder/rohitpyarepur2006-coder; - 创建时勾选 "Add a README file"(GitHub 会提示这是个人主页专用仓库);
- 在仓库根目录编辑
README.md,用 Markdown 撰写个人介绍; - 提交后,该内容自动展示在 GitHub 个人主页最上方。
📷 
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 实验室,在开放词汇图像分割等垂直领域产出有价值的学术成果,为未来的科研或高端算法岗位打下坚实基础。
📷 
三、Hugging Face API 调用:Flux 生成真实感图像
本部分作业要求:注册 Hugging Face 获取 API,调用 XLabs-AI/flux-RealismLora 模型生成一张最贴近真实世界的图像,并在调用代码基础上结合前端接口实现交互生成。
3.1 注册与获取 API Token
- 在 Hugging Face 官网 注册账号并完成邮箱验证;
- 进入 Settings → Access Tokens → New token;
- 权限选择 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_scale、steps、seed、width、height、lora_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——说明我猜测的接口名并不存在。排错思路是:
- 打开 Space 页面底部的 Use via API 面板,查看该应用实际暴露的接口列表;
- 确认正确的端点为
/run_lora,并核对它的参数签名(prompt、cfg_scale、steps、randomize_seed、seed、width、height、lora_scale); - 修正代码后重新调用,成功返回图像。
💡 这次排错让我体会到:调用第三方 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=28、cfg_scale=3.5、lora_scale=0.85、1024×1024,在真实感与耗时之间取得平衡 |
| 返回值解析 | /run_lora 返回 (image_dict, seed) 元组,做了类型兼容处理 |
| 状态回显 | 前端状态栏实时显示调用成功/失败信息与完整参数记录 |
| 异常兜底 | 客户端初始化失败、空提示词、调用异常三种情况均有明确的错误提示 |
3.6 前端交互界面
运行 python app.py 后,Gradio 自动在浏览器打开 http://127.0.0.1:7860,交互流程为:
输入提示词 → 点击 🚀 调用云端 Space 生成图像 按钮 → 后端经 gradio_client 调用云端 Space 的 /run_lora 接口 → 图像返回并显示在页面右侧,同时状态栏输出调用记录。
📷 
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
- 效果与问题:细节、光影与质感已接近真实摄影,最终选定。
- 修改思路:确定最终提示词。
设计心得总结:
hyper-realistic/RAW photo等词直接决定出图风格基调;- 镜头参数(
85mm lens, f/1.8, shallow depth of field)能显著增强"摄影感"; - 具体的光影细节(golden hour 阳光、光束中的尘埃、锐利的胡须)比堆砌形容词更能提升真实感与叙事性;
- FLUX 模型对自然语言理解较强,无需刻意使用标签式堆词。
3.8 最终生成结果
📷 
📷 
3.9 API 调用体验与心得
- 模型即服务 的思维转变:以往跑视觉模型需要配置 CUDA、管理权重文件、处理显存溢出;而这次通过
gradio_client直接调用了云端 Space 中封装好的 Flux 真实感模型。模型能力真正变成了可组合的基础设施,一行client.predict()就完成了从提示词到 1024×1024 图像的完整推理; - 接口探测是调用第三方服务的基本功:从 404 报错到通过 Space 的 "Use via API" 面板确认
/run_lora端点与参数签名,我体会到"接口名与参数必须与文档一致"是第一步要确认的事; - 参数即控制力:
seed让结果可复现,lora_scale调节真实感强度,steps在质量与耗时之间权衡——理解每个参数的含义,才算真正"驾驭"了模型; - 密钥安全意识:
.env分离密钥、源码零明文,是从本次作业开始养成的好习惯; - 排错经验:调用过程中遇到过 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 编辑器:
- 登录博客园 → 管理 → 选项;
- 在“编辑器”处选择 Markdown;
- 保存设置后,新建随笔即可直接使用 Markdown 语法写作。
📷 
结语
✍️ 本次作业让我完成了三件事:把散落的账号与个人主页搭建成“线上的自己";用 gradio_client + Gradio 打通了第一次完整的“模型即服务"交互链路;并在随笔中把“会什么、缺什么、想学什么"写清楚。
站在软件工程课程的起点,期待学期末回看这篇随笔时,欠缺的能力已变成新的技能点。
如果屏幕前的你读到了这里,那我向你表达由衷的感谢!!!

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

浙公网安备 33010602011771号