ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ccv 的 ICF 积分通道特征检测器:行人检测训练、软级联优化与 C API 实战指南

ccv 的 ICF 积分通道特征检测器:行人检测训练、软级联优化与 C API 实战指南 计算机视觉深度学习【免费下载链接】ccvC-based/Cached/Core Computer Vision Library, A Modern Computer Vision Library项目地址https://gitcode.com/gh_mirrors/cc/ccv点击查看免费下载ICFIntegral Channel Features积分通道特征是 ccv 中面向行人检测等刚性目标检测任务的核心模块本文基于仓库文档 doc/icf.rst 与 site/_posts/0000-01-01-ccv-icf.markdown结合 lib/ccv_icf.c、lib/ccv.h 及 bin/ 下的工具源码完整讲解 ICF 的原理、开箱即用的行人检测、自训练检测器的完整流程、软级联加速优化以及从训练到部署的全部 C API。读完本文你将掌握如何使用icfdetect检测行人、如何用icfcreate训练自己的 ICF 模型、如何用icfoptimize提速并能直接在 C 代码中调用 ccv 的 ICF 接口。ICF 是什么两篇奠基论文的工程化实现ICF 的思想最早由 Dollar 等人提出ccv 的文档明确指出其理论源头原始论文Integral Channel Features, P. Dollar, Z. Tu, P. Perona, and S. Belongie, BMVC 2009改进版本Pedestrian Detection at 100 Frames per Second, R. Benenson, M. Mathias, R. Timofte, and L. Van Gool, CVPR 2012以及Seeking the Strongest Rigid Detector, R. Benenson, M. Mathias, R. Timofte, and L. Van Gool, CVPR 2013。从源码注释看ccv 的实现定位是对 Viola-Jones 检测方法及其后续一系列增强的理论化整合并明确参考了改进论文中的方法同时借用了 WFSwidth first search树结构见 lib/ccv.h。就工作方式而言ICF 的核心是把图像变换到多个积分通道channel上再在通道的积分图上快速计算大量特征供级联分类器使用从而实现快速且鲁棒的刚性目标检测。原始论文将其称为最强的刚性检测器strongest rigid detectorccv 文档建议阅读上述论文以理解其理论依据——这是论文观点ccv 的实现与基准数据见下文实测小节。两种检测模式与 ccv 的取舍ccv 文档将 ICF 的运行方式分为两种模式模式一原始论文方式将输入图像缩放到不同尺度然后在每一层缩放图像上反复运行同一个分类器。这是缩放图像scale image的思路。模式二改进论文方式在同一张输入图像上运行多个在不同尺度上训练出来的分类器。这是缩放分类器scale the classifier的思路理论上更快。ccv 文档明确记录模式二虽然更快但作者无法获得合理的召回率/精确率因此实际以模式一为主。这一取舍在源码中也有对应结构——lib/ccv.h 定义了两种级联类型CCV_ICF_CLASSIFIER_TYPE_A 0x1对应ccv_icf_classifier_cascade_t即缩放图像型成员包含type、count、grayscale、margin、size注意 size 已包含 margin以及弱分类器数组weak_classifiersCCV_ICF_CLASSIFIER_TYPE_B 0x2对应ccv_icf_multiscale_classifier_cascade_t即缩放分类器型额外带有octave与内层cascade成员配套提供了ccv_icf_multiscale_classifier_cascade_new、ccv_icf_read_multiscale_classifier_cascade、ccv_icf_write_multiscale_classifier_cascade、ccv_icf_multiscale_classifier_cascade_free等 API见 lib/ccv.h。开箱即用的行人检测一条命令画出检测框ccv 仓库自带了训练好的行人检测模型pedestrian.icf位于 samples/pedestrian.icf。使用 bin/icfdetect.c 与 bin/icfdraw.rb 即可完成检测 可视化./icfdetect Your Image contains Pedestrians ../samples/pedestrian.icf | ./icfdraw.rb Your Image contains Pedestrians output.png执行后查看output.png所有行人都会被画上红色框。从 bin/icfdetect.c 的源码可以看到更多细节检测结果以文本行输出每行格式为x y width height confidence对应ccv_comp_t的rect与classification.confidence最后输出一行total : N in time Xms统计检测数量与耗时除了直接传入单张图片路径icfdetect还支持传入一个文本文件每行一个图片路径批量对列表中的每张图执行检测并输出带文件名的结果行适合后续接验证脚本检测时默认使用ccv_icf_default_params即min_neighbors2、threshold0、step_through2、interval8定义见 lib/ccv_icf.c。icfdraw.rb则负责把标准输入中的检测框通过 ImageMagick 的convert命令以亮绿色lime2 像素宽描边绘制到原图上。性能与准确率的实测基准ccv 文档给出了明确的实测数据供读者评估该模块的量级速度方面以缩放图像模式运行在 Core i7 3770K 上对 INRIA 2008 测试集检测耗时为real 2m19.18s user 2m16.30s sys 0m2.79s文档的结论是ICF 仍比 HOG 慢但比 libccv 自带的 DPM 实现快。准确率方面仓库提供的pedestrian.icf模型使用 INRIA 2008 训练数据集训练并额外加入了从 VOC2011 收集的 7542 张负样本模型训练尺寸为 31x74每侧保留 6px 边距。在 INRIA 2008 测试集上的结果是76.23% (52)判定规则为检测框与标注框的重叠面积大于两者中较大框面积的一半即视为真阳性true positive。这里的规则与验证脚本 bin/icfvldtr.rb 的实现一致——脚本中r1取两个框面积的较大者乘以 0.5r0 r1即计为命中。文档指出该召回率与 ccv 提供的 DPM 实现大体相当误报数也大致相同。需要说明以上数字是项目文档记录的实测结果具体到你的硬件、输入图像与模型会有差异仅作量级参考。训练自己的检测器icfcreate 全参数解析ccv 提供了专门的行人/刚性目标模型训练工具 bin/icfcreate.c。运行./icfcreate --help可以看到它支持的全部参数。如果你安装了 libdispatch 并正确启用ccv 会利用机器的全部 CPU 核心加速训练过程。数据准备训练 ICF 需要三份数据正样本列表--positive-list与--validate-list每行格式为file name center-x center-y horizontal-axis-length vertical-axis-length object-roll object-pitch object-yaw即图片文件名、目标中心 x/y、水平/垂直半轴长度、目标绕三轴的旋转角度。背景负样本列表--background-list一个纯文本文件每行一个不含目标的图片路径例如用以下命令从负样本目录生成find ../data/negs/*.jpg no-pedestrian.txt原始图像目录--base-dir让列表中的相对路径可以据此解析到真实文件。INRIA 行人数据集是官方推荐的训练来源但其标注格式与 ccv 要求的格式差异较大文档建议使用辅助脚本把 INRIA 标注提取为 ccv 格式的正样本列表。完整训练命令文档给出了一个可复现的训练命令示例./icfcreate --positive-list pedestrian.icf_samples --background-list no-pedestrian.txt --validate-list pedestrian.icf_test --negative-count 10000 --positive-count 10000 --feature-size 50000 --weak-classifier-count 2000 --size 30x90 --margin 10,10,10,10 --working-dir icf-data --acceptance 0.7 --base-dir ../data/INRIAPerson/Train/pos/该配置的含义级联分类器将进行 3 轮 bootstrapping从 50,000 个候选特征中池化筛选最终强分类器包含 2,000 个弱分类器。文档记录在配备 SSD/HDD 混合存储flashcache、32GiB 内存与 Core i7 3770K 的机器上完成这样一个分类器的训练需要约一天时间至少需要约 16GB 可用内存才能跑完整个流程。参数与默认值对照表结合 bin/icfcreate.c 的源码各参数含义及默认值如下参数含义默认值--positive-list正样本列表文件必填无--positive-count收集的正样本数可含随机形变无必填--background-list背景图片列表文件必填无--negative-countbootstrapping/初始化阶段收集的负样本数无必填--validate-list验证集列表用于软级联无必填--acceptance软级联时接受的验证样本百分比0--size目标尺寸格式WxH无必填--feature-size随机生成并池化的候选特征数0必填--weak-classifier-count提升模型中的弱分类器数量0必填--working-dir保存进度与产出模型的目录无必填--base-dir图片文件的基础目录无--grayscale0/1是否使用灰度忽略颜色0--margin提取目标时的边距格式left,top,right,bottom0,0,0,0--deform-shift平移形变范围像素1--deform-angle旋转形变范围度0--deform-scale尺度形变范围0.075--min-dimension单个 ICF 特征的最小尺寸2--bootstrap负样本采集的 bootstrap 阶段数3这些参数最终会填充为ccv_icf_new_param_t结构体并传入ccv_icf_classifier_cascade_new见 bin/icfcreate.c。训练过程中为加速负样本 bootstrap工具还会把检测器的step_through临时设为 4见 bin/icfcreate.c。训练完成后working-dir下的final-cascade文件就是可直接用于检测的模型文件bin/icfcreate.c 中的写模型逻辑。软级联优化icfoptimize 提速训练得到的final-cascade是完整强分类器直接检测较慢。ccv 提供了 bin/icfoptimize.c 来为级联设置合适的软级联阈值soft cascade thresholds让大量非目标窗口在早期阶段就被快速拒绝从而显著提速./icfoptimize --positive-list pedestrian.icf_test --classifier-cascade icf-data/final-cascade --acceptance 0.7 --base-dir ../data/INRIAPerson/Test/pos/--acceptance表示优化软级联阈值时接受的验证正样本百分比取值通常与训练时的--acceptance保持一致示例中均为 0.7即允许 70% 的正样本通过。从 bin/icfoptimize.c 的源码可见其完整流程先用ccv_icf_read_classifier_cascade读入模型调用ccv_icf_classifier_cascade_soft计算软级联阈值最后用ccv_icf_write_classifier_cascade写回原文件——即优化是就地覆盖模型的。C API 参考从训练到部署的完整接口ICF 模块的全部对外接口声明在 lib/ccv.h 的ccv_icf分组中实现位于 lib/ccv_icf.c。训练侧接口有硬性依赖GSL用于随机数/分布配合 libdispatch 可获得最大训练效率。训练ccv_icf_classifier_cascade_newccv_icf_classifier_cascade_t* ccv_icf_classifier_cascade_new( ccv_array_t *posfiles, int posnum, ccv_array_t *bgfiles, int negnum, ccv_array_t *testfiles, const char *dir, ccv_icf_new_param_t params);从给定的正样本与背景图训练一个新的 ICF 级联分类器各参数含义posfilesccv_file_info_t数组给出正样本及其位置posnum要使用的正样本数量可按需引入随机形变bgfilesccv_file_info_t数组给出背景图像negnum在 bootstrapping/初始化阶段收集的负样本数量testfilesccv_file_info_t数组给出验证样本及其位置dir保存训练进度的目录paramsccv_icf_new_param_t定义训练函数的各项行为。返回训练好的级联分类器。训练参数结构 ccv_icf_new_param_tacceptance软级联时被接受的验证样本百分比bootstrap 所用分类器bootstrap收集负样本的 bootstrap 次数deform_angle加入形变的旋转范围单位为弧度deform_scale加入形变的尺度变化范围deform_shift加入形变的平移范围单位为像素detectorccv_icf_param_t定义检测器的各项行为feature_size从中池化的 ICF 特征数量grayscale是否利用图像的颜色信息min_dimension单个 ICF 特征区域的最小尺寸sizeccv_size_t分类器的宽和高weak_classifier用于构造强分类器的弱分类器数量。检测参数结构 ccv_icf_param_tinterval全尺寸图像与半尺寸图像之间的插值层数。例如设为 2会在全尺寸与半尺寸之间生成 2 张中间图像得到全尺寸、5/6 尺寸、2/3 尺寸、1/2 尺寸共 4 个尺度min_neighbors0表示检测后不分组1表示对相互交叠的目标分组 1表示分组后仅保留至少有min_neighbors个交叠目标的组step_through检测时的步进尺寸。此外源码中ccv_icf_param_t还包含flags标志位与threshold阈值两个字段lib/ccv.h默认参数ccv_icf_default_params为min_neighbors2、threshold0、step_through2、interval8lib/ccv_icf.c。软级联ccv_icf_classifier_cascade_softvoid ccv_icf_classifier_cascade_soft( ccv_icf_classifier_cascade_t *cascade, ccv_array_t *posfiles, double acceptance);计算软级联阈值以提升级联分类器的检测速度。cascade为待优化阈值的已训练分类器posfiles为提供正样本位置的文件信息数组acceptance为优化阈值时被接受的正样本百分比。持久化读、写、释放ccv_icf_classifier_cascade_t* ccv_icf_read_classifier_cascade(const char *filename); void ccv_icf_write_classifier_cascade(ccv_icf_classifier_cascade_t *classifier, const char *filename); void ccv_icf_classifier_cascade_free(ccv_icf_classifier_cascade_t *classifier);ccv_icf_read_classifier_cascade从文件读取 ICF 分类器filename为包含训练好的 ICF 分类器的文件路径返回级联分类器若无有效分类器则返回 0。ccv_icf_write_classifier_cascade把分类器持久化到指定文件ccv_icf_classifier_cascade_free释放级联分类器的内存。训练产物final-cascade正是通过这些接口读写bin/icfcreate.c、bin/icfoptimize.c。检测ccv_icf_detect_objectsccv_array_t* ccv_icf_detect_objects( ccv_dense_matrix_t *a, void *cascade, int count, ccv_icf_param_t params);使用 ICF 级联分类器在给定图像中检测目标a输入图像ccv_dense_matrix_tcascade级联分类器数组count传入的级联分类器数量paramsccv_icf_param_t定义检测器行为。返回ccv_comp_t数组ccv_array_t包含各检测结果的矩形与置信度。文档特别建议如果有多个级联分类器尽量在一次调用中全部传入这样 ccv 会尝试优化整体检测性能多级联联合调度而不是逐个串行调用。模型内部结构从源码看特征与决策树从 lib/ccv.h 可以了解 ICF 模型的内部组织ccv_icf_feature_t一个特征由最多CCV_ICF_SAT_MAX值为 2个通道构成每个通道含 2 个积分图采样点sat[4]、通道权重alpha[2]与偏置betaccv_icf_decision_tree_t深度为 2 的决策树包含pass标记、3 个特征features[3]、2 个权重weigh[2]与一个threshold级联分类器中的weak_classifiers即这些决策树的数组count对应弱分类器总数。在通道计算侧lib/ccv_icf.c 使用查表法cubic root lookup table加速 RGB 到 LUV 的转换这也是 ICF 通道颜色通道 梯度通道工程化实现的一部分。在 ccv 服务框架中接入 ICF除命令行工具外仓库还提供了 serve/icf.c说明 ICF 检测器可以接入 ccv 的 HTTP 服务框架ccv serve将训练好的pedestrian.icf或自训练模型作为服务端检测能力暴露出来。若需要把 ICF 检测嵌入自有 C 程序直接复用上文所述的ccv_icf_read_classifier_cascadeccv_icf_detect_objectsccv_icf_classifier_cascade_free三段式流程即可与 bin/icfdetect.c 的做法一致。小结ICF 模块的完整使用链路可以概括为用icfcreate基于 INRIA 等数据集与自定义负样本训练级联模型 → 用icfoptimize依据验证集计算软级联阈值提速 → 用icfdetect/ccv_icf_detect_objects执行检测 → 用ccv_icf_write_classifier_cascade持久化模型供后续加载复用。仓库自带的 samples/pedestrian.icf 模型与 bin/ 下的四个工具icfdetect.c、icfcreate.c、icfoptimize.c、icfvldtr.rb、icfdraw.rb构成了从复现、训练、评估到部署的完整闭环是研究刚性目标检测与级联分类器工程化的实用参考实现。赞分享计算机视觉深度学习【免费下载链接】ccvC-based/Cached/Core Computer Vision Library, A Modern Computer Vision Library项目地址https://gitcode.com/gh_mirrors/cc/ccv点击查看免费下载相关推荐Vitest 浏览器模式 provider 配置全解析从内置 Playwright/WebdriverIO/Preview 到自定义浏览器驱动Vitest 浏览器模式 provider 配置全解析从内置 Playwright/WebdriverIO/Preview 到自定义浏览器驱动 browser计算机视觉深度学习Topcoat 路线图前瞻静态导出、Islands 与流式 SSR 三大方向深度解读Topcoat 路线图前瞻静态导出、Islands 与流式 SSR 三大方向深度解读 Topcoat 是一个面向 Rust 的全栈 Web 框架batter计算机视觉深度学习用iloader导入任意IPAiOS侧载App安装的完整操作指南用iloader导入任意IPAiOS侧载App安装的完整操作指南 iloader 是一款开源、免费且对新手非常友好的 iOS 侧载工具帮你一键导入任意 IP计算机视觉深度学习上一篇foobar2000终极美化指南5分钟打造专业级音乐播放器界面下一篇如何用Mermaid Live Editor轻松创建专业图表免费在线工具完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表