# 人群计数之生成密度图

4 篇文章 6 订阅

### 二、生成密度图

#### 2.1 加载数据集

    # set the root to the Shanghai dataset you download
root = 'E:/数据集/ShanghaiTech_Crowd_Counting_Dataset/'

# now generate the ShanghaiA's ground truth
part_A_train = os.path.join(root, 'part_A_final/train_data', 'images')
part_A_test = os.path.join(root, 'part_A_final/test_data', 'images')
part_B_train = os.path.join(root, 'part_B_final/train_data', 'images')
part_B_test = os.path.join(root, 'part_B_final/test_data', 'images')
path_sets = [part_B_train, part_B_test]  # 将训练集和测试集放在一起


    img_paths = []

for path in path_sets:
for img_path in glob.glob(os.path.join(path, '*.jpg')):
img_paths.append(img_path)
print('图片数量：', len(img_paths))


#### 2.2 读取图片并生成密度图

    for img_path in img_paths:
print(img_path)
# 获取每张图片对应的mat标记文件
mat = io.loadmat(img_path.replace('images', 'ground_truth').replace('IMG_', 'GT_IMG_').replace('.jpg', '.mat'))
img = plt.imread(img_path)
# 生成密度图
gt_density_map = np.zeros((img.shape[0], img.shape[1]))
gt = mat["image_info"][0, 0][0, 0][0]
for i in range(0, len(gt)):
if int(gt[i][1]) < img.shape[0] and int(gt[i][0]) < img.shape[1]:
gt_density_map[int(gt[i][1]), int(gt[i][0])] = 1
gt_density_map = gaussian_filter_density(gt_density_map)
# 保存生成的密度图
with h5py.File(img_path.replace('images', 'ground_truth').replace('.jpg', '.h5'), 'w') as hf:
hf['density'] = gt_density_map

#测试
print('总数量=',len(gt))
print('密度图=',gt_density_map.sum())


#### 2.5 高斯核函数的代码实现

def gaussian_filter_density(gt):
print(gt.shape)

density = np.zeros(gt.shape, dtype=np.float32)
gt_count = np.count_nonzero(gt)
if gt_count == 0:
return density
pts = np.array(list(zip(np.nonzero(gt)[1], np.nonzero(gt)[0])))

#构造KDTree寻找相邻的人头位置
tree = scipy.spatial.KDTree(pts.copy(), leafsize=2048)
distances, locations = tree.query(pts, k=4)

print('generate density...')
for i, pt in enumerate(pts):
pt2d = np.zeros(gt.shape, dtype=np.float32)
pt2d[pt[1],pt[0]] = 1.
if gt_count > 1:
#相邻三个人头的平均距离，其中beta=0.3
sigma = (distances[i][1]+distances[i][2]+distances[i][3])*0.1
else:
sigma = np.average(np.array(gt.shape))/2./2. #case: 1 point
density += scipy.ndimage.filters.gaussian_filter(pt2d, sigma, mode='constant')
print('done.')
return density


1、构造KDTree调用的是scipy包中封装好的函数，其中leafsize表示的是最大叶子数，如果图片中人头数量过多，可以自行修改其数值。
2、tree.query（）中参数k=4查询的是与当前结点相邻三个结点的位置信息，因为distances[i][0]表示的是当前结点。
3、在论文中beta=0.3，因为这里计算的是三个点的平均距离，所以除以3然后乘以beta相当于直接乘以0.1。

### 三、补充

#### 3.3 相关研究

ICCV2019 Adaptive Density Map Generation for Crowd Counting （ADMG）

#### 3.4 Write in the end

[1] https://www.pianshen.com/article/95011021159/
[2] https://www.cnblogs.com/herenzhiming/articles/5276106.html
[3] http://visal.cs.cityu.edu.hk/static/pubs/conf/iccv19-dmapgen.pdf

09-05 5796
11-24
08-13 420
07-23 1208
05-22 1万+
03-30 1593
07-19 4374
02-03 6785

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、付费专栏及课程。