tensorflow 对象检测 api 和 bboxes by image frame

tensorflow object detection api and bboxes by image frame

通过标签 [python] 阅读其他人的 questions\answers 我看到了 Banach Tarski . So, I wanted to retry out what he did to more deeply understand Tensorflow Object Detection API. I followed step by step what he did as well as I was using Grocery Dataset 的精彩作品。 faster_rcnn_resnet101 模型采用默认参数且 batch_size = 1.

真正的区别是我没有 Shelf_Images 每个 class 带有注释和 bbs 而是 Product_Images 有 10 个文件夹(每个 class),在每个文件夹中,您都可以看到没有任何背景的完整尺寸的香烟图像。 Product_Images 的平均大小是 600*1200 而 Shelf_Images 是 3900*2100。所以,我想为什么我不能拍摄这些完整的图像并从中取出边界框,然后对其进行训练并获得成功的结果。顺便说一句,我不需要像 Banach Tarski 那样手动裁剪图像,因为 600*1200 非常适合 faster_rcnn_resnet101 神经网络模型及其输入图像的默认参数。

示例图像之一 class Pall Mall

这看起来很简单,因为我可以仅通过图像的轮廓来创建 bboxes。因此,我只需要为每个图像创建注释并从中创建 tf_records 用于训练。 我采用了通过图像轮廓创建 bboxes 的公式

x_min = str(1)
y_min = str(1)
x_max = str(img.width - 10)
y_max = str(img.height - 10)

xml 注释示例

<annotation>
    <folder>VOC2007</folder>
    <filename>B1_N1.jpg</filename>
    <path>/.../grocery-detection/data/images/1/B1_N1.jpg</path>
    <source>
        <database>The VOC2007 Database</database>
        <annotation>PASCAL VOC2007</annotation>
        <image>flickr</image>
        <flickrid>192073981</flickrid>
    </source>
    <owner>
        <flickrid>tobeng</flickrid>
        <name>?</name>
    </owner>
    <size>
        <width>811</width>
        <height>1274</height>
        <depth>3</depth>
    </size>
    <segmented>0</segmented>
    <object>
        <name>1</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>1</xmin>
            <ymin>1</ymin>
            <xmax>801</xmax>
            <ymax>1264</ymax>
        </bndbox>
    </object>
</annotation>

在脚本遍历所有文件夹图像后,我得到的每个图像注释类似于我在 VOC2007 xml 类型中显示的内容。然后我创建了 tf_records 遍历每个注释,将其视为由 tensorflow 完成的 pet_running 示例,现在一切看起来都很好,可以在 AWS Nvidia Tesla k80

上进行训练了

用于创建 Tf_records

的 feature_dict 示例
feature_dict = {
      'image/height': dataset_util.int64_feature(height),
      'image/width': dataset_util.int64_feature(width),
      'image/filename': dataset_util.bytes_feature(
          data['filename'].encode('utf8')),
      'image/source_id': dataset_util.bytes_feature(
          data['filename'].encode('utf8')),
      'image/key/sha256': dataset_util.bytes_feature(key.encode('utf8')),
      'image/encoded': dataset_util.bytes_feature(encoded_jpg),
      'image/format': dataset_util.bytes_feature('jpeg'.encode('utf8')),
      'image/object/bbox/xmin': dataset_util.float_list_feature(xmins),
      'image/object/bbox/xmax': dataset_util.float_list_feature(xmaxs),
      'image/object/bbox/ymin': dataset_util.float_list_feature(ymins),
      'image/object/bbox/ymax': dataset_util.float_list_feature(ymaxs),
      'image/object/class/text': dataset_util.bytes_list_feature(classes_text),
      'image/object/class/label': dataset_util.int64_list_feature(classes),
      'image/object/difficult': dataset_util.int64_list_feature(difficult_obj),
      'image/object/truncated': dataset_util.int64_list_feature(truncated),
      'image/object/view': dataset_util.bytes_list_feature(poses),
}

在 12458 步之后,每步 1 张图像,模型收敛到局部最小值。我保存了所有检查点和图表。接下来我用它创建了推理图和 运行 object_detection_tutorial.py 来展示它是如何在我的测试图像上工作的。但我对结果一点都不满意。 P.S 最后一张图片有 1024∆×∆760 大小,也被裁剪为第三张图片的顶部,有 3264∆×∆2448。所以我尝试了不同尺寸的香烟图片,以不小心在按模型缩放图像时不丢失图像细节。

输出:class带有预测 bboxes 的图像

我认为问题在于,您的网络了解到对象的大小与输入图像的大小几乎相同,因为每个训练图像仅包含一个与输入图像本身大小几乎相同的正对象。

我认为您的数据集是香烟包装 classifier 的良好起点,但不适用于物体检测器。

Faster-R-CNN 模型需要带有对象的样本,但也需要背景。然后,该模型将分两步在图像中找到对象。在第一步中,所谓的区域提议网络将在图像中寻找有趣的区域。然后,这些有趣的区域将在第二步中 class 化。在第二步中,模型决定一个区域是实际的对象还是仅仅是背景。

因此,要训练香烟物体检测器,您需要大量样本,例如 post 的最后一张照片,其中所有物体(香烟包装)都标有单独的 BBOX 和 class 标签。