在一些人流量比较大的场合,或者是一些特殊时刻、时段、节假日等特殊时期下,密切关注当前系统所承载的人流量是十分必要的,对于超出系统负荷容量的情况做到及时预警对于管理团队来说是保障人员安全的重要手段,本文的主要目的是想要基于通用的数据开发构建用于通用场景下的人群检测计数系统。
首先看下实例效果:
本文是选择的比较经典的也是比较古老的YOLOv3来进行模型的开发,YOLOv3(You Only Look Once v3)是一种目标检测算法模型,它是YOLO系列算法的第三个版本。该算法通过将目标检测任务转化为单个神经网络的回归问题,实现了实时目标检测的能力。
YOLOv3的主要优点如下:
实时性能:YOLOv3采用了一种单阶段的检测方法,将目标检测任务转化为一个端到端的回归问题,因此具有较快的检测速度。相比于传统的两阶段方法(如Faster R-CNN),YOLOv3能够在保持较高准确率的情况下实现实时检测。
多尺度特征融合:YOLOv3引入了多尺度特征融合的机制,通过在不同层级的特征图上进行检测,能够有效地检测不同尺度的目标。这使得YOLOv3在处理尺度变化较大的场景时表现出较好的性能。
全局上下文信息:YOLOv3在网络结构中引入了全局上下文信息,通过使用较大感受野的卷积核,能够更好地理解整张图像的语义信息,提高了模型对目标的识别能力。
简洁的网络结构:YOLOv3的网络结构相对简洁,只有75个卷积层和5个池化层,使得模型较易于训练和部署,并且具有较小的模型体积。
YOLOv3也存在一些缺点:
较低的小目标检测能力:由于YOLOv3采用了较大的感受野和下采样操作,对于小目标的检测能力相对较弱。当场景中存在大量小目标时,YOLOv3可能会出现漏检或误检的情况。
较高的定位误差:由于YOLOv3将目标检测任务转化为回归问题,较粗糙的特征图和较大的感受野可能导致较高的定位误差。这意味着YOLOv3在需要较高精度的目标定位时可能会受到一定的限制。
YOLOv3是YOLO系列里程碑性质的模型,随着不断地演变和发展,目前虽然已经在性能上难以与YOLOv5之类的模型对比但是不可否认其做出的突出贡献。
这里是基于实验性的想法做的实践项目,简单看下数据集:
实例标注数据内容如下所示:
0 0.170084 0.496727 0.041938 0.070376
0 0.27726 0.243863 0.015843 0.032733
0 0.270736 0.278232 0.017707 0.02946
0 0.322926 0.220131 0.015843 0.031097
0 0.327586 0.241408 0.013979 0.031097
0 0.335042 0.226678 0.013979 0.027823
0 0.360205 0.249591 0.021435 0.037643
0 0.322926 0.279869 0.021435 0.032733
0 0.358341 0.227496 0.015843 0.032733
0 0.383504 0.192308 0.013979 0.03437
0 0.395154 0.222586 0.018639 0.036007
0 0.392358 0.264321 0.016775 0.04419
0 0.404939 0.268412 0.021435 0.045827
0 0.407735 0.186579 0.013979 0.02946
0 0.421249 0.193126 0.013048 0.036007
0 0.44548 0.178396 0.014911 0.026187
0 0.449674 0.187398 0.013979 0.031097
0 0.448742 0.234043 0.021435 0.042553
0 0.480895 0.238134 0.024231 0.04419
0 0.460391 0.153846 0.011184 0.022913
0 0.481827 0.145663 0.013048 0.026187
0 0.481361 0.198036 0.015843 0.02946
0 0.498136 0.184124 0.017707 0.03437
0 0.495806 0.211948 0.020503 0.03437
0 0.515377 0.215221 0.022367 0.037643
0 0.533085 0.177578 0.020503 0.040917
0 0.562442 0.130933 0.013979 0.02946
0 0.557316 0.157119 0.016775 0.032733
0 0.575489 0.179214 0.017707 0.04419
0 0.596925 0.149755 0.013979 0.02455
0 0.583411 0.139116 0.013048 0.02946
0 0.630941 0.131751 0.011184 0.027823
0 0.664026 0.131751 0.012116 0.027823
0 0.642591 0.149755 0.015843 0.027823
0 0.615564 0.155483 0.012116 0.02946
0 0.619292 0.205401 0.019571 0.040917
0 0.581081 0.229133 0.023299 0.042553
0 0.520037 0.298691 0.026095 0.050736
0 0.586207 0.297872 0.026095 0.052373
0 0.623952 0.244681 0.021435 0.047463
0 0.637465 0.312602 0.027959 0.055646
0 0.662162 0.209493 0.019571 0.03928
0 0.684063 0.213584 0.016775 0.040917
0 0.693383 0.153846 0.014911 0.02946
0 0.705033 0.144845 0.013979 0.031097
0 0.726934 0.136661 0.013048 0.027823
0 0.729264 0.169394 0.015843 0.03437
0 0.72507 0.205401 0.016775 0.04419
0 0.704567 0.226678 0.020503 0.047463
0 0.672414 0.247954 0.019571 0.047463
0 0.714352 0.273322 0.027027 0.052373
0 0.760485 0.135843 0.013048 0.026187
0 0.76561 0.162029 0.013979 0.036007
0 0.78192 0.156301 0.013048 0.031097
0 0.800559 0.167758 0.016775 0.03437
0 0.826654 0.157938 0.013048 0.027823
0 0.842498 0.174304 0.014911 0.03437
0 0.842032 0.203764 0.013979 0.037643
0 0.891892 0.165303 0.011184 0.02946
0 0.882106 0.175941 0.012116 0.031097
0 0.879776 0.198854 0.016775 0.03437
0 0.911929 0.230769 0.019571 0.0491
0 0.919851 0.261866 0.020503 0.052373
0 0.856477 0.257774 0.018639 0.047463
0 0.82479 0.228314 0.018639 0.040917
0 0.842964 0.319149 0.023299 0.055646
0 0.769338 0.207038 0.017707 0.047463
0 0.756291 0.236498 0.021435 0.05401
0 0.782386 0.259411 0.021435 0.05401
本文选择的是yolov3模型,如下:
# parameters
nc: 1 # number of classes
depth_multiple: 1.0 # model depth multiple
width_multiple: 1.0 # layer channel multiple
# anchors
anchors:
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
# darknet53 backbone
backbone:
# [from, number, module, args]
[[-1, 1, Conv, [32, 3, 1]], # 0
[-1, 1, Conv, [64, 3, 2]], # 1-P1/2
[-1, 1, Bottleneck, [64]],
[-1, 1, Conv, [128, 3, 2]], # 3-P2/4
[-1, 2, Bottleneck, [128]],
[-1, 1, Conv, [256, 3, 2]], # 5-P3/8
[-1, 8, Bottleneck, [256]],
[-1, 1, Conv, [512, 3, 2]], # 7-P4/16
[-1, 8, Bottleneck, [512]],
[-1, 1, Conv, [1024, 3, 2]], # 9-P5/32
[-1, 4, Bottleneck, [1024]], # 10
]
# YOLOv3 head
head:
[[-1, 1, Bottleneck, [1024, False]],
[-1, 1, Conv, [512, [1, 1]]],
[-1, 1, Conv, [1024, 3, 1]],
[-1, 1, Conv, [512, 1, 1]],
[-1, 1, Conv, [1024, 3, 1]], # 15 (P5/32-large)
[-2, 1, Conv, [256, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 8], 1, Concat, [1]], # cat backbone P4
[-1, 1, Bottleneck, [512, False]],
[-1, 1, Bottleneck, [512, False]],
[-1, 1, Conv, [256, 1, 1]],
[-1, 1, Conv, [512, 3, 1]], # 22 (P4/16-medium)
[-2, 1, Conv, [128, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]], # cat backbone P3
[-1, 1, Bottleneck, [256, False]],
[-1, 2, Bottleneck, [256, False]], # 27 (P3/8-small)
[[27, 22, 15], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]
等待训练完成后来整体看下结果详情:
感兴趣的话也都可以自行动手尝试下!