第一课 · 走进 AI:从一次实验读数开始

人工读数的局限 · 为什么要自己做一个 · 环境搭建 · 数据标注
教师授课文档 含讲解要点与演示步骤

一、传统人工读数的局限性

我们平时是怎么读的

望远镜里有一把竖直的标尺,印着数字 1~5 和刻度线;视场中央有一条水平的十字叉丝。改变砝码,叉丝上下移动,停在某个刻度值上。

读数的动作分三步:调焦看清 → 让叉丝对准刻度 → 估读到毫米的十分位。

这套动作有什么问题

局限具体表现
慢一次读数要调焦、对线、估读。做一组数据要读十几二十次
主观估读的那一位靠目测。不同人读、同一个人不同时候读,结果可能差零点几毫米
易疲劳连读十几次之后眼睛发花、判断力下降,误差越读越大
不可追溯最后记录本上只有一个数字。这个数怎么读出来的、当时叉丝在什么位置,全都没有凭证
难复核别人没法验证你读得对不对,只能从头重做一遍
精度受限估读位的判读能力,受限于人眼分辨和现场条件
这些问题不是"读得不够认真"造成的,而是人眼读数这种方式固有的。
所以很自然的想法是:能不能把这件事交给机器去做?

二、为什么不直接问 AI,而要自己做一个

先说清楚:现在拿一张照片去问一个大模型"这个读数是多少",它多半能给你一个数。

那为什么不这么做,非要花一个学期从头自己做一个?

理由一:你无法知道它靠不靠谱

理由二:你无法对它负责

物理实验的底线是:知道自己手上的数据可不可靠。
一个你无法解释来源的数字,不能写进实验报告——不是因为它一定错,而是因为你没有任何依据说明它对。

理由三:最关键的一条——你什么能力都没长

自己从头做一个,你会得到什么

你会亲手经历你会得到
标数据、训模型、看结果知道 AI 需要什么样的"养料"才能学会
看到它在某些图上突然失灵知道它的能力边界在哪、边界为什么在那儿
设计校验规则、拒读规则学会用可验证的逻辑把 AI 包起来
量误差、分析失败案例学会对一个 AI 系统的结果负责
这些经验,换成任何 AI 任务都通用。
而且它们不可能通过"买一个现成工具"获得——只有亲手做过一遍,才会长在自己身上。

一句话

问 AI 要答案,你得到的是一个数;自己做一个工具,你得到的是判断力。
前者是消费 AI,后者是理解并驾驭 AI。

而且做完之后,你会变得更强

这个项目做完,你再拿一张图去问 AI,你会知道:

没做过这个项目的人,永远只能凭感觉。

(顺带说明:这不是在否定大模型。) 它非常强,而且以后会更强。我们要建立的不是"不信 AI",而是"知道在什么条件下可以信、信到什么程度"——这恰恰是物理实验训练一直在教的事。

三、项目全流程概览

整个项目九步,今天要完成的是前两步。

步骤做什么一句话说明
1搭环境建两个互不干扰的软件环境
2标注把图上的数字、刻度线、叉丝人工标出来
3重命名统一文件编号,保住拍摄时间信息
4转格式把标注格式转成训练格式
5数据自检用脚本把标注错误抓出来
6划分数据集留一份"考题"用来验收
7试跑训练用最小代价确认链路通不通
8正式训练租云 GPU,高分辨率、长轮次
9评估与读数量误差,输出读数
今天只做第 1、2 步。后面七步会在接下来的课里逐步展开。
但今天做的这两步,决定了整个项目的上限。

四、什么是 conda,为什么要用它

先讲一个真实会遇到的麻烦

你写了个程序,需要某个软件包的 2.0 版本。过了两周,另一个任务需要同一个包的 1.5 版本。

如果你把它们都装在系统里——装第二个的时候,第一个就被覆盖了,之前的程序跑不起来了。

类比:实验室里的试剂台。
不同的实验要用不同的试剂。你不会把所有试剂都倒在一个台子上——那样谁也做不了实验。
正确做法是:每个实验一套自己的器具,互不干扰。

conda 就是干这个的

conda 是一个"环境管理 + 软件包管理"工具。它做两件事:

