Computer vision 快速R-CNN的所有包围盒特征提取

Computer vision 快速R-CNN的所有包围盒特征提取,computer-vision,neural-network,deep-learning,caffe,Computer Vision,Neural Network,Deep Learning,Caffe,我刚刚安装了Fast RCNN并运行了演示 我开始怀疑是否有可能从图像中的所有边界框中提取特征(并对整个数据集执行此操作) 例如,如果快速RCNN从图像中检测到猫、狗和汽车 我想为猫、狗和车分别提取CNN的功能 并对成千上万的图像执行此操作 Fast RCNN的Github()上的特征提取示例似乎是使用caffe对整个图像进行特征提取的副本,而不是每个边界框 有人能帮我吗 更新: 显然,每个边界框的特征提取在代码的以下部分中完成: 我正试图找出如何调整它来保存功能,就像我们使用Caffe保存到m

我刚刚安装了Fast RCNN并运行了演示

我开始怀疑是否有可能从图像中的所有边界框中提取特征(并对整个数据集执行此操作)

例如,如果快速RCNN从图像中检测到猫、狗和汽车

我想为猫、狗和车分别提取CNN的功能

并对成千上万的图像执行此操作

Fast RCNN的Github()上的特征提取示例似乎是使用caffe对整个图像进行特征提取的副本,而不是每个边界框

有人能帮我吗

更新:

显然,每个边界框的特征提取在代码的以下部分中完成:


我正试图找出如何调整它来保存功能,就像我们使用Caffe保存到mdb文件中的整个图像的功能一样。

更新

在确定右边界框的过程中,Fast RCNN从大量(~800-2000)图像区域(称为对象建议)中提取CNN特征。这些区域通常通过不同的算法获得。在此计算之后,它使用这些特征识别“正确”的建议并找到“正确”的边界框。这称为边界框回归

当然,Fast RCNN优化了这一过程,但仍然需要从比与感兴趣对象相关的区域更多的区域中提取CNN特征

很快,如果要在粘贴的代码快照中保存变量
blobs_out
,则将保存与所有对象方案相关的功能,包括“错误”方案。但是您可以保存所有这些,然后尝试删减并仅检索所需的内容。要保存这些功能,只需使用
pickle.dump()

查看
test\u net
函数的末尾。
nms\u dets
变量似乎存储最后的框。可能有一种方法可以将存储的
blob_
去掉,并去掉不需要的特性,但它似乎并不那么简单


我能想到的最简单的解决方案如下

让我们快速计算最终的边界框。然后,提取相关的图像补丁,方法如下(我假设是Python):

特征提取与整个图像情况相同:

 net = Caffe.NET('deploy.prototxt', 'caffemodel', caffe.TEST)
 # preprocess input
 net.blobs['data'].data[...] = net_input
 net.forward()
 feats = net.blobs['my_layer'].data.copy()

当然,这种方法在计算上是昂贵的,因为你基本上要计算CNN特征的两倍。这取决于您对速度和CNN型号大小的要求。

我不确定是否有您的问题。您已经用对象的边界框对图像进行了注释了吗?或者你需要从未标注的图像中提取这些b框?@FlavioFerrara我想从每个边界框中提取特征。因此,每个边界框被视为一个离散图像,从中提取特征。我们可以假设我已经有了边界框,那么你就不需要快速RCNN了。它是一个对象检测器,也就是说,在没有边界的情况下获取边界框的一种方法。只需提取补丁并提取每个补丁的功能。我想你是在假设我不是通过fast rcnn获得这些框的。假设我从fast rcnn获得了边界框。难道我不能操纵每个边界框都扭曲并传递给CNN的部分,以便获得每个框的特征吗?(这就是我在问题中的实际意思)也就是说,我最终想要保存这些特性(就像在mdb和caffe中一样)好了,现在我做得更好了。我的回答基于你问题下面的评论。我将尝试更新我的答案。显然,nms_的数据是所有提案的方框大小和每个班级的分数(请参阅代码以删除建议。然后,您可以返回保存的功能并尝试检索所需的功能。
img = cv2.imread('/path/to/image')
for bbox in bboxes_list:
    x0, y0, x1, y1 = bbox
    cut = img[y0:y1, x0:x1]
    extract_cnn_features(cut)
 net = Caffe.NET('deploy.prototxt', 'caffemodel', caffe.TEST)
 # preprocess input
 net.blobs['data'].data[...] = net_input
 net.forward()
 feats = net.blobs['my_layer'].data.copy()