<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh_CN">
  <title>Mengdie&apos;s World</title>
  <subtitle>A blog</subtitle>
  <link href="http://mblog.linghantech.top/" rel="alternate" type="text/html"/>
  <link href="http://mblog.linghantech.top/atom.xml" rel="self" type="application/atom+xml"/>
  <id>http://mblog.linghantech.top/</id>
  <updated>2026-10-07T00:00:00.000Z</updated>
  <entry>
    <title>给 Qwen-1.5B 装上耳朵和嘴巴：情感语音对话系统搭建实操</title>
    <link href="http://mblog.linghantech.top/posts/%E7%BB%99qwen-15b%E8%A3%85%E4%B8%8A%E8%80%B3%E6%9C%B5%E5%92%8C%E5%98%B4%E5%B7%B4%E6%83%85%E6%84%9F%E8%AF%AD%E9%9F%B3%E5%AF%B9%E8%AF%9D%E7%B3%BB%E7%BB%9F%E6%90%AD%E5%BB%BA%E5%AE%9E%E6%93%8D/" rel="alternate" type="text/html"/>
    <id>http://mblog.linghantech.top/posts/%E7%BB%99qwen-15b%E8%A3%85%E4%B8%8A%E8%80%B3%E6%9C%B5%E5%92%8C%E5%98%B4%E5%B7%B4%E6%83%85%E6%84%9F%E8%AF%AD%E9%9F%B3%E5%AF%B9%E8%AF%9D%E7%B3%BB%E7%BB%9F%E6%90%AD%E5%BB%BA%E5%AE%9E%E6%93%8D/</id>
    <published>2026-10-07T00:00:00.000Z</published>
    <updated>2026-10-07T00:00:00.000Z</updated>
    <summary>记录第一次给微调好的 Qwen-1.5B 模型接入 ASR、SER、TTS，搭建能听、能感受、能带情绪说话的情感语音对话系统。个人开发者踩坑向，级联架构真香。</summary>
    <content type="html"><![CDATA[<h1>给 Qwen-1.5B 装上耳朵和嘴巴：情感语音对话系统搭建实操</h1>
<blockquote>
<p>结论：<strong>不要想着从头训练一个端到端语音大模型，老老实实玩“级联架构”——现成的 ASR + SER + 微调 LLM + 现成的 TTS，胶水代码就是最优解。</strong>（==本人已泪目测试！1.5B 模型真的有点笨，但搭起来是真香==）</p>
</blockquote>
<p>之前用 Qwen-1.5B 微调了一个文字对话模型，放在 <code>AI/AQing/</code> 目录下，有 <code>aqing_6000.json</code> 和 <code>aqing_emotion.jsonl</code> 两份数据，权重在 <code>qwen-1.5b</code> 里。它能打字聊天，但我想让它更像一个“人”：能听见我说话，能感受到我语气里的情绪，回复时还能带着情绪思考，最后用带情感的声音说出来。</p>
<p>于是就有了这次实操。全程基于级联架构，硬件门槛不高，单卡 6GB 显存也能跑（因为 LLM 只有 1.5B，语音模型也都不大）。下面把整个过程和踩坑记录整理出来，零基础也能跟着搭。但是目前只实现了==stt==和==stt-&gt;llm==的部分</p>
<hr />
<h2>1. 硬件与环境要求</h2>
<h3>最低配置</h3>
<ul>
<li><strong>GPU</strong>：NVIDIA 显卡，显存 ≥ 6GB（如 RTX 4050 Laptop）——跑 1.5B 的 LLM 和语音模型足够</li>
<li><strong>内存</strong>：16GB 以上</li>
<li><strong>硬盘</strong>：至少 30GB 空闲（模型多，ASR/SER/TTS 都要下）</li>
<li><strong>系统</strong>：Windows / Linux 均可，Mac 也能凑合</li>
</ul>
<h3>推荐配置</h3>
<ul>
<li><strong>GPU</strong>：RTX 3090 / 4090（24GB 显存）——可以同时加载多个模型，流式更顺畅</li>
<li><strong>内存</strong>：32GB</li>
<li><strong>硬盘</strong>：NVMe SSD</li>
</ul>
<h3>如果没有 GPU</h3>
<ul>
<li>云平台：AutoDL、恒源云、Kaggle（免费）、Google Colab（免费）</li>
<li>租一张 RTX 4090，约 ¥2/小时，跑通整个流程没问题</li>
</ul>
<h3>软件环境</h3>
<ul>
<li><strong>Python 3.10</strong>（==不要用 3.13，语音库兼容性会让你崩溃==）</li>
<li><strong>CUDA 12.1 / 12.4</strong>（取决于显卡驱动）</li>
<li><strong>PyTorch</strong>（必须装 CUDA 版，不要装 CPU 版）</li>
<li><strong>FunASR</strong>、<strong>emotion2vec</strong>、<strong>GPT-SoVITS / CosyVoice</strong>、<strong>LLaMA-Factory</strong></li>
</ul>
<blockquote>
<p>==Mac==也可以跑，但 MPS 加速对某些语音模型支持一般，建议还是 N 卡。</p>
</blockquote>
<hr />
<h2>2. 总体架构：级联系统是最务实的方案</h2>
<p>别想着一步到位搞端到端语音大模型，那个训练成本和数据量个人开发者扛不住。最靠谱的是 <strong>“级联架构”</strong>，把任务拆给专业模型，你的 Qwen 当大脑。</p>
<pre><code>用户语音输入
    ↓
[1. ASR 语音识别] → 文本
    ↓
[2. SER 语音情感识别] → 情绪标签
    ↓
[3. LLM（你的Qwen微调模型）] → 情绪思考 + 情感回复
    ↓
[4. TTS 情感语音合成] → 带有情绪的语音输出
</code></pre>
<p>每个模块都可以独立替换和优化，你的 Qwen 模型完美接入现有技术栈。级联虽然串联模块多，但工程逻辑清晰，调试维护比端到端可控得多。</p>
<hr />
<h2>3. 模型选择与下载</h2>
<h3>3.1 ASR 语音识别：让她“听到”</h3>
<ul>
<li><strong>FunASR</strong>（阿里开源）：中文效果极强，支持标点恢复和流式识别。Paraformer-large 在 AISHELL 测试集字错率仅 1.95%，AISHELL-2 为 2.85%。==首选！==</li>
<li><strong>faster-whisper</strong>：极速且准确，英文强，中文也不错。</li>
</ul>
<h3>3.2 SER 语音情感识别：让她“感受情绪”</h3>
<ul>
<li><strong>emotion2vec</strong>（阿里达摩院）：开源，效果极好，输出愤怒、高兴、悲伤等情绪标签。</li>
<li>备选方案：不单独训练 SER，直接让 LLM 从 ASR 文本判断情绪。但语音中的叹气、哼唱、咬牙切齿 ASR 会丢失，所以最佳实践还是 <strong>先做 SER 再把情绪标签喂给 LLM</strong>。</li>
</ul>
<h3>3.3 TTS 情感语音合成：让她“说出带情绪的话”</h3>
<ul>
<li><strong>GPT-SoVITS</strong>：最火，支持情感参考音频。给几秒到几分钟的目标音色（开心、生气等），模型就能模仿对应情绪。</li>
<li><strong>CosyVoice</strong>（阿里开源）：支持指令控制情感和方言，CosyVoice 2 首包延迟低至 150ms，原生流式解码，==实时场景首选==。</li>
</ul>
<h3>3.4 LLM：你的 Qwen-1.5B 微调模型</h3>
<p>就用你 <code>AI/AQing/qwen-1.5b</code> 里的模型，继续用 LoRA 做情感推理微调。</p>
<p><strong>下载方式</strong>（国内镜像）：</p>
<pre><code>$env:HF_ENDPOINT = "https://hf-mirror.com"
pip install huggingface_hub
python -c "from huggingface_hub import snapshot_download; snapshot_download('Qwen/Qwen2.5-1.5B-Instruct', local_dir='./qwen-1.5b')"
</code></pre>
<blockquote>
<p>语音模型去各自 GitHub 下就行，FunASR、emotion2vec、GPT-SoVITS 都有详细说明。==国内网速不行就挂代理或者用魔塔==。</p>
</blockquote>
<hr />
<h2>4. 数据准备（最关键）</h2>
<p>模型效果 ==<strong>80%</strong>== 取决于数据质量。你要让 LLM 学会“对用户语气进行思考”，就得构造带 <strong>思维链（CoT）</strong> 的训练数据。</p>
<h3>格式示例（ShareGPT + 情绪思考）</h3>
<pre><code>{
  "conversations": [
    {
      "from": "human",
      "value": "你今天怎么又迟到了！（语音输入识别：你今天怎么又迟到了！，语音情感识别：愤怒）"
    },
    {
      "from": "gpt",
      "value": "〖情绪思考〗用户现在的语气非常愤怒，因为我又迟到了，他/她可能感到不被尊重。我需要先道歉，安抚情绪，并给出合理的解释。\n〖回复〗（带着歉意和温柔的语气）对不起，让你久等了，路上遇到一点突发状况，我保证下次一定提前出门，你别生气了好不好？"
    }
  ]
}
</code></pre>
<p>推理时可以把 <code>〖情绪思考〗</code> 隐藏，只展示 <code>〖回复〗</code>，或者直接通过 TTS 读出思考结果来指导语调。</p>
<h3>数据要求</h3>
<ul>
<li><strong>数量</strong>：500～5000 条。1.5B 模型能力有限，聚焦情感对话，质量比数量重要。</li>
<li><strong>质量</strong>：回答自然、多样，不要模板化。</li>
<li><strong>多样性</strong>：覆盖不同情绪、不同问法、不同长度。</li>
<li><strong>格式统一</strong>：每条字段一致。</li>
</ul>
<blockquote>
<p>手工写会搞一辈子，<strong>建议用大模型生成后人工筛选</strong>，效率高。公开数据集（Belle、Firefly）也可以拿来改。</p>
</blockquote>
<h3>数据注册（LLaMA-Factory）</h3>
<p>在 <code>data/dataset_info.json</code> 中注册：</p>
<pre><code>{
  "aqing_emotion": {
    "file_name": "aqing_emotion.jsonl",
    "formatting": "sharegpt",
    "columns": { "messages": "conversations" },
    "tags": {
      "role_tag": "from",
      "content_tag": "value",
      "user_tag": "human",
      "assistant_tag": "gpt"
    }
  }
}
</code></pre>
<hr />
<h2>5. 训练方式：LoRA 微调</h2>
<h3>5.1 安装 LLaMA-Factory</h3>
<pre><code>pip install llamafactory -i https://mirrors.aliyun.com/pypi/simple
</code></pre>
<h3>5.2 启动 Web UI</h3>
<pre><code>llamafactory-cli webui
</code></pre>
<p>浏览器打开 <code>http://localhost:7860</code>。看到 <code>Running on local URL: http://0.0.0.0:7860</code> 就成功了。</p>
<h3>5.3 关键参数配置</h3>
<table>
<thead>
<tr>
<th>参数</th>
<th>推荐值</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>模型路径</td>
<td><code>./qwen-1.5b</code></td>
<td>你下载的模型目录</td>
</tr>
<tr>
<td>微调方法</td>
<td><code>lora</code></td>
<td>只训练适配器</td>
</tr>
<tr>
<td>量化等级</td>
<td><code>none</code>（6GB 显存）或 <code>4-bit</code></td>
<td>4-bit 需装 bitsandbytes</td>
</tr>
<tr>
<td>对话模板</td>
<td><code>qwen</code></td>
<td>必须匹配模型</td>
</tr>
<tr>
<td>训练阶段</td>
<td><code>Supervised Fine-Tuning</code></td>
<td>监督微调</td>
</tr>
<tr>
<td>数据集</td>
<td><code>aqing_emotion</code></td>
<td>你注册的名称</td>
</tr>
<tr>
<td>学习率</td>
<td><code>3e-5</code></td>
<td>不要太高</td>
</tr>
<tr>
<td>训练轮数</td>
<td><code>3</code></td>
<td>数据少可增加到 5</td>
</tr>
<tr>
<td>批处理大小</td>
<td><code>1</code></td>
<td>显存小就设 1</td>
</tr>
<tr>
<td>梯度累积</td>
<td><code>8</code></td>
<td>补偿 batch size</td>
</tr>
<tr>
<td>截断长度</td>
<td><code>1024</code></td>
<td>省显存</td>
</tr>
<tr>
<td>计算类型</td>
<td><code>bf16</code></td>
<td>混合精度</td>
</tr>
<tr>
<td>LoRA 秩</td>
<td><code>8</code></td>
<td>常用值</td>
</tr>
<tr>
<td>LoRA 缩放系数</td>
<td><code>16</code></td>
<td>常用值</td>
</tr>
<tr>
<td>LoRA 作用模块</td>
<td><code>all</code></td>
<td>全部线性层</td>
</tr>
<tr>
<td>输出目录</td>
<td><code>trainer_output/aqing_emotion</code></td>
<td>自定义</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>好心的作者批注</strong>：==1.5B 模型真的很小，情绪思考别写太长，不然它学不会。我试过 1800 条数据，RTX 4050 6GB 跑了大概 40 分钟，loss 降到 0.5 左右就差不多了。==</p>
</blockquote>
<h3>5.4 开始训练</h3>
<p>点击“开始”，观察 loss 曲线。正常应持续下降，最终稳定在 ==0.3～0.8== 之间。如果不动，就去问问 <strong>ds 老师</strong> 吧 (doge)。</p>
<hr />
<h2>6. 推理与测试：把模块串起来</h2>
<h3>6.1 各模块加载</h3>
<ul>
<li><strong>ASR</strong>：FunASR 的 <code>AutoModel</code>，流式识别。</li>
<li><strong>SER</strong>：emotion2vec 模型，输入音频输出情绪标签。</li>
<li><strong>LLM</strong>：加载 base + LoRA adapter。</li>
<li><strong>TTS</strong>：GPT-SoVITS 或 CosyVoice，准备好情感参考音频。</li>
</ul>
<h3>6.2 简单串联代码（伪代码）</h3>
<pre><code># 1. 录音并识别
text = asr_model.generate(audio_chunk)
# 2. 情感识别
emotion = ser_model.predict(audio_chunk)
# 3. 拼接输入给 LLM
prompt = f"{text}（语音情感识别：{emotion}）"
response = llm.generate(prompt)
# 4. 解析出回复和情绪思考
reply, mood = parse_response(response)
# 5. TTS 合成
tts_model.synthesize(reply, emotion=mood)
</code></pre>
<h3>6.3 合并 LoRA 权重（可选）</h3>
<p>如果想导出完整模型：</p>
<pre><code>model = model.merge_and_unload()
model.save_pretrained("./merged_model")
tokenizer.save_pretrained("./merged_model")
</code></pre>
<hr />
<h2>7. 实时对话优化：从“轮次”到“流式”</h2>
<p>如果你要<strong>实时对话</strong>，核心是把串联改成 <strong>并行流式</strong>，目标是全双工——边听边说，随时打断。</p>
<h3>7.1 流式 ASR：边说边出字</h3>
<p>FunASR 支持逐帧解码，端到端延迟 &lt; 300ms。推荐 320ms（5120 采样点）音频块，延迟和准确率平衡最佳。VAD（语音活动检测）用来精准找说话片段，是实现“打断”的基础。检测到你说话就立即停 TTS 播放，清空合成队列。</p>
<h3>7.2 流式 LLM：增量预填充降低首 Token 延迟</h3>
<p>关键优化：<strong>增量 Prefilling</strong>。用户说话时，ASR 中间结果提前发给 LLM 预填充，把提示处理时间“隐藏”在用户说话过程中，首 Token 时间降低 70% 以上。还可以对 Qwen 模型 4-bit 量化，显存和延迟都大降。</p>
<h3>7.3 流式 TTS：边说边合成</h3>
<p>并行异步 TTS 队列：LLM 生成第一个完整句子就立刻推给 TTS 合成，不等整个回复。CosyVoice 首包延迟可低至 300ms，非常适合实时。</p>
<hr />
<h2>8. 项目结构：职责分离，避免依赖冲突</h2>
<p>语音交互是全新模块，和模型权重、训练数据解耦。在 <code>AI/AQing/</code> 下新建 <code>voice/</code>：</p>
<pre><code>AI/AQing/
├── .venv/
├── data/
├── dataset/
├── qwen-1.5b/          # 模型权重（不要动）
├── saves/
├── article/
├── MChat/              # 主程序
├── voice/              # 新建：语音交互模块
│   ├── asr_worker.py
│   ├── vad_worker.py
│   ├── tts_worker.py
│   ├── audio_utils.py
│   └── requirements_voice.txt
└── main.py
</code></pre>
<p>理由：<code>qwen-1.5b</code> 和 <code>saves</code> 专注“大脑”，<code>voice</code> 专注“耳朵和嘴巴”。语音库（funasr、pyaudio、torchaudio）和微调库（transformers、peft、vllm）有时版本冲突，分开管理好排查。</p>
<p>让 MChat 调用 voice，voice 把识别结果发给 AQing 的 API，用队列或异步通信。==不要把语音采集代码直接写进 Qwen 模型加载代码里==。</p>
<hr />
<h2>9. 常见问题</h2>
<table>
<thead>
<tr>
<th>问题</th>
<th>原因</th>
<th>解决</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>cuda available: False</code></td>
<td>装了 CPU 版 PyTorch</td>
<td>重装 CUDA 版：<code>pip install torch --index-url https://download.pytorch.org/whl/cu124</code></td>
</tr>
<tr>
<td><code>CUDA out of memory</code></td>
<td>显存不足</td>
<td>减小 batch_size、截断长度，或用量化；语音模型分时加载</td>
</tr>
<tr>
<td>ASR 识别不准</td>
<td>环境噪音、采样率不对</td>
<td>加 VAD，重采样到 16k，用 FunASR 流式</td>
</tr>
<tr>
<td>情感识别总是不对</td>
<td>SER 模型没适配你的场景</td>
<td>换 emotion2vec，或微调；也可以让 LLM 从文本辅助判断</td>
</tr>
<tr>
<td>TTS 没有情感</td>
<td>参考音频不对</td>
<td>给 GPT-SoVITS 提供对应情绪的参考音频；CosyVoice 用指令控制</td>
</tr>
<tr>
<td>模型只会重复一句话</td>
<td>过拟合</td>
<td>减少训练轮数，增加数据多样性</td>
</tr>
<tr>
<td>加载 LoRA 后没变化</td>
<td>检查点路径错误</td>
<td>选到包含 <code>adapter_model.safetensors</code> 的目录</td>
</tr>
</tbody>
</table>
<hr />
<h2>10. 学习资源</h2>
<ul>
<li><strong>FunASR</strong>：https://github.com/modelscope/FunASR</li>
<li><strong>emotion2vec</strong>：https://github.com/ddlBoJack/emotion2vec</li>
<li><strong>GPT-SoVITS</strong>：https://github.com/RVC-Boss/GPT-SoVITS</li>
<li><strong>CosyVoice</strong>：https://github.com/FunAudioLLM/CosyVoice</li>
<li><strong>LLaMA-Factory</strong>：https://github.com/hiyouga/LLaMA-Factory</li>
<li><strong>Qwen 官方仓库</strong>：https://github.com/QwenLM/Qwen2.5</li>
<li><strong>AutoDL 云平台</strong>：https://www.autodl.com</li>
<li><strong>Kaggle 免费 GPU</strong>：https://www.kaggle.com</li>
</ul>
<hr />
<blockquote>
<p>最后提醒：<strong>不要陷入“万事皆需训练”的误区</strong>。个人开发者，“大模型 + 提示词 + 现成语音工具”的胶水代码模式性价比最高。ASR、SER、TTS 通常都不需要从头训练，直接调用现成开源 SOTA 模型。先把系统搭起来跑通，再根据实际表现决定优化哪个模块。</p>
<p>ok啊，我 1.5B 模型搭完这一套，反应速度还行，就是有时候情绪思考写得像小学生作文……慢慢调数据吧，太慢了！！(doge)</p>
</blockquote>
]]></content>
    <author><name>Mengdie</name></author>
    <category term="机器学习"/>
  </entry>
  <entry>
    <title>基于qwen0.5b参数的训练</title>
    <link href="http://mblog.linghantech.top/posts/%E5%9F%BA%E4%BA%8Eqwen05b%E5%8F%82%E6%95%B0%E7%9A%84%E8%AE%AD%E7%BB%83/" rel="alternate" type="text/html"/>
    <id>http://mblog.linghantech.top/posts/%E5%9F%BA%E4%BA%8Eqwen05b%E5%8F%82%E6%95%B0%E7%9A%84%E8%AE%AD%E7%BB%83/</id>
    <published>2026-09-25T00:00:00.000Z</published>
    <updated>2026-09-25T00:00:00.000Z</updated>
    <summary>基于qwen0.5b参数的训练，从0 到 1 的ai训练过程，要什么自己训(doge</summary>
    <content type="html"><![CDATA[<h1>AI 模型训练入门指南（个人开发者版）</h1>
<blockquote>
<p>结论：<strong>个人开发者不建议从零预训练大模型，而是基于开源小模型做微调（LoRA/QLoRA）</strong>。(==本人已泪目测试！心碎一地==)
本文以 <strong>Qwen2.5-0.5B + LLaMA-Factory</strong> 为例，硬件门槛低，单卡 ==6GB== 显存即可。</p>
</blockquote>
<hr />
<h2>1. 硬件与环境要求</h2>
<h3>最低配置</h3>
<ul>
<li><strong>GPU</strong>：NVIDIA 显卡，显存 ≥ 6GB（如 RTX 4050 Laptop）</li>
<li><strong>内存</strong>：16GB 以上</li>
<li><strong>硬盘</strong>：至少 20GB 空闲</li>
<li><strong>系统</strong>：Windows / Linux 均可</li>
</ul>
<h3>推荐配置</h3>
<ul>
<li><strong>GPU</strong>：RTX 3090 / 4090（24GB 显存）</li>
<li><strong>内存</strong>：32GB</li>
<li><strong>硬盘</strong>：NVMe SSD</li>
</ul>
<h3>如果没有 GPU</h3>
<ul>
<li>用云平台：AutoDL、恒源云、Kaggle（免费）、Google Colab（免费）</li>
<li>租一张 RTX 4090，约 ¥2/小时</li>
</ul>
<h3>软件环境</h3>
<ul>
<li><strong>Python 3.10</strong>（不要用 3.13，兼容性差）</li>
<li><strong>CUDA 12.1 / 12.4</strong>（取决于显卡驱动）</li>
<li><strong>PyTorch</strong>（必须装 CUDA 版，不要装 CPU 版）</li>
<li><strong>LLaMA-Factory</strong>（微调框架，支持 Web UI）</li>
</ul>
<blockquote>
<p>==Mac==也可以训练哦!</p>
</blockquote>
<hr />
<h2>3. 模型选择</h2>
<p>个人开发者推荐以下小模型：</p>
<table>
<thead>
<tr>
<th>模型</th>
<th>参数量</th>
<th>特点</th>
<th>推荐场景</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Qwen2.5-0.5B-Instruct</strong></td>
<td>0.5B</td>
<td>中文强，生态好，LoRA 友好</td>
<td><strong>首选</strong>，聊天/情感/助手</td>
</tr>
<tr>
<td><strong>Qwen2.5-1.5B-Instruct</strong></td>
<td>1.5B</td>
<td>能力更强，显存要求稍高</td>
<td>需要更好效果</td>
</tr>
<tr>
<td><strong>RWKV7-G1 0.1B</strong></td>
<td>0.1B</td>
<td>纯 RNN，推理极快，多语言</td>
<td>边缘设备，嵌入式</td>
</tr>
<tr>
<td><strong>MiniMind2</strong></td>
<td>0.1B</td>
<td>教学用，可从头训练</td>
<td>学习训练流程</td>
</tr>
<tr>
<td><strong>Hunyuan-0.5B</strong></td>
<td>0.5B</td>
<td>腾讯出品，中英双语强悍</td>
<td>双语场景</td>
</tr>
</tbody>
</table>
<p><strong>下载方式</strong>（使用国内镜像）：</p>
<pre><code>$env:HF_ENDPOINT = "https://hf-mirror.com"
pip install huggingface_hub
python -c "from huggingface_hub import snapshot_download; snapshot_download('Qwen/Qwen2.5-0.5B-Instruct', local_dir='./qwen-0.5b')"
</code></pre>
<blockquote>
<p>这里用的是 <strong>Hugging Face Hub</strong>下载的==Qwen2.5-0.5B-Instruct== 模型。
需要别的模型可以去自行下载更换。
国内网速不行，可以使用==代理==或者==魔塔==哦</p>
</blockquote>
<hr />
<h2>4. 数据准备（最关键）</h2>
<p>模型效果 ==<strong>80%</strong>== 取决于数据质量。数据格式通常用 <strong>ShareGPT</strong> 或 <strong>Alpaca</strong>。</p>
<h3>格式示例（ShareGPT）</h3>
<pre><code>{"conversations": [
  {"from": "human", "value": "你是谁？"},
  {"from": "gpt", "value": "我是你的AI助手，很高兴为你服务。"}
]}
</code></pre>
<h3>数据要求</h3>
<ul>
<li><strong>数量</strong>：500～5000 条。太少学不会，太多训练慢且容易过拟合。</li>
<li><strong>质量</strong>：回答要自然、多样，不要模板化。</li>
<li><strong>多样性</strong>：覆盖不同问法、不同情绪、不同长度。</li>
<li><strong>格式统一</strong>：每条数据字段一致，不要混用。</li>
</ul>
<h3>数据来源</h3>
<ul>
<li>自己手工编写（==质量==最高）</li>
<li>用大模型生成后人工筛选（==效率==高）</li>
<li>公开数据集（如 ==Belle、Firefly==）</li>
</ul>
<blockquote>
<p>手工的话可以搞一辈子了，<strong>建议用第二个办法</strong>，这样可以快速生成数千条数据</p>
</blockquote>
<h3>数据注册（LLaMA-Factory）</h3>
<p>在 <code>data/dataset_info.json</code> 中注册：</p>
<pre><code>{
  "my_dataset": {
    "file_name": "my_data.jsonl",
    "formatting": "sharegpt",
    "columns": { "messages": "conversations" },
    "tags": {
      "role_tag": "from",
      "content_tag": "value",
      "user_tag": "human",
      "assistant_tag": "gpt"
    }
  }
}
</code></pre>
<blockquote>
<p><strong>好心的作者批注</strong>：==LLaMA-Factory==需要安装哦，pip安装就行</p>
</blockquote>
<hr />
<h2>5. 训练方式：LoRA 微调</h2>
<h3>5.1 安装 LLaMA-Factory</h3>
<pre><code>pip install llamafactory -i https://mirrors.aliyun.com/pypi/simple
</code></pre>
<h3>5.2 启动 Web UI</h3>
<pre><code>llamafactory-cli webui
</code></pre>
<p>浏览器打开 <code>http://localhost:7860</code>。</p>
<blockquote>
<p>默认是这个地址，注意一下控制台就行</p>
</blockquote>
<pre><code>Running on local URL: http://0.0.0.0:7860 
To create a public link, set `share=True` in `launch()`.
</code></pre>
<p>看到这个就说明启动成功了</p>
<h3>5.3 关键参数配置</h3>
<blockquote>
<p>这里是关于webui的一部分配置内容</p>
</blockquote>
<table>
<thead>
<tr>
<th>参数</th>
<th>推荐值</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>模型路径</td>
<td><code>./qwen-0.5b</code></td>
<td>你下载的模型目录</td>
</tr>
<tr>
<td>微调方法</td>
<td><code>lora</code></td>
<td>只训练适配器</td>
</tr>
<tr>
<td>量化等级</td>
<td><code>none</code>（6GB 显存）或 <code>4-bit</code></td>
<td>4-bit 需装 bitsandbytes</td>
</tr>
<tr>
<td>对话模板</td>
<td><code>qwen</code></td>
<td>必须匹配模型</td>
</tr>
<tr>
<td>训练阶段</td>
<td><code>Supervised Fine-Tuning</code></td>
<td>监督微调</td>
</tr>
<tr>
<td>数据集</td>
<td><code>my_dataset</code></td>
<td>你注册的名称</td>
</tr>
<tr>
<td>学习率</td>
<td><code>3e-5</code></td>
<td>不要太高</td>
</tr>
<tr>
<td>训练轮数</td>
<td><code>3</code></td>
<td>数据少可增加到 5</td>
</tr>
<tr>
<td>批处理大小</td>
<td><code>1</code></td>
<td>显存小就设 1</td>
</tr>
<tr>
<td>梯度累积</td>
<td><code>8</code></td>
<td>补偿 batch size</td>
</tr>
<tr>
<td>截断长度</td>
<td><code>1024</code></td>
<td>省显存</td>
</tr>
<tr>
<td>计算类型</td>
<td><code>bf16</code></td>
<td>混合精度</td>
</tr>
<tr>
<td>LoRA 秩</td>
<td><code>8</code></td>
<td>常用值</td>
</tr>
<tr>
<td>LoRA 缩放系数</td>
<td><code>16</code></td>
<td>常用值</td>
</tr>
<tr>
<td>LoRA 作用模块</td>
<td><code>all</code></td>
<td>全部线性层</td>
</tr>
<tr>
<td>输出目录</td>
<td><code>trainer_output/my_model</code></td>
<td>自定义</td>
</tr>
</tbody>
</table>
<p>这里晒一下我的配置图片
<img src="./img/image-1.png" alt="alt text" />
<img src="./img/image-2.png" alt="alt text" /></p>
<h3>5.4 开始训练</h3>
<p>点击“==<strong>开始</strong>==”，观察 loss 曲线。正常应持续下降，最终稳定在 ==0.3～0.8== 之间。
如果没有就可以去问问<strong>ds老师</strong>了(doge</p>
<h3>5.5 训练时间参考</h3>
<ul>
<li>Qwen2.5-0.5B，1500 条数据，3 轮，RTX 4050 6GB：约 1.5～3 小时</li>
<li>如果太慢，减少数据量或降低截断长度</li>
</ul>
<hr />
<h2>6. 推理与测试</h2>
<h3>6.1 在 Web UI 的 Chat 页测试</h3>
<ol>
<li>模型路径：<code>./qwen-0.5b</code></li>
<li>检查点路径：选择训练输出目录（包含 <code>adapter_model.safetensors</code>）</li>
<li>点击“加载模型”</li>
<li>直接输入问题测试</li>
</ol>
<h3>6.2 用 Python 代码推理</h3>
<blockquote>
<p>此代码由ds老师独家赞助写出，本编不保证可用..</p>
</blockquote>
<pre><code>from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel

base = "./qwen-0.5b"
lora = "./trainer_output/my_model"

tokenizer = AutoTokenizer.from_pretrained(base, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(base, torch_dtype="auto", device_map="auto")
model = PeftModel.from_pretrained(model, lora)
model.eval()

messages = [{"role": "user", "content": "你好"}]
text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(text, return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_new_tokens=256)
print(tokenizer.decode(outputs[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True))
</code></pre>
<h3>6.3 合并 LoRA 权重（可选）</h3>
<p>如果想导出为一个完整模型：</p>
<pre><code>model = model.merge_and_unload()
model.save_pretrained("./merged_model")
tokenizer.save_pretrained("./merged_model")
</code></pre>
<hr />
<h2>7. 常见问题</h2>
<table>
<thead>
<tr>
<th>问题</th>
<th>原因</th>
<th>解决</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>cuda available: False</code></td>
<td>装了 CPU 版 PyTorch</td>
<td>重装 CUDA 版：<code>pip install torch --index-url https://download.pytorch.org/whl/cu124</code></td>
</tr>
<tr>
<td><code>CUDA out of memory</code></td>
<td>显存不足</td>
<td>减小 batch_size、截断长度，或用量化</td>
</tr>
<tr>
<td>模型不按预期输出</td>
<td>数据量少/质量差</td>
<td>增加数据，提高多样性</td>
</tr>
<tr>
<td>输出格式混乱</td>
<td>训练数据格式不统一</td>
<td>统一数据格式，重新训练</td>
</tr>
<tr>
<td>模型只会重复一句话</td>
<td>过拟合</td>
<td>减少训练轮数，增加数据多样性</td>
</tr>
<tr>
<td>加载 LoRA 后没变化</td>
<td>检查点路径错误</td>
<td>选到包含 <code>adapter_model.safetensors</code> 的目录</td>
</tr>
</tbody>
</table>
<hr />
<h2>8. 学习资源</h2>
<ul>
<li><strong>LLaMA-Factory 官方文档</strong>：https://github.com/hiyouga/LLaMA-Factory</li>
<li><strong>Hugging Face 课程</strong>：https://huggingface.co/learn</li>
<li><strong>Qwen 官方仓库</strong>：https://github.com/QwenLM/Qwen2.5</li>
<li><strong>AutoDL 云平台</strong>：https://www.autodl.com</li>
<li><strong>Kaggle 免费 GPU</strong>：https://www.kaggle.com</li>
</ul>
<hr />
<blockquote>
<p>如果需要针对特定场景（如情感对话、客服、角色扮演）定制训练方案，可以进一步调整数据格式和训练参数。
ok啊，我1800条数据也是训练的40分钟了..太慢了！！</p>
</blockquote>
]]></content>
    <author><name>Mengdie</name></author>
    <category term="机器学习"/>
  </entry>
  <entry>
    <title>记录第一次使用opencv调用摄像头</title>
    <link href="http://mblog.linghantech.top/posts/%E8%AE%B0%E5%BD%95%E7%AC%AC%E4%B8%80%E6%AC%A1%E4%BD%BF%E7%94%A8opencv%E8%B0%83%E7%94%A8%E6%91%84%E5%83%8F%E5%A4%B4/" rel="alternate" type="text/html"/>
    <id>http://mblog.linghantech.top/posts/%E8%AE%B0%E5%BD%95%E7%AC%AC%E4%B8%80%E6%AC%A1%E4%BD%BF%E7%94%A8opencv%E8%B0%83%E7%94%A8%E6%91%84%E5%83%8F%E5%A4%B4/</id>
    <published>2026-09-12T00:00:00.000Z</published>
    <updated>2026-09-12T00:00:00.000Z</updated>
    <summary>记录第一次使用opencv调用摄像头</summary>
    <content type="html"><![CDATA[<h1>第一次使用 OpenCV 调用摄像头实操记录</h1>
<p>本文记录本人首次使用 Python + OpenCV 实现电脑本地摄像头调用、实时画面展示、画面捕获、窗口退出的完整实操过程。全文包含环境安装、完整可运行代码、逐行代码详解以及实操踩坑解决方案，逻辑清晰、零基础友好，适合新手入门 OpenCV 视觉开发。</p>
<h2>一、环境准备</h2>
<p>本次开发基于 Python 环境，核心依赖 OpenCV 视觉库，全程采用 pip 官方镜像安装，安装速度快、报错率低。</p>
<h3>1. 检查 Python 环境</h3>
<p>打开终端/CMD，输入以下命令，校验 Python 是否正常安装：</p>
<pre><code>python --version
</code></pre>
<p>若输出版本号（Python 3.7 及以上均可），说明环境正常；若无响应，需先下载安装并配置 Python 环境。</p>
<h3>2. 安装 OpenCV 库</h3>
<p>终端执行以下命令安装 OpenCV 核心库：</p>
<pre><code>pip install opencv-python
</code></pre>
<p>安装完成后，可通过以下命令验证安装是否成功：</p>
<pre><code>pip show opencv-python
</code></pre>
<p>终端显示库版本、安装路径等信息，即代表安装成功。</p>
<h2>二、完整摄像头调用代码</h2>
<p>以下为可直接运行的完整源码，适配 Windows/Mac 系统，实现三大核心功能：摄像头实时画面展示、S 键手动截图、ESC 键退出程序，代码简洁无冗余。</p>
<pre><code># 导入opencv核心库
import cv2

# 1. 初始化摄像头
# 参数0代表电脑默认内置摄像头，外接摄像头可尝试1、2、3依次测试
cap = cv2.VideoCapture(0)

# 判断摄像头是否成功打开
if not cap.isOpened():
    print("摄像头打开失败，请检查摄像头设备或权限！")
else:
    print("摄像头打开成功，按S键截图，按ESC键退出")

# 2. 循环读取摄像头实时画面
while True:
    # ret: 布尔值，是否读取到画面；frame: 每一帧画面的图像矩阵数据
    ret, frame = cap.read()

    # 读取画面失败则退出循环
    if not ret:
        print("读取画面失败，退出程序")
        break

    # 展示实时画面，窗口名称为 Camera Live
    cv2.imshow("Camera Live", frame)

    # 监听键盘按键（延迟1ms刷新画面）
    key = cv2.waitKey(1) &amp; 0xFF

    # 按ESC键（键值27）退出程序
    if key == 27:
        break
    # 按S键保存当前画面截图
    elif key == ord('s'):
        # 截图保存至项目根目录
        cv2.imwrite("camera_screenshot.png", frame)
        print("截图成功！已保存为 camera_screenshot.png")

# 3. 释放硬件资源、关闭所有窗口
cap.release()
cv2.destroyAllWindows()
</code></pre>
<h2>三、代码逐行详解</h2>
<h3>1. 库导入与摄像头初始化</h3>
<ul>
<li><code>import cv2</code>：导入 OpenCV 核心视觉库，是所有图像、摄像头操作的基础前提。</li>
<li><code>cv2.VideoCapture(0)</code>：初始化摄像头对象，参数为摄像头设备索引。<code>0</code> 为电脑默认内置摄像头，若连接外接 USB 摄像头，可修改参数为 <code>1</code>、<code>2</code> 依次测试适配。</li>
</ul>
<h3>2. 摄像头状态判断</h3>
<p><code>cap.isOpened()</code>：检测摄像头设备是否正常开启，返回布尔值 <code>True/False</code>。可有效规避摄像头未连接、被其他软件占用、系统权限不足等问题导致的程序报错，提升代码稳定性。</p>
<h3>3. 实时画面读取循环</h3>
<p><code>cap.read()</code>：逐帧读取摄像头实时画面，返回两个核心参数：</p>
<ul>
<li><code>ret</code>：布尔值，<code>True</code> 代表成功读取画面，<code>False</code> 代表读取失败（摄像头断开、设备异常、被占用）。</li>
<li><code>frame</code>：numpy 数组格式的图像数据，也就是摄像头捕捉到的每一帧画面，是后续展示、截图的核心数据。</li>
</ul>
<h3>4. 画面显示与按键监听</h3>
<ul>
<li><code>cv2.imshow("窗口名", 画面数据)</code>：创建可视化窗口，实时渲染展示摄像头画面。</li>
<li><code>cv2.waitKey(1)</code>：等待键盘输入，参数 <code>1</code> 代表延迟 1 毫秒，保障画面持续刷新、实现实时预览效果。</li>
<li>按键逻辑：通过匹配键盘键值，自定义功能——ESC 键（<code>27</code>）退出程序、S 键手动截图保存。</li>
</ul>
<h3>5. 资源释放（关键步骤）</h3>
<ul>
<li><code>cap.release()</code>：释放摄像头硬件资源，避免摄像头被程序持续占用，导致微信、浏览器、其他软件无法调用摄像头。</li>
<li><code>cv2.destroyAllWindows()</code>：关闭所有 OpenCV 创建的图像窗口，彻底终止程序进程，避免后台残留。</li>
</ul>
<h2>四、运行效果说明</h2>
<ol>
<li>代码运行后，自动弹出名为 <code>Camera Live</code> 的窗口，实时展示摄像头动态画面；</li>
<li>按下键盘 <code>S</code> 键，控制台输出截图成功提示，项目根目录自动生成 <code>camera_screenshot.png</code> 截图文件；</li>
<li>按下键盘 <code>ESC</code> 键，画面窗口关闭，摄像头资源释放，程序正常终止。</li>
</ol>
<h2>五、常见问题与解决方案</h2>
<h3>1. 摄像头打开失败</h3>
<ul>
<li>常见原因：摄像头被微信、浏览器、直播软件等占用；摄像头设备索引错误；系统未开启摄像头权限。</li>
<li>解决方案：关闭所有占用摄像头的软件；将 <code>VideoCapture()</code> 参数修改为 <code>1/2</code> 重新测试；在电脑系统设置中开启应用摄像头访问权限。</li>
</ul>
<h3>2. 画面黑屏、无实时画面</h3>
<ul>
<li>常见原因：摄像头硬件故障、电脑驱动异常、设备索引不匹配、帧读取逻辑异常。</li>
<li>解决方案：重启电脑、更新摄像头驱动；核对并切换摄像头设备索引（<code>0/1/2</code>）。</li>
</ul>
<h3>3. 程序退出后摄像头仍被占用</h3>
<ul>
<li>原因：程序异常终止，未执行资源释放代码；进程后台残留。</li>
<li>解决方案：确保代码末尾执行 <code>cap.release()</code> 和 <code>cv2.destroyAllWindows()</code>；强制终止后台 Python 进程后重启终端重新运行。</li>
</ul>
<h2>六、实操总结</h2>
<p>本次实操完成了 OpenCV 最基础的摄像头调用功能，熟练掌握了视觉开发的核心基础流程：</p>
<p>导入依赖库 → 初始化摄像头设备 → 循环读取画面帧 → 实时展示画面 → 监听自定义操作 → 释放硬件资源。</p>
<p>该功能是后续人脸识别、目标检测、视频录制、画面滤镜、图像抓拍等 OpenCV 视觉项目的核心基础，可在此代码框架上持续拓展更多实用功能。</p>
<hr />
<blockquote>
<p>因为原版文章没了，所以先让ai补了一篇，私密马赛</p>
</blockquote>
]]></content>
    <author><name>Mengdie</name></author>
    <category term="笔记"/>
  </entry>
</feed>