功能含义
环境管理为每个项目建一个独立的"工具箱",里面的软件包互不干扰
包管理从网上把需要的软件包下载安装到指定的工具箱里

所以一个"环境"= 一份独立的 Python + 一套独立的软件包。你可以建十个环境,它们彼此看不见对方。

课堂提问 为什么我们要建 两个环境,而不是一个?
(提示:想一想我们后面要做几件不同的事。)

五、动手:安装 Miniconda 并搭环境

① 装 Miniconda

去官网下载 Windows 64 位安装包。安装时注意两件事:

装完后打开命令行:Win + R → 输入 cmd → 回车。之后所有操作都在这个窗口里做。

conda --version        # 能打印出版本号就成功
如果提示"conda 不是内部或外部命令" 从开始菜单打开 Anaconda Prompt (miniconda3),执行一次 conda init cmd.exe, 然后关掉所有命令行窗口、重新开一个 cmd,再试。

② 建两个环境

我们要建的两个环境,各管一件事:

环境名用途
label数据标注
train模型训练与推理

为什么要分两个:标注工具和训练工具的依赖互不相关,混装会让两边都变脆,出问题时难以定位。

# 标注环境
conda create -n label python=3.10 -y --override-channels -c conda-forge
conda activate label
pip install labelme -i https://pypi.tuna.tsinghua.edu.cn/simple
# 训练环境
conda create -n train python=3.10 -y --override-channels -c conda-forge
conda activate train
python -m pip install --upgrade pip
pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu
pip install ultralytics

③ 验证

conda env list                                  # 两个环境都在
python -V                                       # 3.10.x
python -c "import torch; print(torch.__version__)"
yolo version
labelme --version

④ 环境怎么切换

conda activate label      # 切到标注环境
conda activate train      # 切到训练环境
conda deactivate          # 退出当前环境
本课最重要的一条操作纪律:看命令行最前面的括号。
出现 (label) 或 (train) 才是进对了环境;显示 (base) 说明你还在默认环境里, 此时敲任何命令都可能出问题。
每开一个新窗口,第一件事就是激活环境。
顺带讲一句为什么用 Python 3.10 而不是最新版
深度学习框架对新版 Python 的支持永远滞后几个月。工程上追求"最新",往往只换来一堆兼容性麻烦。
新 ≠ 合适。这个道理在本项目里会反复出现。

六、什么是"标注",为什么必须标注

先讲清楚:机器是怎么"学会"认东西的

它不是在学"什么是数字 3",而是在学"什么样的画面,通常对应数字 3"。

类比:教小孩认字。
你不会给他讲"3 的数学定义",你是指着一张张卡片说"这是 3、这也是 3"。
看得多了,他自己总结出"3 长这样"。
我们训练模型,就是在做同一件事——只不过"卡片"是我们亲手标注的图片。

这种"给例子 + 给答案"的学习方式,叫监督学习。而我们提供的"答案",就叫标注。

课堂提问 如果我把某一张图上的数字 3 标错了,模型会怎么看?
它会报错吗?
(答案是:不会报错,它只会悄悄学歪。这是 AI 最危险的地方,后面课程会专门讲。)

我们要标三类东西

关键设计:不教模型"读数",教它"认元素"。

标签名含义画法
dig1 ~ dig5数字 1~5矩形框(类别名本身就代表数值)
scale整厘米刻度线线段
cross十字叉丝横线线段(它才是被测对象)
为什么"线"要标成线段,而不是用框?
框的中心会随着你画框的松紧而漂移——标注时的随手一画,会直接变成读数误差。
线段的两个端点才是我们真正需要的:位置准,还能算出倾斜角。
为什么不让模型直接报读数?
因为那样它给的是一个黑箱数字——说不清怎么来的、给不出误差、错了也不知道错在哪。
拆成"认元素 + 几何计算"之后,每一步都能单独验证。

标注的质量,决定模型的上限

这是本课最需要记住的一句话:模型的能力,不可能超过数据的质量。

三条规则必须全库统一,一次定死 ① 刻度线被中间竖线断成两段时,整条算一条还是左右各算一条——二选一,全班统一;
② 图像里的"重影"数字一律不标(那是镜面反射,不是真实刻度);
③ 类别清单一次定全——数字就是 5 类,中途不许增删。