分类与定位


分类与定位

定位图片中物体可以表示为回归任务:预测物体周围的边界框,一种常见的方法是预测物体中心的水平坐标和垂直坐标,还有其高度和宽度。这意味着有四个数字要预测。它不需要对模型进行太多修改,只需要添加四个具有单位的第二个密集输出层(通常在全局平均池化层之上),就可以使用MSE损失对其进行训练:

import tensorflow as tf
from tensorflow import keras
import tensorflow_datasets as tfds

(test_set, valid_set, train_set), info = tfds.load('tf_flowers', split=['train[:10%]', 'train[10%:25%]', 'train[25%:]'],
                                                   as_supervised=True, with_info=True)
dataset_size = info.splits['train'].num_examples
class_names = info.features['label'].names
n_classes = info.features['label'].num_classes


def preprocess(image, label):
    resize_image = tf.image.resize(image, [224, 224])
    final_image = keras.applications.xception.preprocess_input(resize_image)
    return final_image, label


batch_size = 16
train_set = train_set.shuffle(1000)
train_set = train_set.map(preprocess).batch(batch_size).prefetch(1)
valid_set = valid_set.map(preprocess).batch(batch_size).prefetch(1)
test_set = test_set.map(preprocess).batch(batch_size).prefetch(1)
base_model = keras.applications.xception.Xception(weights='imagenet', include_top=False)
avg = keras.layers.GlobalAveragePooling2D()(base_model.output)
class_output = keras.layers.Dense(n_classes, activation='softmax')(avg)
loc_output = keras.layers.Dense(4)(avg)
optimizer = keras.optimizers.SGD(lr=.2, momentum=.9, decay=.01)
model = keras.Model(input=base_model.input, outputs=[class_output, loc_output])
model.compile(loss=['sparse_categorical_entropy', 'mse'], loss_weights=[0.8, 0.2],
              optimizer=optimizer, metrics=['accuracy'])

花朵数据集在花朵周围没有边界框,因此需要自己添加。这通常是机器学习项目中最难、最昂贵的部分之一:获取标签。花时间寻找合适的工具是一个办法。要使用边界框标注图像,可能需要使用开源图像标记工具,例如VGG Image Annotator、LabelImg、OpenLabeler或ImageLab,或者使用商业工具(例如LabelBox或Supervisely)。如果需要标注大量图像,则可能还需要考虑众包平台,例如Amazon Mechanical Turk。但是建立众包平台,需要准备发送给工人的表格,对其进行监督并确保他们产生的边界框的质量是很好的,因此要保证这样做是值得的。如果只有几千张图像要标记,最好自己动手做。

如果已经获得了花朵数据集中每个图像的边界框(假设每个图像有一个边界框)。那么需要创建一个数据集,其数据项将是经过预处理的图像的批量处理,以及它们的类标签和边界框。每个数据集都应为一下形式的元组:(image,(class_labels,bounding_boxes))。

对边界框应该进行归一化,以便水平坐标和垂直坐标以及高度和宽度都在0到1的范围内。而且通常要预测高度和宽度的平方根,而不是直接的高度和宽度值:通过这种方式,对于大边框的10像素错误将不会像对小边框的10像素错误一样受惩罚

MSE通常作为成本函数可以很好的训练模型,但是评估模型对边界框的预测能力不是一个很好的指标。最常用的度量指标是“交并比”(Intersection over Union IoU):预测边界框和目标边界框之间的重叠面积除以它们的联合面积。在tf.keras中,它是由tf.keras.metrics.MeanIoU类实现的

相关