【问题标题】:Extracting features from caffe last layer从caffe最后一层提取特征
【发布时间】:2018-08-18 09:50:15
【问题描述】:

我正在尝试从针对汽车分类进行微调的 GoogleNet caffe 模型的最后一层提取特征。这是deploy.prototxt。我尝试了几件事:

  1. 我从 'loss3_classifier_model' 层获取了不正确的特征。

  2. 现在我正在从模型中的 'pool5' 层提取特征,如 prototxt 中给出的那样。

我不确定它是否正确,因为我为不同汽车提取的特征似乎没有太大区别。换句话说,我无法使用最后一层特征来区分汽车,我在特征上使用了欧几里得距离(正确吗?)。我没有使用softmax,因为我不想对它们进行分类,我只想要特征并使用欧几里得距离重新检查它们。

这些是我遵循的步骤:

## load the model 
net = caffe.Net('deploy.prototxt',
                caffe.TEST,
                weights ='googlenet_finetune_web_car_iter_10000.caffemodel') 

# resize the input size as I have only one image in my batch.
net.blobs["data"].reshape(1, 3, 224, 224)

# I read my image of size (x,y,3)
frame = cv2.imread(frame_path) 

bbox = frame[int(x1):int(x2), int(y1):int(y2)] # getting the car, # I have stored x1,x2,x3,x4 seperatly.
# resized my image to 224,224,3, network input size.
bbox = cv2.resize(bbox, (224, 224)) 

# to align my input to the input of the model 
bbox_input = bbox.swapaxes(1,2).reshape(3,224,224) 

# fed input image to the model.
net.blobs['data'].data[0] = bbox_input 
net.forward()

# features from pool5 layer or the last layer.
temp = net.blobs["pool5"].data[0] 

现在,我想确认这些步骤是否正确?我是 caffe 的新手,我不确定我上面写的步骤。

【问题讨论】:

    标签: python deep-learning caffe pycaffe


    【解决方案1】:

    这两个选项都有效。 您离网络末端越远,这些功能对您的问题/训练集的专业化程度就越低,同时仍会捕获可能应用于类似任务的相关信息。随着您移动到网络的末端,这些功能将更加适合您的任务。

    请注意,您正在处理两个类似的问题/任务。该网络针对汽车分类(“这辆车是哪个型号?”)进行了微调,现在您想要验证两辆汽车是否属于同一型号。

    考虑到网络是使用大型且具有代表性的训练集进行微调的,从中获得的特征是强大的并且具有很多表示能力(即,它们捕获了他们被训练的任务的许多复杂的底层模式) 对您的验证任务有用。

    考虑到这一点,您可以尝试多种方法来比较两个特征向量:

    • 欧式距离太简单了。我会尝试它只是因为它易于/快速实施;
    • 余弦相似度 [1] 也可能是一个简单但很好的起点;
    • 分类器。我在类似问题中所做的另一种可能性是在两个特征的组合之上训练分类器(SVM,逻辑回归)。分类器的输入可以是它们并排的串联。
    • 将验证任务整合到您的网络中。您可以更改 GoogleNet 架构以接收两张汽车照片并输出它们是否属于同一模型。您将把网络从分类问题转换/微调为验证任务。检查 siamese 网络 [2]。

    编辑:调整框架大小时出现错误,这可能是导致问题的原因!

    # I read my image of size (x,y,3)
    frame = cv2.imread(frame_path) 
    
    # resized my image to 224,224,3, network input size.
    bbox = cv2.resize(frame, (224, 224))
    

    您应该已将frame 作为cv2.resize() 方法的输入传递。您可能正在向网络提供垃圾输入,这就是为什么输出最终看起来总是相似的原因。

    【讨论】:

    • 感谢您的回答。正如您解释的那样,我将从微调模型中获得丰富的功能集,我也有同样的想法。但是,当我提取特征时,我发现不同汽车之间的欧几里得距离并没有那么大,而它们完全不同(例如白色轿车和黑色 SUV),这让我在比较 100 辆汽车时变得困难。现在,正如您指出的那样,欧几里得距离可能不是一个好的选择,我将尝试余弦相似度并看看。我现在不能使用连体网络,因为我们正在测试一种称为主导集的方法。
    • 此外,问题的关键在于我不确定我上面写的 caffe 代码。你能帮我解决这个问题吗?
    • 不好意思我这里没有加一行,上面已经改了。最初我已将其包含在我的代码中。我已经重新检查了我给出的图片是正确的。
    • 一切似乎都很好。我不确定是什么原因造成的。检查网络是否正确分类输入图像(或至少具有与您在测试/验证集中期望的相同程度的错误)。如果发生这种情况,那么可能只有特征向量的微小变化才能区分汽车的型号。
    • 您可以尝试的另一件事是为所有数据集中的相同模型和不同模型图像对绘制欧几里得距离(或您可能使用的其他距离/相似度)的直方图。并检查这些直方图的重叠程度。这可能会提示您这些功能在验证任务中的表现。
    猜你喜欢
    • 2016-12-13
    • 1970-01-01
    • 2019-07-31
    • 2017-10-31
    • 2018-07-04
    • 1970-01-01
    • 2021-03-22
    • 2018-08-20
    • 1970-01-01
    相关资源
    最近更新 更多