【发布时间】:2020-02-02 07:03:49
【问题描述】:
我有许多专注于喂鸟器的 Raspberry Pi 相机, 持续运行 TensorFlow 对象检测图 (SSD MNet2) 来检测鸟类。 随着时间的推移,我已经建立了一个包含 11 个物种的 +10k 图像的数据集,并经常重新训练图表。 我打算将数据集中的项目数限制为 10k 个项目(可能是任意的)。
数据集有数据流,因此它不断改进。 新的候选检测由法官(我)按如下方式分类:
添加为新的培训/评估项目。 该检测被判断为代表一个类别。 调整后,可以将图像和检测添加到ground truth
添加为反例项。 检测是错误的,但可以转换为未分类的反例。 调整后,可以将图像和检测添加到ground truth
丢弃项目 对训练没有用。
另请注意,当有足够的更好数据可用时,一些现有数据将被淘汰。
迄今为止,ground truth 中的所有项目都以 1.0 的权重交付给训练。
def default_groundtruth_weights():
return tf.ones(
[tf.shape(tensor_dict[fields.InputDataFields.groundtruth_boxes])[0]],
dtype=tf.float32)
但这显然不是很正确。 我通过检查知道有些项目不太好,但在任何时候它们都是最好的例子。 随着时间的推移,最终,不好的物品会被更好的物品取代。
排名训练记录
我想知道对训练的影响,以及通过对数据集进行排名,通过某种理想值是否会改善这种情况, 然后依次进行训练,使模型在最理想的数据上进行初始化,然后学习越来越不理想的数据。
我想避免的是模型过于关注bad 数据而对good 数据关注不够,尤其是在训练的初始阶段。
其中bad 和good 数据表示数据项对训练模型的准确性和可视化(通过 Lucid)的贡献程度。
加权数据集
为物品设置权重(介于 0 和 1 之间)意味着减少为该物品计算的损失(通过权重因子); 我想它的意思是“少注意这个项目”。
见:Class weights for balancing data in TensorFlow Object Detection API
我已经访问了我的数据集中的每个项目以追溯设置权重。 我通过在数据集图像上运行一些最近的模型(诚然,模型是从中训练的)然后匹配检测来做到这一点的。 每个项目的权重是通过对模型检测的分数进行平均计算得出的(四舍五入到小数点后一位)。 然后审查整个数据集,以根据需要增加或减少权重。
结果如下表所示:
| Class\Weight Bin | 0.3 | 0.4 | 0.5 | 0.6 | 0.7 | 0.8 | 0.9 | Total|
| blackbird | | | 34 | 84 | 212 | 305 | 115 | 750 |
| blue tit | | | 47 | 94 | 211 | 435 | 241 | 1028 |
| collared dove | | | 17 | 52 | 236 | 302 | 101 | 708 |
| dunnock | | | 50 | 140 | 260 | 236 | 228 | 914 |
| goldfinch | | | 60 | 103 | 220 | 392 | 164 | 939 |
| great tit | | 35 | 42 | 71 | 234 | 384 | 201 | 967 |
| mouse | 40 | 29 | 35 | 50 | 87 | 142 | | 383 |
| robin | | 43 | 44 | 97 | 175 | 207 | 52 | 618 |
| sparrow | | 31 | 51 | 75 | 278 | 475 | 220 | 1130 |
| starling | | 19 | 28 | 39 | 97 | 227 | 73 | 483 |
| wood pigeon | | | 10 | 34 | 82 | 265 | 560 | 951 |
| | | | | | | | | 8871 |
第一个训练结果看起来很有希望,因为模型训练得很好。 但我还没有查看可视化效果。
为每个数据集项设置适当的权重是否等同于分层交付已排序的训练记录?
【问题讨论】:
标签: tensorflow object-detection object-detection-api