PET(Point-Query Quadtree for Crowd Counting, Localization, and More)
PET(Point-Query Quadtree for Crowd Counting, Localization, and More)
- 介绍
- 实验记录
- 训练阶段
- 推断阶段
介绍
论文:Point-Query Quadtree for Crowd Counting, Localization, and More
实验记录
训练阶段
TODO
推断阶段
下面是以一张输入图像作为网络输入的实验过程记录:
1.特征提取:对于一张768×1024的图像,记为input。对input做位置编码得到768*1024的位置编码特征,记为input_pos_embed。input经过vgg19输出两个特征分别为f1(96×128)和f2(192×256),对应sparse特征和dense特征。f1和f2经过encoder网络之后得到enc_src1和enc_src2,尺寸相同。
2.生成分割图:enc_src1和enc_src2经过avg_pool+conv得到一个分割图split_map(12×8),将split_map插值得到分割图split_map_sparse(96×128)和split_map_dense(192×256)。(从代码中上可以看出,split_map_sparse是1减去插值结果得到的,所以split_map_sparse和split_map_dense是互斥的,也就是说,在split_map_sparse中的dense区域在split_map_dense中对应的区域是稀疏的。)
3.网格点获取:原始图像为768×1024,使用stride为8和4获取网格点,分别得到92×128和192×256个网格点索引,根据从input_pos_embed中拿到每个点的位置编码,形状为96×128和192×256,记为query_pos_embed1,query_pos_embed2。对应的点特征是从f1和f2中抽取出来,记为query_points_feature1和query_points_feature2。
4.网格点筛选:这个步骤有点复杂。以split_map_sparse为例,split_map_sparse形状为96×128,将从split_map_sparse分成8×12=96个rectangle,每一个rectangle包含8*16=128个像素,记为div_win(128×96×1),然后筛选大于0.5的像素并在第0维进行累加,对应代码“valid_div = (div_win > 0.5).sum(dim=0)[: , 0] 和v_idx = valid_div > 0 ”,v_idx是一个mask(96,)的(其中17个为false, 79个为true),也就是说在96个rectangle中,但只选择了79个rectangle。query_pos_embed1和query_points_feature1也同样分成96个rectangle,经过筛选后得到query_embed(128×79×256)和query_feats(128×79×256)。enc_src1也被分为96个rectangle,经过筛选后得到memory_win(128×79×256)。
5.Decoding:将上面的query_embed, query_feats,memory_win输入到decoder网络,获得10112(128×79)个输出点,预测10112个偏置,因为train阶段输入图像大小都是256*256,inference阶段输入图像大小各不相同,所以需要对10112个偏置进行rescale(根据256的倍数调整)。同样的操作,对于192×256(dense)特征图,生成4608个输出点。
6.合并预测结果:根据预测的分类标签值,分别从10112个输出点选出56个点,从4608个输出点中选择118个点,合并成174个点, 也就是最终的所有预测点。gt为172,计算mae=(174-172)=2, 计算mse=(174-172)^2=4。