PaddleHub Faster R-CNN ResNet50-FPN COCO2017 目标检测模块安装、预测与 Serving 部署实战【免费下载链接】PaddleFormersPaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle.项目地址: https://gitcode.com/gh_mirrors/pa/PaddleFormers本篇技术指南以 PaddleHub 目标检测模块faster_rcnn_resnet50_fpn_coco2017为核心完整讲解该模块的模型结构、环境依赖、安装方式、命令行与 Python API 预测、推理模型导出以及 PaddleHub Serving 在线服务部署。读者学完后可以在自己的项目中直接调用该模块完成 COCO 80 类目标检测并掌握其数据预处理、后处理与结果可视化背后的源码实现原理。一、模型基本信息faster_rcnn_resnet50_fpn_coco2017是 PaddleHub 中基于 PaddlePaddle 实现的预训练目标检测模块其基本属性如下表所示属性说明模块名称faster_rcnn_resnet50_fpn_coco2017类别object detection目标检测网络faster_rcnn数据集COCO2017是否支持 Fine-tuning否模型大小161MB最新更新日期2021-03-15数据指标-从源码装饰器可以确认模块的元信息在 module.py 中moduleinfo标注了模块名faster_rcnn_resnet50_fpn_coco2017、版本1.1.0、类型cv/object_detection并说明其本质是 Baidus Faster-RCNN model for object detection, whose backbone is ResNet50, processed with Feature Pyramid Networks——即以 ResNet50 为骨干网络、配合特征金字塔网络FPN的 Faster R-CNN 检测器。模型原理简介Faster R-CNN 是经典的两阶段two-stage目标检测器其推理过程可分为特征提取、候选区域生成proposal、分类与精修classification and refinement几个阶段整体网络可以划分为四个部分基础卷积层骨干网络使用 ResNet-50 对输入图像提取多尺度特征区域生成网络RPN在特征图上生成可能包含目标的候选区域proposalRoI Align将不同尺寸的候选区域对齐为固定尺寸的特征检测层对候选区域进行分类并回归精修边界框位置。该模块在 MS-COCO2017 数据集上完成预训练目前仅支持预测文档明确标注 Fine-tuning supported or not: No不支持微调。二、环境依赖与安装1. 环境依赖使用该模块前需要确保满足以下依赖版本paddlepaddle 1.6.2paddlehub 1.6.0PaddleHub 的安装方式请参考 How to install PaddleHub。不同操作系统遇到安装问题时可分别参考 Windows_Quickstart、Linux_Quickstart、Mac_Quickstart。2. 安装模块执行以下命令从 PaddleHub 模型仓库安装该模块$ hub install faster_rcnn_resnet50_fpn_coco2017如需安装指定版本例如 1.1.0可显式指定版本号$ hub install faster_rcnn_resnet50_fpn_coco20171.1.0三、命令行预测安装完成后可以直接通过 PaddleHub 命令行对单张图片进行目标检测$ hub run faster_rcnn_resnet50_fpn_coco2017 --input_path /PATH/TO/IMAGEPaddleHub 命令行还支持通过--input_file传入包含多条图片路径的文本文件批量预测更完整的命令行指令说明请参考 PaddleHub Command Line Instruction。从源码看命令行入口由run_cmd实现module.py它通过add_module_config_arg注册--use_gpu、--batch_size两个配置参数通过add_module_input_arg注册--input_path、--input_file两个输入参数check_input_data会优先解析--input_path其次解析--input_file中的多行路径使用txt_parser逐行解析最终统一调用object_detectionAPI 完成预测。四、Python API 预测1. 预测代码示例在 Python 中加载模块并进行预测的完整示例import paddlehub as hub import cv2 object_detector hub.Module(namefaster_rcnn_resnet50_fpn_coco2017) result object_detector.object_detection(images[cv2.imread(/PATH/TO/IMAGE)]) # or # result object_detector.object_detection(paths[/PATH/TO/IMAGE])注意images方式需要传入 numpy 数组列表数组形状为[H, W, C]颜色通道为BGR即cv2.imread的默认输出格式paths方式直接传入图片路径字符串列表即可。2. object_detection API 详解object_detection是模块的核心预测接口其完整函数签名如下def object_detection(pathsNone, imagesNone, batch_size1, use_gpuFalse, output_dirdetection_result, score_thresh0.5, visualizationTrue)参数说明参数类型默认值说明pathslist[str]None图片路径列表imageslist[numpy.ndarray]None图片数据列表ndarray.shape 为 [H, W, C]BGR 格式batch_sizeint1batch 大小控制每次送入模型的图片数量use_gpuboolFalse是否使用 GPU若使用 GPU需先设置 CUDA_VISIBLE_DEVICES 环境变量output_dirstrdetection_result可视化结果图片的保存目录score_threshfloat0.5置信度阈值低于该阈值的检测框会被过滤visualizationboolTrue是否将检测结果保存为图片文件NOTEpaths和images两个参数只能选择其一提供数据不能同时使用。返回值reslist[dict]检测结果列表每个元素为 dict字段如下datalist检测结果list 中每个元素为 dictconfidencefloat识别置信度labelstr类别标签leftint边界框左上角 x 坐标topint边界框左上角 y 坐标rightint边界框右下角 x 坐标bottomint边界框右下角 y 坐标save_pathstr, optional识别结果保存路径仅当visualizationTrue时存在GPU 使用注意事项从源码module.py可以看到当use_gpuTrue时代码会强制检查环境变量CUDA_VISIBLE_DEVICES是否已正确设置否则抛出RuntimeError提示。因此在 GPU 推理前务必先执行$ export CUDA_VISIBLE_DEVICES0另外模块初始化时_set_config会同时根据CUDA_VISIBLE_DEVICES判断是否构建 GPU 预测器GPU 推理内存池初始大小设置为 500MBmodule.py。3. save_inference_model导出推理模型如需将模型导出为 Paddle Inference 格式供后续独立部署使用可调用def save_inference_model(dirname)dirname模型保存路径导出后会生成model.pdmodel网络结构与model.pdiparams模型参数两个文件。在 PaddleHub 基类中save_inference_model还支持model_filename、params_filename、input_spec、combined等更细粒度的参数paddlehub/module/module.py模块目录下的 test.py 也验证了导出后model.pdmodel与model.pdiparams文件确实生成。五、源码级解析预处理与后处理流程深入阅读模块源码可以完整还原一次预测的底层调用链帮助理解参数的实际作用。1. 数据预处理data_feed.pydata_feed.py 中的test_reader实现图像标准化与缩放颜色转换cv2.imread读入的 BGR 图像先转换为 RGB标准化按 ImageNet 统计的 mean[0.485, 0.456, 0.406]、std[0.229, 0.224, 0.225]先除以 255 再减均值除标准差等比例缩放目标短边target_size800同时限制长边不超过max_size1333据此计算缩放因子im_scale并做线性插值 resize输出三项张量imageCHW 排列的输入图像、im_info缩放后的高、宽与缩放因子、im_shape原始图像高、宽。在 module.py 的批处理循环中padding_minibatch会以coarsest_stride32将 batch 内图像 padding 到同一尺寸这是 FPN 多层下采样对齐步长的要求然后依次将三个输入张量拷贝到预测器的输入句柄并执行predictor.run()。2. 后处理与可视化processor.pyprocessor.py 中的postprocess负责解析模型原始输出通过data_out.lod()拆分 batch 内每张图片对应的检测行每行 6 个数值依次为category_id类别索引、confidence置信度、以及bbox的四个坐标置信度低于score_thresh的行被直接过滤类别索引经 label_file.txt 映射为可读的label字符串坐标经clip_bbox裁剪到图像尺寸范围内防止越界当visualizationTrue时调用draw_bounding_box_on_image使用 PIL 在原图上绘制红色边界框并在框上方绘制 label: 置信度百分比 文本最终保存到output_dir并返回save_path。值得说明的是label_file.txt完整收录了 COCO2017 数据集的 80 个目标类别外加 background涵盖 person、car、bicycle、dog、cat、traffic light、umbrella、sports ball 等常见类别这意味着该模块可直接检测自然场景中的绝大多数常见目标。六、PaddleHub Serving 服务部署PaddleHub Serving 可以将该目标检测模块部署为常驻的在线 HTTP 服务供业务系统远程调用。第一步启动 PaddleHub Serving执行启动命令$ hub serving start -m faster_rcnn_resnet50_fpn_coco2017服务化 API 即部署完成默认监听端口为 8866。NOTE若使用 GPU 预测需要在启动服务前先设置CUDA_VISIBLE_DEVICES环境变量否则无需设置。第二步发送预测请求服务启动后用以下 Python 代码发送 HTTP 请求并获取结果import requests import json import cv2 import base64 def cv2_to_base64(image): data cv2.imencode(.jpg, image)[1] return base64.b64encode(data.tostring()).decode(utf8) # Send an HTTP request data {images: [cv2_to_base64(cv2.imread(/PATH/TO/IMAGE))]} headers {Content-type: application/json} url http://127.0.0.1:8866/predict/faster_rcnn_resnet50_fpn_coco2017 r requests.post(urlurl, headersheaders, datajson.dumps(data)) # print prediction results print(r.json()[results])服务端将收到的 base64 图像解码后送入object_detection并把检测结果以 JSON 形式返回。这一流程对应模块源码中标注serving的serving_methodmodule.py它使用base64_to_cv2将请求中的 base64 字符串解码为 BGR 图像再调用object_detection(imagesimages_decode, **kwargs)完成推理并返回结构化结果。七、版本更新历史该模块共发布了三个版本演进历史如下1.0.0初始发布First release1.0.1修复 numpy 数据读取问题Fix the problem of reading numpy1.1.0移除 fluid APIRemove fluid api。如需安装指定历史版本可在安装命令中显式指定版本号$ hub install faster_rcnn_resnet50_fpn_coco20171.1.0八、测试与验证模块目录下的 test.py 提供了一套完整的 unittest 用例覆盖了主要使用场景可作为上手验证与回归测试的参考paths与images两种输入方式的预测结果一致性校验visualizationFalse时不保存图片的预测路径无效路径paths[no.jpg]触发AssertionError、非法图像数据images[test.jpg]触发cv2.error的异常路径测试save_inference_model导出模型文件的存在性验证。测试中对检测结果的断言label 为cat、置信度大于 0.5、边界框坐标落在合理范围内直观展示了object_detection返回结果的结构化字段用法开发者可以据此快速理解返回值中label、confidence、left/top/right/bottom各字段的含义。综上faster_rcnn_resnet50_fpn_coco2017是一个开箱即用的两阶段目标检测模块通过hub install一键安装hub run或object_detectionAPI 完成单图/批量预测save_inference_model导出推理模型hub serving start快速上线 HTTP 服务。结合仓库内的源码开发者还能深入掌握其图像预处理、阈值过滤、边界框可视化等底层实现便于后续按业务需求二次封装或接入生产系统。【免费下载链接】PaddleFormersPaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle.项目地址: https://gitcode.com/gh_mirrors/pa/PaddleFormers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考