1.BL模型是什么
BL指的是Bayesian Loss,是论文《Bayesian Loss for Crowd Count Estimation with Point Supervision》中提出来的一种损失函数,可用于密度图计数模型。
论文中提到,传统方法需要从点标注生成全图“伪真值标签”,论文中则放弃了这个带来显著噪声和虚假信号的做法,改为从估计的概率密度图上进行期望计算,直接与“真值点标注”进行回归估计,如下图所示,下图是论文作者发在知乎上的博客中的图,对于Bayesian Loss的具体介绍,可见原作者发的文章:https://zhuanlan.zhihu.com/p/127956794,
官方提供的源代码:https://github.com/ZhihengCV/Baysian-Crowd-Counting.

本博客主要介绍数据预处理阶段的一些方法,至于一些具体的神经网络结构等会在后续的博客中介绍。
2 ShanghaiTech数据集介绍
shanghaiTech数据集是一个用于行人计数的数据集,里面包含了大量的人群图片,它由两部分组成:part_A_final文件夹 和 part_B_final文件夹,它们内部都由 train_data 和 test_data 两部分组成,意思为训练集和测试集,对于train_data 和 test_data 其中包括 images 和 ground_truth,images储存着图片文件、ground_truth里储存着对应的标注文件,一张图片对应一个标注文件。
shanghaiTech结构如下图所示:
为了方便后续的处理,本文模仿UCF数据集的结构,将shanghaiTech数据集分为了PA和PB两部分,每部分的train、val、test文件夹存放的是训练集验证集和测试集,训练集取原train_data的所有数据,验证集取原train_data的后10%数据,测试集取原test_data的所有数据,最后本文不再像原shanghaiTech数据集那样把图片和标注文件分开两个images和ground_truth文件夹分开放,而是把图片和标注文件放到了一个文件夹中,具体结构如下图所示:

3 官方数据预处理代码介绍
官方代码提供的preprocess_dataset.py是对UCF数据集进行处理的,它会将UCF数据集分为train、val、test三部分,并且三部分生成的标注文件的结构有所不同,在制作自己的数据集时需要注意,代码已经写的比较清晰了,我再对一些地方进行说明:1.train、val、test三部分的处理有所不同。2.代码会对分辨率过大的图像进行缩放。3.官方将训练集和验证集的图片名放到了相对应的txt文件,在分区时会读取txt文件,preprocess_dataset.py代码如下:
from scipy.io import loadmat
from PIL import Image
import numpy as np
import os
from glob import glob
import cv2
import argparse
def cal_new_size(im_h, im_w, min_size, max_size):
if im_h < im_w:
if im_h < min_size:
ratio = 1.0 * min_size / im_h
im_h = min_size
im_w = round(im_w*ratio)
elif im_h > max_size:
ratio = 1.0 * max_size / im_h
im_h = max_size
im_w = round(im_w*ratio)
else:
ratio = 1.0
else:
if im_w < min_size:
ratio = 1.0 * min_size / im_w
im_w = min_size
im_h = round(im_h*ratio)
elif im_w > max_size:
ratio = 1.0 * max_size / im_w
im_w = max_size
im_h = round(im_h*ratio)
else:
ratio = 1.0
return im_h, im_w, ratio
def find_dis(point):
square = np.sum(point*points, axis=1)
dis = np.sqrt(np.maximum(square[:, None] - 2*np.matmul(point, point.T) + square[None, :], 0.0))
dis = np.mean(np.partition(dis, 3, axis=1)[:, 1:4], axis=1, keepdims=True)
return dis
def generate_data(im_path):
im = Image.open(im_path)
im_w, im_h = im.size
mat_path = im_path.replace('.jpg', '_ann.mat')
points = loadmat(mat_path)['annPoints'

文章介绍了BL模型,一种用于密度图计数的损失函数,避免了传统方法的噪声问题。同时详细阐述了ShanghaiTech数据集的结构和预处理过程,包括数据集的划分、图片及标注文件的处理。还提供了官方预处理代码的解析,并展示了如何修改代码以适应ShanghaiTech数据集的预处理需求。
最低0.47元/天 解锁文章
3297





