将 point/dot 注释转换为高斯密度图

Convert point/dot annotation in to gaussian density map

我正在研究这篇论文:https://papers.nips.cc/paper/2010/file/fe73f687e5bc5280214e0486b273a5f9-Paper.pdf 我正在为下面的函数苦苦挣扎:

基本上在图像中,每个人都会被标注一个点,而不是边界框或分割。该论文提出了一种将点转换为高斯密度图的方法,该图充当了ground truth。我已经尝试 numpy.random.multivariate_normal 但它似乎不起作用。

我正在研究一个涉及密度图的研究问题。此代码假定您正在遍历文本文件列表,其中每个文本文件都有点注释(或者您正在从对象转换为点注释,就像我所做的那样)。它还假定您有一个 annotations 的列表,其中 (x,y) 中心 points 可以使用(在 reading/processing 所述文本文件之后)。

您可以在此处找到 良好 的实现: https://github.com/CommissarMa/MCNN-pytorch/blob/master/data_preparation/k_nearest_gaussian_kernel.py

上面有一些额外的自适应内核代码。

下面的上下文代码(还有很多 'fluff')在这里: https://github.com/MattSkiff/cow_flow/blob/master/data_loader.py

这是我使用的代码:

# running gaussian filter over points as in crowdcount mcnn
         
density_map = np.zeros((img_size[1],img_size[0]), dtype=np.float32)
  
# add points onto basemap
for point in annotations:

    base_map = np.zeros((img_size[1], img_size[0]), dtype=np.float32)       
                        
    # subtract 1 to account for 0 indexing
    base_map[int(round(point[1]*img_size[1])-1),
             int(round(point[0]*img_size[0])-1)] += 1

    density_map += scipy.ndimage.filters.gaussian_filter(base_map, sigma = sigma, mode='constant')

这应该会创建一个符合您要求的密度图。在 matplotlib 的 ax 对象上使用 'imshow'(例如 ax.imshow(density,cmap='hot',interpolation='nearest')应该会生成这样的密度图(我添加了航空图像以指示正在标记的内容):