通过标签阅读其他人的问题\答案[python]我遇到了Banach Tarski TensorFlow Object Detection API Weird Behavior的惊人作品。所以,我想重试他所做的更深入理解Tensorflow Object Detection API。我一步一步地遵循他所做的以及我使用的Grocery Dataset。使用默认参数和batch_size = 1获取了faster_rcnn_resnet101模型。
真正的不同之处在于,我没有为每个类带来注释和bbs的Shelf_Images,而是Product_Images,其中有10个文件夹(每个用于一个类),在每个文件夹中,您可以看到没有任何背景的完整尺寸的香烟图像。 Product_Images的平均尺寸为600 * 1200,而Shelf_Images为3900 * 2100。所以,我想为什么我不能拍摄这些完整的图像并从中取出边界框,然后训练它并获得成功的结果。顺便说一句,我不需要像Banach Tarski那样手动裁剪图像,因为600 * 1200非常适合fast_rcnn_resnet101神经网络模型及其输入图像的默认参数。
Pall Mall以外的图片示例
这看起来很简单,因为我可以通过图像的轮廓创建bbox。所以,我只需要为每个图像创建注释,并从中创建tf_records进行训练。 我采用了通过图像轮廓创建bbox的公式
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迭代每个注释,将其视为 pet_running示例,由tensorflow完成,现在看起来都很棒并准备好在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的第三图像的顶部。因此,我尝试了不同尺寸的香烟图像,以便在图像缩放期间不会丢失图像细节。
输出:带有预测的bbox的分类图像
答案 0 :(得分:1)
我认为问题在于,您的网络了解到对象的大小几乎与输入图像相同,因为每个训练图像只包含一个与输入图像本身大小几乎相同的正对象。
我认为您的数据集对于卷烟包装分类器来说是一个很好的起点,但不适用于物体检测器。
Faster-R-CNN模型需要具有对象的样本,但也需要背景。然后,模型将以两步方式在图像中找到对象。在第一步中,所谓的区域提议网络将在图像中寻找有趣的区域。然后将这些有趣的区域分类为第二步。通过第二步,模型决定区域是实际的对象还是仅背景。
因此,为了训练香烟物体探测器,您需要大量样本,例如您帖子的最后一张图片,其中所有物品(香烟包装)都标有单独的BBOX和类别标签。