Emortry

Emortry

个人博客。软件工程研究生,学习方向是人工智能。这里主要记录模型训练、计算机视觉、网络与自托管实践,也会留下失败过程和重新理解问题的时刻。

持续学习中,最近关注 LLM × 知识图谱与开放词汇分割

笔记目录

3 篇
LLM训练记录

LoRA 微调 Qwen2.5:数据整理比调参数更早

一次医学问答模型微调记录:从扁平数据到 ShareGPT 多轮格式,再到显存可控的本地训练。

阅读正文 ↓
CVPyTorch

DeepLabV3 语义分割中的几个工程细节

模型结构之外,掩码处理、辅助分类器、混合精度和推理尺度同样会影响最终结果。

阅读正文 ↓
EDGE AI树莓派

把车牌识别模型放到树莓派上

毕业设计里最有意思的部分,是让识别模型、摄像头、客户端和数据库真正连起来。

阅读正文 ↓

笔记正文

学习记录,不定期修订
LLMLORADATASET

LoRA 微调 Qwen2.5:数据整理比调参数更早

这篇笔记整理一次医学问答模型实验。重点不在罗列参数,而是记录从数据格式、训练配置到验证方法的完整思路。

1. 先确定模型应该怎样回答

垂直问答数据常见的问题不是数量不够,而是同一字段里混有标题、问题、解释和答案。直接送进训练会让模型学到不稳定的格式。我的做法是先统一角色,把用户描述放进 human,把回答放进 gpt,再转换为 ShareGPT 多轮结构。

{
  "conversations": [
    {"from": "human", "value": "用户问题"},
    {"from": "gpt", "value": "结构化回答"}
  ]
}

清洗时需要检查空字段、重复样本、异常长文本和明显冲突的答案。训练集与验证集还要按来源或主题划分,避免相似问答同时落入两边,使验证结果看起来过于乐观。

2. LoRA 解决的是训练成本问题

本次实验以 Qwen2.5-1.5B 指令模型为基座,LoRA 的 rank 设为 8。它通过低秩矩阵学习任务增量,基座参数保持冻结,因此需要训练和保存的参数更少。rank 并不是越大越好:容量增加的同时也会提高显存占用,并可能让模型更快记住小数据集。

  • 使用 BF16,在硬件支持时保留更大的数值范围。
  • 使用动态 Padding,让每个批次只补齐到当前最长样本。
  • 显存不足时优先考虑梯度累积、减小序列长度,再调整 batch size。
  • 固定随机种子并保存训练配置,保证实验之间能够比较。

3. 验证不能只看训练 loss

训练 loss 下降只能说明模型更接近训练标签。实际验证还要准备一组固定问题,分别检查事实一致性、格式遵循、拒答边界和回答稳定性。医学问答尤其需要明确:模型输出只能用于技术验证,不能替代医生判断。

下一步:为固定测试集记录基座模型和微调模型的并排回答,按“正确性、完整性、幻觉、格式”四项人工评分,再决定是否继续训练。
返回目录 ↑
COMPUTER VISIONPYTORCHCOCO

DeepLabV3 语义分割中的几个工程细节

语义分割是逐像素分类。模型结构很重要,但数据掩码、损失计算、评估指标和推理方式同样决定实验是否可信。

1. Dataset 的关键是图像与掩码同步

我使用 pycocotools 处理 COCO 2014 标注,自定义 Dataset 输出图像和对应掩码。裁剪、缩放、翻转等空间变换必须同时应用到两者;图像通常使用双线性插值,而类别掩码应使用最近邻插值,否则类别编号会被插值成不存在的值。

训练前可以随机抽取若干样本,把掩码以半透明颜色叠加到原图上。这一步很朴素,却能很快发现类别映射、尺寸和增强流程中的错误。

2. 主分类器与辅助分类器

