使用 Tensorflow + Keras 的对象检测项目(根架构)。用于准确训练模型的图像样本大小?
Object detection project (root architecture) using Tensorflow + Keras. Image sample size for accurate training of model?
我目前在大学从事一个项目,我们正在使用 python + tensorflow 和 keras 来训练图像对象检测器,以检测拟南芥根系的不同部分。
我们目前的结果很糟糕,因为我们目前只有大约 100 张图像来训练模型,但我们目前正在努力培养更多植物以获得更多图像(更多数据)来训练张量流模型。
我们实施了以下 Mask_RCNN 模型:Github- Mask_RCNN tensorflow
我们正在寻找检测三个对象类别:茎、主根和次根。
但是模型在次要根所在的位置错误地检测到主要根。
它应该能够检测到这样的东西:Root detection example
我们现在使用的训练根数据集:training images
通常用于训练神经网络准确结果的样本量是多少?
首先:我认为没有简单的规则来估计样本量,但至少它取决于:
1.图片质量
我下载了图像,我认为您需要先对它们进行预处理,然后才能使用它来缩小 "problem complexity"。在我处理生物数据的一些项目中,背景去除(图像 - 低通滤波器)是获得更好结果的关键。但是你绝对应该remove/crop你感兴趣的区域之外的区域(比如卷尺和尺子)。我会尝试尽可能获得最干净的数据集(包括手动调整 cv2/gimp/等)以集中网络解决"the right problem"..之后你可以申请一些随机失真使其也适用于 fuzzy/bad/realistic 图像。
2。您处理数据的方式
有一些技巧可以让您 "expand" 您的数据集。
有时让生成器方法从您的输入数据中裁剪随机小补丁 非常有帮助。这允许您处理更多批次(在小 gpus 上)并为您的网络提供更多 "variety",(想想 conv2d 任务:如果您不使用随机裁剪,您的过滤器将滑过相同的区域再次(在同一图像上))。出于同样的原因:应用随机失真、翻转和旋转图像。
3.网络架构
在你的情况下,我更喜欢 U-Net 架构,最后一个 conv2d 输出为 3(你的 类)特征图,一个最终的 softmax 激活和一个 categorical_crossentropy,这使得你可以玩深度游戏,因为有时你需要复杂的架构来解决问题(接近 100%),但在你的情况下你只想看到第一个工作结果。因此 更少的层和简单的架构 也可以帮助您完成工作。也许有一些经过训练的 U-Net 网络权重可以满足您的要求(例如在 kaggle 上搜索)。因为使用“迁移学习”也很有帮助(减少您需要的数据)-> 使用已经训练过的网络的第一层(权重)。使用语义分割,第一个过滤器将变成类似于给定最多 problems/images 的边缘检测。
4.你的心智模型 "accurate results"
这是最难的部分..因为它在你的项目中不断发展。例如。在您的网络开始在预处理输入图像上表现良好的同一时刻,您将开始考虑 architecture/data 更改以使其也适用于模糊图像。这就是为什么你应该从一个可行的问题开始,但始终改进你的数据集(包括稀有种类的根)并逐步调整你的网络架构。
我目前在大学从事一个项目,我们正在使用 python + tensorflow 和 keras 来训练图像对象检测器,以检测拟南芥根系的不同部分。
我们目前的结果很糟糕,因为我们目前只有大约 100 张图像来训练模型,但我们目前正在努力培养更多植物以获得更多图像(更多数据)来训练张量流模型。
我们实施了以下 Mask_RCNN 模型:Github- Mask_RCNN tensorflow 我们正在寻找检测三个对象类别:茎、主根和次根。 但是模型在次要根所在的位置错误地检测到主要根。 它应该能够检测到这样的东西:Root detection example
我们现在使用的训练根数据集:training images
通常用于训练神经网络准确结果的样本量是多少?
首先:我认为没有简单的规则来估计样本量,但至少它取决于:
1.图片质量
我下载了图像,我认为您需要先对它们进行预处理,然后才能使用它来缩小 "problem complexity"。在我处理生物数据的一些项目中,背景去除(图像 - 低通滤波器)是获得更好结果的关键。但是你绝对应该remove/crop你感兴趣的区域之外的区域(比如卷尺和尺子)。我会尝试尽可能获得最干净的数据集(包括手动调整 cv2/gimp/等)以集中网络解决"the right problem"..之后你可以申请一些随机失真使其也适用于 fuzzy/bad/realistic 图像。
2。您处理数据的方式
有一些技巧可以让您 "expand" 您的数据集。 有时让生成器方法从您的输入数据中裁剪随机小补丁 非常有帮助。这允许您处理更多批次(在小 gpus 上)并为您的网络提供更多 "variety",(想想 conv2d 任务:如果您不使用随机裁剪,您的过滤器将滑过相同的区域再次(在同一图像上))。出于同样的原因:应用随机失真、翻转和旋转图像。
3.网络架构
在你的情况下,我更喜欢 U-Net 架构,最后一个 conv2d 输出为 3(你的 类)特征图,一个最终的 softmax 激活和一个 categorical_crossentropy,这使得你可以玩深度游戏,因为有时你需要复杂的架构来解决问题(接近 100%),但在你的情况下你只想看到第一个工作结果。因此 更少的层和简单的架构 也可以帮助您完成工作。也许有一些经过训练的 U-Net 网络权重可以满足您的要求(例如在 kaggle 上搜索)。因为使用“迁移学习”也很有帮助(减少您需要的数据)-> 使用已经训练过的网络的第一层(权重)。使用语义分割,第一个过滤器将变成类似于给定最多 problems/images 的边缘检测。
4.你的心智模型 "accurate results"
这是最难的部分..因为它在你的项目中不断发展。例如。在您的网络开始在预处理输入图像上表现良好的同一时刻,您将开始考虑 architecture/data 更改以使其也适用于模糊图像。这就是为什么你应该从一个可行的问题开始,但始终改进你的数据集(包括稀有种类的根)并逐步调整你的网络架构。