基于深度学习的图像匹配技术专题- [patch based matching6]-将匹配进行到底

之前的文章 已经介绍了 matchnet, Siamese network,以及获取他们数据集,此外 我们也改了网络的模型。现在我们离全部工作还差一步之遥,不能放弃。

应该有很多人想要用自己的数据集去训练模型,所以这一篇博文的目的就是 连接数据和网络,制作适合你的数据集。

---------------------------------------------------------------------------------------------------------------

首先,我选择的数据依然是 brown的数据,这个数据集使用比较广泛,想要下载的同学,请查阅第一讲。

  • brown数据集介绍
     基本信息:数据集中包含三个子集,三个zip文件中 是1024*1024的bitmap 图片,每一个图片包含 256张图片块,每个图片块是64*64的灰度图像。   文件夹中包含两个元数据(metadata)文件:info.txt 和 interest.txt;
这个数据集是很好的用来衡量 描述算子的性能的数据集。

 info.txt 文件包含匹配信息。每一行包含两个数: 第一个数是 3D 点的ID ,第二数是0(没有用)
 bitmap中的patch 在文件中的数据是按照从左到右,从上到下。

       interest.txt 这个文件是特征点。 为了确立匹配和不匹配, 使用同样reference image ID 的patches 
       这个文件: ID of the reference image, x,  y, orientation, scale。

       文件夹中还有 m50_n1_n2.txt文件,其中n1是匹配的数量,n2是不匹配的数量。
       他每行的格式是:patchID1   3DpointID1   unused1   patchID2   3DpointID2   unused2  ; 匹配的是有同样的3DpointID1

  • 如何使用数据集,变成标注文件
     从这个原始数据中,我们需要去做,那些图相对是匹配的,那些事不匹配的。然后再把数据转化成caffe的数据输入形式。
def main():
    #input arg
    args=ParseArgs();
    #read 3Dpoint IDs
    with open(args.info_file) as f:
         point_id=[int(line.split()[0]) for line in f] #对数据切片,去第一个数据
    with open(args.interest_file)as f:  interest=[[float(x)for x in line.split()] for line in f]
    db=leveldb.LevelDB(args.out_db, create_if_missing=True, error_if_exists=True)

    #add patches to database
    batch=leveldb.WriteBatch()
    total=len(interest)
    processed=0
    for i,metadata in enumerate(interest)  #这样 i是interest文件的行数,metadata对应该行的 元数组
        datum=caffe_pb2_Datum()
        datum.channels, datum.height, datum.width=(2,64,64)
        #extract the patch
        datum.data=GetPatchImage(i, args.container_dir).tostring())
        datum.label=point_id[i]
        datum.float_data.extend(metadata)
        batch.Put(str(i),datum.serializeToString())
        processed+=1;
     db.write(batch, sysc=True)
        
上面的Python 代码 可以看到 datum.data 和datum.label,并且它的label就是point_id,也就是3D点的ID。
其中:info_file 是info_txt的路径;interest_file是interest_txt的路径;container_dir是bmp文件的路径。

下面我们来处理 patch中的data:
def GetPatchImage(patch_id,container_dir):
#deal with dmp
PATCHES_PER_IMAGE=16*16
PATCHES_PER_ROW=16
PATCH_SIZE=64

container_idx,container_offerset=divmod(patch_id,PATCHES_PER_IMAGE)
row_idex,col_ied=divmod(container_ofset,PATCHES_PER_ROW)

#extract the patch from the iamge 
patch_image= GetPatchIamge.cached.container_img[\PATCH_SIZE *row_dix:PATCH_SIZE*(row_idx+1),\PATCHE_SIZE*col_idx: PATCH_SIZE * (col_idx+1)]
return patch_image
可以看出 patch_image就是从cached.container_img中按顺序取出一个64*64的patch,这个函数调用是在主函数的循环语句中。
patch_id就是interest文件的行号i,可以patch的总数, divmod是一个同时获得除数和余数的函数,同时得到,container_idx 和 container_offerset。例如:divmod(17, 256)->0,17. 即,在第一个bitmap, 是第17个图块。

第17个在哪一行,哪一列呢? divmod(17,16)->1,1.  块坐标是从上到下:64->128, 从左到右是64->128 . 块是从(0->255).


上面的代码就可以获得一个数据块,然后获得这个数据块的label。我们已经知道了matching 的patches, 那么接下来的工作就是,模仿mnist siamese建立数据集。

————————————————————————————————————————————————————




你可能感兴趣的:(深度学习,matchNet)