DeepLabV3 通过空洞卷积和 ASPP 聚合不同尺度的上下文信息。使用带辅助分类器的实现时,训练损失通常由主输出和辅助输出共同组成;辅助分支为中间层提供更直接的监督,推理时只保留主输出。

  • 优化器使用 SGD 与 Momentum,并明确记录学习率策略。
  • AMP 通过 autocast 与梯度缩放减少显存,但需要留意 NaN 和溢出。
  • 对类别极不均衡的数据,除了整体准确率,还应关注各类别 IoU。

3. 用 mIoU 理解结果,而不是只看像素准确率

大面积背景很容易把像素准确率“抬高”。mIoU 会分别计算预测区域与真实区域的交并比,再对类别取平均,更适合观察小目标和困难类别。评估时还需要统一 ignore index、输出尺寸和类别编号。

多尺度推理会将不同缩放比例的预测恢复到原尺寸后再融合,通常能改善大小目标之间的平衡,但计算量也会成倍增加。它适合研究阶段比较性能上限;部署时则应重新测量延迟。

下一步:保存每类 IoU 和混淆矩阵,并建立一组固定可视化样本。数值指标告诉我“哪里变了”,可视化帮助判断“为什么变”。
返回目录 ↑
EDGE AIRASPBERRY PITCP

把车牌识别模型放到树莓派上

这个毕业设计由车牌检测、字符识别、边缘端推理、网络通信和桌面客户端组成。真正的难点,是让各模块在资源有限的设备上稳定配合。

1. 将任务拆成检测与识别

系统首先使用 YOLOv8 从画面中定位车牌,再将裁剪后的车牌区域交给 LPRNet 识别字符。两阶段方案便于分别训练和排查:漏掉车牌通常属于检测问题,定位正确但字符错误则需要检查裁剪质量、字符模型或训练数据。

训练数据来自 CCPD 和公开的中国车牌数据集。除了总体准确率,还应按光照、角度、遮挡和车牌尺寸建立困难样本集合,避免平均指标掩盖真实场景中的失败。

2. 边缘部署首先受到资源限制

树莓派 4B 的算力和内存都有限。部署前应固定输入尺寸、控制摄像头帧率,并避免为每一帧重复创建模型或分配大块内存。实时系统也不一定要处理摄像头产生的全部帧:在满足业务响应速度的前提下主动丢帧,往往比让队列不断堆积更稳定。

  • 启动时加载模型并完成一次预热,避免首次请求延迟过高。
  • 分别记录采集、检测、识别和通信耗时,确定真正的瓶颈。
  • 识别结果保留置信度和时间戳,便于后续排查误识别。

3. TCP 传输需要定义清晰的消息边界

TCP 提供字节流,并不保留一次发送对应一次接收的边界。应用层需要约定长度字段或分隔符,并处理拆包、粘包、超时和断线重连。PyQt 客户端还要避免在界面线程中执行阻塞网络操作,否则连接稍慢就会让界面失去响应。

数据库记录可以包含时间、识别文本、置信度和图像路径。原始画面不必无限保留,可按容量设置清理规则,同时避免把数据库账号和服务器地址直接写入客户端代码。

这个项目让我从“模型能运行”走向“系统能连续完成任务”。部署、通信和故障处理并不是模型之外的杂事,而是最终体验的一部分。
返回目录 ↑

项目索引

从模型到系统
01

医学问答模型微调

清洗医疗问答数据,使用 LoRA 微调 Qwen2.5-1.5B,完成本地 WebUI 交互。

Qwen2.5 / LoRA / BF16
02

DeepLabV3 图像语义分割

构造 COCO 训练数据,使用 AMP 训练并实现多尺度推理。

PyTorch / ResNet-101
03

树莓派车牌识别系统

车牌定位与字符识别、树莓派部署、PyQt 客户端和数据库记录。

YOLOv8 / LPRNet / Pi
04

轻量级 TCP/IP 协议栈

基于 pcap 依次实现以太网帧、ARP、IP、ICMP、UDP 与 TCP 核心功能。

C/C++ / pcap / Network