我是深度学习的初学者,我正在使用基于 Tensorflow 构建的 Keras。我正在尝试使用 RGB 图像 (540 x 360) 分辨率来预测边界框。
我的标签是二进制(黑/白)二维 np 维度数组(540, 360),其中除框边缘为 1 外,所有像素均为 0。 像这样:
[[0 0 0 0 0 0 ... 0]
[0 1 1 1 1 0 ... 0]
[0 1 0 0 1 0 ... 0]
[0 1 0 0 1 0 ... 0]
[0 1 1 1 1 0 ... 0]
[0 0 0 0 0 0 ... 0]]
所以,我的输入的尺寸为 (None, 540, 360, 3)
,输出的尺寸为 (None, 540, 360)
但如果我添加一个内部数组我可以将形状更改为 (None, 540, 360, 1)
如何定义 CNN 模型以使我的模型符合此标准?如何设计具有这些输入和输出的 CNN?
最佳答案
您必须区分对象检测和对象分割。虽然两者都可以用于解决类似的问题,但底层的 CNN 架构看起来非常不同。
对象检测模型使用 CNN 分类/回归架构,其中输出指的是边界框的坐标。通常的做法是使用属于每个边界框的垂直中心、水平中心、宽度和高度的 4 个值。搜索 Faster R-CNN、SSD 或 YOLO 以查找 keras 的流行对象检测模型。在您的情况下,您需要定义一个函数,将当前标签转换为我提到的 4 个坐标。
对象分割模型通常使用一种称为编码器-解码器网络的架构,其中原始图像在前半部分被缩小和压缩,然后恢复到其原始分辨率以预测完整的图像。图像。搜索 SegNet、U-Net 或 Tiramisu 以查找 keras 的流行对象分割模型。我自己的U-Net实现可以找到here 。在您的情况下,您需要定义一个自定义函数,用 1 填充边界框内的所有 0。了解此解决方案不会预测边界框本身,而是预测显示感兴趣区域的分割图。
什么适合您,取决于您想要实现的目标。为了获得实际的边界框,您需要执行对象检测。但是,如果您有兴趣突出显示超出矩形窗口的感兴趣区域,则分段可能更适合。理论上,您可以使用矩形标签进行分割,只要您有足够的数据,网络将学习创建比地面实况的不准确分割更好的掩模。
关于arrays - 具有 RGB 输入和 BW 二进制输出的 CNN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48257205/