在我的问题中,我想将图像中的人与其他形状区分开来,例如,我想准确地知道图像的特定区域中有多少人(至少对于少数人,对于拥挤的地方,得到更差的结果是合理的)。
在 OpenCV 中有三种预训练数据集的方法。两种基本的 HOGs + SVM 算法(一种在 inria 上训练,另一种在 daimler 数据集上训练)和我也用于 inria 数据集的 DPM 方法。模型在大小为 64x128(inria)和 48x96(戴姆勒)的行人图像上进行训练。
我一直在对包含两个人的视频文件进行测试,但这些人是站着或坐着的。根据我的观察,我可以说:
- DPM 是最好的算法,但它确实很慢。它可以检测人的坐姿。
- HOG非常依赖于规模,例如在戴姆勒数据集上训练的svm在小分辨率下效果更好(在我的情况下为180p,因为相机离人很近),但对于inria结果更糟
- 当完整的人形清晰可见时,HOG 效果更好
- 戴姆勒给出了很多误报
结果与预期相符,因为模型是针对站立的行人进行训练的,但即使人们站立时,准确性也很差。基本上我需要训练自己的模型,但我担心对规模的如此强烈的依赖以及对使用这些方法的怀疑。
我正在考虑使用 CNN,但我的目标设备有 ARM cpu ( https://www.mediatek.com/products/homeNetworking/mt7623n-a )。我不需要这种检测来实时工作,我将只向网络提供一部分图像(小于 480p)。
你认为这样的网络可以在这样的 cpu 上以良好的性能工作吗?您对我可以尝试的网络类型、库(c++)有什么建议吗?
更新
我正在试验 OpenCV 的 DNN 模块和 yolov3-tiny。它在约 2 秒内处理整个帧并且不使用大量内存(在我的目标设备上)。我对预测非常满意。当然,full yolo 比 tiny 版本要好,但速度要慢得多,并且消耗大量 ram。
我对存在的模型数量和他们接受训练的数据集感到困惑。Caffe Zoo 有很多,但是我发现例如 GoogleNet 没有 person 类,所以这就是我选择 yolo 进行测试的方式。但是 Yolo 也可用于 COCO 或 VOC,我只需要对人进行分类,而不是对狗等进行分类。
我仍然需要在 opencv 中试验输入参数,看看它们如何影响性能和准确性。
我也在考虑为人类重新训练 yolo,也许只有这样我才能达到完整 yolo 的准确性和小型 yolo 的性能。你怎么看?一般来说,使用 COCO 或 VOC 数据集更好吗?