ELAI S.r.l.

同一台机器的一千张图像,等于一千次独立测试吗?

完美测试可能测到记忆而非泛化。可复现实验说明何时应先按机器划分,再处理图像。

同一台机器的一千张图像,等于一千次独立测试吗?

优秀结果中隐藏的问题

检测系统正确分类了几乎所有未用于训练的图像,看起来可以部署到新产线。但测试图像来自熟悉的机器、光照、背景和采集几何。测到的是缺陷识别,还是环境识别?答案首先取决于测试设计,然后才是模型架构。

摘要。构建受控反例:仅记住机器身份的分类器在随机划分观测时得100%,在新机器上得50%。这不是视觉基准,未处理任何图像。刻意简单的模型用于隔离统计问题。推导重叠概率,解读混淆矩阵,区分已知机器、新机器与未来时段,理解分数实际能支持什么承诺。

测试前:什么必须是新的?

训练用带标签样本建立规则,测试将规则用于未参与构建的样本。文件中的另一行不一定是新情境。同次采集的20帧共享条件,而两台机器未必共享。组指与关注单位绑定的观测集合,这里是机器。组不是类别;类别是要预测的0或1,一个组通常可以含两类。

如果服务面向同一批已安装的100台机器,了解其特征可能合理;若面向从未见过的工厂,测试就应体现这种陌生性。这是不同目标,不是对流程的道德排序。不说明留出单位的准确率掩盖了区别。若机器均来自同一工厂,而承诺是新工厂泛化,仅按机器分组也可能不足。

完全不懂缺陷的模型

生成100个身份并随机分配50个0、50个1标签。每台机器产生20行相同标签,共2000行。组内标签恒定是为揭示捷径而设的极端假设,不表示真实缺陷恒定。每行只存机器、帧序号和标签,没有像素或零件特征。

分类器建立身份到标签的字典。未知身份返回训练多数类,平局选0。构建只需遍历数据,预测查键,未学到外观与缺陷的可迁移关系。哈希查找平均常数成本,存储和构建随组数及行数增长。这是诊断基线,不是生产架构建议。

为何随机分行几乎保证熟悉

每行独立以p=0.8概率进入训练。考虑已知处于测试集的一行,其m行组还剩m−1次让同机进入训练的机会。若训练完全没见过该机,其余行必须全部进入测试。因分配独立,可乘概率,再用1减去得到相反事件。

P(已见机器 | 测试行) = 1 − (1 − p)^(m − 1)
P(未见) = 0.2^19 = 5.24288 × 10^−14

每机1行时熟悉概率为0,2行80%,5行99.84%,20行几乎1。这些是划分流程概率,不是预测正确率。但在字典模型中,知道组就知道答案。增加帧数可让测试更熟悉,却未增加新机器知识。公式假设独立伯努利分配,精确固定训练行数则需另用组合计数。

两个协议,两组实际运行结果

Python实验使用种子20260929,得到1577训练行、423测试行。全部100台机器同时出现在两边,423次预测全对。第二协议完整留出10台标签0及10台标签1机器,其余80台提供1600训练行。20个测试身份均未知,400次预测全部回退为0,仅200次正确。

协议训练/测试行共享组准确率
row Bernoulli p=0.81577 / 423100100%
held-out groups1600 / 400050%

第二个混淆矩阵比50%更有信息。行是真实0、1,列是预测0、1。[[200,0],[200,0]]表示认对所有0,却一个1也未认对。这不是尚可的识别能力,而是恒定回答的结果。第一个矩阵为[[207,0],[0,216]]。两者及标签、留出组、行索引均存JSON,可重建结果。

左:测试行属于已见机器的理论概率。右:实际计算准确率。100%与50%的差异属于合成字典,不是真实视觉模型。
左:测试行属于已见机器的理论概率。右:实际计算准确率。100%与50%的差异属于合成字典,不是真实视觉模型。

反例证明了什么,边界在哪里

我们证明按行分开一般不足以证明跨组泛化,未证明所有神经网络都记忆机器,也未证明50%是工业常见性能。学到缺陷特征的模型可能成功。反例否定的推论是:测试行未进训练,所以已验证新机器部署。只需一个前提真、结论假的实际案例即可反驳。

组测试类别平衡是为隔离记忆而明确选择的。真实工厂可能类别频率、组大小不同。按帧平均给图像多的机器更大权重;先算每机准确率再平均则每机等权。两者都非普遍正确,应对应决策。本例每组20行使两者一致,但真实数据未必如此。

从证明走向测试设计

验证新机器时先决定留出机器,再构建训练和测试。同一原始图像的变换应留在同一侧;先裁剪或增强再划分可能将近似副本散布两边。归一化、特征选择也只在训练上拟合,选模型的每个分区都需重做。操作顺序属于方法,不是行政细节。

scikit-learn文档说明GroupKFold保持组分离,StratifiedGroupKFold还尝试保留类别比例。工具不会替你决定何种组有意义。本实验直接实现一次平衡的组留出,未运行scikit-learn或交叉验证。交叉验证在不同分区反复训练评估以选配置,最终测试组仍须与选择过程隔离。

还存在时间维度。熟悉机器明天可能刀具磨损、摄像头更换或生产条件改变。随机历史帧未必体现这些变化。若承诺当前机器明天可用,需尊重时间顺序;若是新工厂明天可用,则两种差异都需体现。没有万能划分能让运行环境描述变得无关。

最后,20台机器的400帧不是400次独立迁移证明。量化机器间不确定性需在重采样中保留组,20个单位也可能漏掉稀有变体。本文未计算置信区间或总体性能估计,只给保存的数据与协议确定的反例。重复实验验证计算,却不扩展观测总体。

答案:数新情境,而不只数行

一千张图像能很好描述一台机器,却不自动成为对新机器的一千次测试。字典未学缺陷就得100%,这是阅读基准时应记住的。有效评估说明什么熟悉、什么变化,据此划分并在范围内解释分数。只增加图像解决不了问题,让测试对应承诺才可以。

来源与可复现性

scikit-learn — Cross-validation, sections on grouped data, stratification and held-out transformations; documentation consulted 29 September 2026.

片段用四台机器展示字典机制,归档包含百台机器实验、种子、全部分配与上述结果,使用Python标准库执行。不是EL-AI产品测试或工业图像结果。文档说明现有划分工具,数据集、概率推导及反例属于本文教学分析。

def predict(train, test):
    memory = {group: label for group, label in train}
    return [memory.get(group, 0) for group, _ in test]
train = [('A', 0), ('B', 1)]
for test in [[('A', 0), ('B', 1)], [('C', 0), ('D', 1)]]:
    predictions = predict(train, test)
    accuracy = sum(p == y for p, (_, y) in zip(predictions, test))/len(test)
    print(predictions, accuracy)

代码、数据与说明 · JSON. 教学计算使用 Python 3.14.0,图使用 Matplotlib 3.11.2。分析由 AI 辅助,不声称经过同行评审或人工审核。原创 ImageGen 封面仅作示意,不记录 EL-AI 人员、场所或实际安装。来源查阅于 2026 年 9 月 29 日。