最近在研究人群聚集检测,顾名思义是指当一定范围里的人数大于某个值时,提示出现人群聚集的情况。因此怎么快速精确的实现对一定范围里的人员计数,是进行人群聚集检测的重点。
Aditya Vora分享了一种可以快速准确检测人头的算法并开源了代码,关于此算法的介绍可以参考Aditya Vora的论文《FCHD: A fast and accurate head detector 》。
论文地址
代码地址
因此先尝试将FCHD运行起来,检测人头吧!
1 人头检测算法部署
1.1 下载项目代码
下载项目代码至本机上。
1.2 安装依赖包
1)安装pytorch,这里可以根据自己的cuda版本选择pytorch版本,我用的是cuda10.1
pip install torch==1.6.0+cu101 torchvision==0.7.0+cu101 -f https://download.pytorch.org/whl/torch_stable.html
2)安装visdom
pip install visdom
3)安装cupy
这里值得注意的是, CuPy(A NumPy-compatible array library accelerated by CUDA)是NumPy兼容多维数组在CUDA上的实现,因此安装时需要根据cuda版本安装
# For CUDA 10.1
pip install cupy-cuda101
运行之后,如果有报错“ImportError: CuPy is not correctly installed.”,可以参考下面这个方法进行调试
ImportError: CuPy is not correctly installed解决方法
4)安装其他需要的依赖包,如matplotlib、scikit-image、opencv-python等,这里是我目前用到的依赖包,供参考:
certifi == 2020.12.5
chardet == 4.0.0
cupy-cuda100 == 8.5.0
cycler == 0.10.0
decorator == 4.4.2
fastrlock == 0.5
future == 0.18.2
idna == 2.8
imageio == 2.9.0
jsonpatch == 1.32
jsonpointer == 2.1
kiwisolver == 1.3.1
matplotlib == 3.3.4
networkx == 2.5
numpy == 1.20.1
opencv-python == 4.5.1.48
Pillow == 8.1.2
pyparsing == 2.4.7
python-dateutil == 2.8.1
PyWavelets == 1.1.1
pyzmq == 22.0.3
requests == 2.25.1
scikit-image == 0.18.1
scipy == 1.6.1
six == 1.15.0
tifffile == 2021.3.17
torch == 1.6.0+cu101
torchfile == 0.1.0
torchnet == 0.0.5.1
torchvision == 0.7.0+cu101
tornado == 6.1
urllib3 == 1.26.4
visdom == 0.1.8.9
websocket-client == 0.58.0
1.3 下载训练模型
我这里直接用的作者训练好的模型,下载训练模型放到checkpoints
文件夹中。
2 算法运行
前序工作准备好了,那么事不宜迟,看下FCHD算法运行效果吧(p≧w≦q)~
不出意外果然出现了各种报错…
1、ModuleNotFoundError: No module named 'torchnet’
解决方法如下:
pip install git+https://github.com/pytorch/tnt.git@master
2、FileNotFoundError: [Errno 2] No such file or directory: '/home/aditya-tyco/Desktop/aditya_personal_projects/head_detection_v5/data/pretrained_model/vgg16_caffe.pth’
解决方法如下:
下载vgg_16_caffe.pth,保存在data/pretrained_model
文件夹中。同时在config.py文件中,将预训练模型的路径修改为我们自己的路径。
caffe_pretrain_path = './data/pretrained_model/vgg16_caffe.pth'
3、检查结果边界框位置不准确
注:图片为网上下载,侵删~
解决方法如下:
参考了这位博主的方法FCHD: A fast and accurate head detector快速准确的人头检测代码预测出来的边界框位置不准确的解决方法
我也在这里记录一下,对head_detection_demo.py文件中代码进行修改,一共修改两处:
1)第28行
f.convert('RGB')
img_raw = f.copy()
# img_raw = np.asarray(f, dtype=np.uint8)
img = np.asarray(f, dtype=np.float32)
_, H, W = img.shape
img = img.transpose((2,0,1))
img = preprocess(img)
_, o_H, o_W = img.shape
scale = o_H / H
img_raw = img_raw.resize((o_W, o_H), Image.ANTIALIAS)
return img, img_raw, scale
2)第54行
for i in range(pred_bboxes_.shape[0]):
ymin, xmin, ymax, xmax = pred_bboxes_[i,:]
# utils.draw_bounding_box_on_image_array(img_raw, ymin, xmin, ymax, xmax)
utils.draw_bounding_box_on_image(img_raw, ymin, xmin, ymax, xmax)
再次运行
运行成功!不过可以看出识别结果并不是那么好,具体还要再调一下参数或者自己训练数据看下了~