PaddlePaddle / PaddleDetection

Object Detection toolkit based on PaddlePaddle. It supports object detection, instance segmentation, multiple object tracking and real-time multi-person keypoint detection.
Apache License 2.0
12.82k stars 2.89k forks source link

🌟 PP-PicoDet已发布,欢迎大家试用&讨论 #4420

Closed yghstill closed 2 years ago

yghstill commented 3 years ago

PP-PicoDet是轻量级实时移动端目标检测模型,我们提出了从小到大的一系列模型,包括S、M、L等,超越现有SOTA模型。

模型特色:

链接:

欢迎大家试用,有疑问欢迎讨论盖楼~

和其他模型对比:

picodet_map2

FAQ汇总: (持续更新中)

为了方便大家交流沟通,欢迎扫码添加微信群,继续交流有关PP-PicoDet的使用及建议~

ghost commented 3 years ago

PaddlePaddle=2.2.0明天才发布对吧,找了半天好像没地方安装

yghstill commented 3 years ago

PaddlePaddle=2.2.0明天才发布对吧,找了半天好像没地方安装

@Xwmiss 嗯嗯,今天刚打tag,这两天发布安装包后我再同步,可以先使用dev版本Paddle:https://www.paddlepaddle.org.cn/install/quick?docurl=/documentation/docs/zh/develop/install/pip/linux-pip.html

ghost commented 3 years ago

PaddlePaddle=2.2.0明天才发布对吧,找了半天好像没地方安装

@Xwmiss 嗯嗯,今天刚打tag,这两天发布安装包后我再同步,可以先使用dev版本Paddle:https://www.paddlepaddle.org.cn/install/quick?docurl=/documentation/docs/zh/develop/install/pip/linux-pip.html

好的好的👍

yghstill commented 3 years ago

@Xwmiss

  1. pretrain_weights是用来设置预训练权重,确认下路径是否正确,下载是下载模型权重还是数据集,如果是数据集,请修改config/datasets/coco_detection的路径
  2. weights指向训练最后保存权重的路径。
  3. snapshot_epoch这里设置的话,优先级比runtime.yml高
  4. cycle_epoch是指Cycle-EMA中reset的epoch数,EMA会在固定epoch数时重新reset。
ghost commented 3 years ago

image 请问我在使用上诉命令进行训练时,如果同时给定了--slim_config,好像模型是不在训练的,这是因为训练和量化两个步骤要分开吗? 感谢你的回复!

yghstill commented 3 years ago

@Xwmiss 应该先训练好模型,再配置slim_config中的pretain_weights为训好的fp32模型,再进行量化训练。 现在默认的指令会下载训好的COCO上的预训练模型 进行量化训练。

ghost commented 3 years ago

十分感谢您的回复!👍

yu937861 commented 3 years ago

训练报错 配置文件 python tools/train.py -c configs/picodet/picodet_l_416_coco.yml

报错行 File "PaddleDetection/ppdet/modeling/heads/simota_head.py", line 351, in featmap.shape[-2] * featmap.shape[-1] for featmap in cls_scores AttributeError: 'list' object has no attribute 'shape'

yghstill commented 3 years ago

@yu937861 Fixed in #4438,拉取下最新代码试下吧

ChinaRush commented 3 years ago

picodet有VOC格式配置文件吗

lyuwenyu commented 3 years ago

@ChinaRush ppdet支持的 这个和模型关系不是很大可以自己配一下的datasets 或者 转成coco跑 在tools里有工具

yu937861 commented 3 years ago

@yu937861 Fixed in #4438,拉取下最新代码试下吧

感谢

thenighthunter0 commented 3 years ago

你好,下面问题可能是什么原因呢。按照third_engine/demo_openvino教程做的,电脑的openvino跑其他模型是可以的 问题:picodet third_engine/demo_openvino 模型输出为空,可视化无检测框,只有原图 描述: picodet_m_416.bin start init model success picodet min = 14.95 max = 15.65 avg = 15.47 找到原因了: resize_uniform(image, resized_img, cv::Size(320, 320), effect_roi); auto detector = PicoDet("../weight/picodet_m_416.xml"); 修改为416,不知道是模型精度问题,还是后处理映射的问题 image

gaorui999 commented 3 years ago

训练后报错提示: AttributeError: 'list' object has no attribute 'shape'

yghstill commented 3 years ago

@gaorui999 这个问题已解,请更新最新代码就行。

yu937861 commented 3 years ago

训练 python tools/train.py -c configs/picodet/picodet_l_416_coco.yml

自己的数据集,训练完后eval ap50精度只有0.224, 配置文件也只改了num_classes, 是还有哪里需要改的吗

yghstill commented 3 years ago

@yu937861 您自己的数据集多大呢?默认的预训练只有Backbone在Imagenet上的,由于移动端模型收敛较慢,如果您数据集较小,建议pretrain_weights直接加载COCO上训好的权重,这样迁移学习会加快模型的收敛。

Xiaoyw1998 commented 3 years ago

为什么 picodet_l 的 epoch=250,而 CosineDecay 的 max_epochs=300,二者不应该是相同的吗

yu937861 commented 3 years ago

@yu937861 您自己的数据集多大呢?默认的预训练只有Backbone在Imagenet上的,由于移动端模型收敛较慢,如果您数据集较小,建议pretrain_weights直接加载COCO上训好的权重,这样迁移学习会加快模型的收敛。

好的我再试一下,谢谢

yghstill commented 3 years ago

为什么 picodet_l 的 epoch=250,而 CosineDecay 的 max_epochs=300,二者不应该是相同的吗

@Xiaoyw1998 PicoDet-l的模型较大,会提前收敛到最优mAP,所以总得epoch调小成250。

yghstill commented 3 years ago

@ChinaRush PicoDet的VOC配置已发布,可以参考:https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.3/configs/picodet/picodet_s_320_voc.yml

zwhua006 commented 3 years ago

想问一下,cycle-epochs应该是一个经验值,那如果训练轮数不再是250,而是150或者更少的话,适合多少呢,这一设置是否有明显的影响对于结果?

thenighthunter0 commented 3 years ago

你好,picodet_s_coco,转换为openvino成功,但是使用third_engine/demo_openvino调用,报错如下: start init model success begin inferenceterminate called after throwing an instance of 'InferenceEngine::GeneralError' what(): Cannot find blob with name: save_infer_model/scale_4.tmp_1 Aborted (core dumped)

yghstill commented 3 years ago

想问一下,cycle-epochs应该是一个经验值,那如果训练轮数不再是250,而是150或者更少的话,适合多少呢,这一设置是否有明显的影响对于结果?

@zwhua006 cycle_epoch这个参数是控制Cycle-EMA中的reset的epoch间隔数,我们实验中证明40是一个不错的设置。训练轮数的话需要看模型的收敛情况,在COCO上我们默认设置了300或250epoch.

yghstill commented 3 years ago

@thenighthunter0 我们openvino的问题再认真排查下~

17076372880 commented 3 years ago

image

请问,为什么会出现这个问题,上面显示coco数据都已经读进来了,但是下面显示没有coco数据。

yghstill commented 3 years ago

@17076372880 先读入的是EvalReader中COCO 验证集,然后读入训练集,确认下dataset/coco/annotations/train_anno.json是否存在。

17076372880 commented 3 years ago

@17076372880 先读入的是EvalReader中COCO 验证集,然后读入训练集,确认下dataset/coco/annotations/train_anno.json是否存在。

这个是存在的,数据集和配置文件(coco_detection.yml)都是之前跑2.1版本的yolo v3的,之前是没啥问题的。

17076372880 commented 3 years ago

@17076372880 先读入的是EvalReader中COCO 验证集,然后读入训练集,确认下dataset/coco/annotations/train_anno.json是否存在。

这个是存在的,数据集和配置文件(coco_detection.yml)都是之前跑2.1版本的yolo v3的,之前是没啥问题的。

已解决,是coco中的Segmentation的问题。

17076372880 commented 3 years ago

关于学习率的设置是怎么设置的? 单卡训练的话,学习率如何修改? picodet_coco.yml 中的学习率和optimize.yml 中的学习率各自的效果是啥,如何设置呢?谢谢。 image image

yghstill commented 3 years ago

@17076372880

  1. 学习率的话和GPU卡数和batch size都有关系,发布的配置文件基本都是4卡GPU训练的,例如:变成单卡,请学习率除以4,如果batch size从80变成40,请学习率再除以2。
  2. 一般picodet_x_coco.yml中的配置优先级高优base中配置,picodet_x_coco.yml中的所有设置会覆盖base中配置,所以修改picodet_x_coco.yml的配置即可。
lyuwenyu commented 3 years ago

@17076372880 LR这块我们才用的是 线性伸缩准则

image

具体细节可以参考文献 https://arxiv.org/pdf/1706.02677.pdf

zwhua006 commented 3 years ago

如果我想修改保存best的方式,请问在哪里修改,我想按照map0.5进行保存

lyuwenyu commented 3 years ago

@zwhua006 下边这块逻辑里 https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.3/ppdet/engine/callbacks.py#L183

ncbnwk commented 3 years ago

你好,我按照PaddleInference demo Python部署,前后处理用时在10ms左右,请问怎么缩短这部分时间呢?

yghstill commented 3 years ago

你好,我按照PaddleInference demo Python部署,前后处理用时在10ms左右,请问怎么缩短这部分时间呢?

@13857660548 前处理主要是图片读入耗时严重,可以改为直接输入numpy数据,后处理目前是对BBox的解码+NMS,这部分耗时可以通过调大相应NMS的阈值来解决。

ncbnwk commented 3 years ago

你好,我按照PaddleInference demo Python部署,前后处理用时在10ms左右,请问怎么缩短这部分时间呢?

@13857660548 前处理主要是图片读入耗时严重,可以改为直接输入numpy数据,后处理目前是对BBox的解码+NMS,这部分耗时可以通过调大相应NMS的阈值来解决。

改为numpy输入后,预处理时间还是比较久,请问这一部分时间还能继续减少吗? <__main__.Resize object at 0x7f39649ecc50> time: 0.001306295394897461 <__main__.NormalizeImage object at 0x7f3958062be0> time: 0.006364583969116211 <__main__.Permute object at 0x7f3958062a90> time: 0.0004088878631591797 <__main__.PadStride object at 0x7f39580625f8> time: 0.0004329681396484375

yghstill commented 3 years ago

@13857660548 剩下的预处理的操作都是必须的了,去除不了。

yghstill commented 3 years ago

@thenighthunter0 openvino问题已在 #4473 中修复,请拉取最新代码再试下吧。

gaorui999 commented 3 years ago

ESNet中的channel_scales这个参数是用来做什么的?

zwhua006 commented 3 years ago

首先我使用deploy/python/infer中的DetectorPicoDet进行推理时间为0.69s左右,然而使用yolov5s的pt进行推理时间为0.009s.对于DetectorPicoDet我指定了GPU进行推理,并未使用tensorrt进行推理,差别很大。 我的推理代码: img_path = 'demo/000002.jpg' input_image = cv2.imread(img_path) model_dir = 'inference_model/picodet_l_640_coco' pred_config = PredictConfig(model_dir) detect = DetectorPicoDet(pred_config,model_dir,device='GPU') results = detect.predict([input_image],0.8) 我在yolov5s前处理只使用了letterbox,但是我发现picodet前处理花费了大概0.01s,并不是主要的因素

之后我使用infer传入图片,不再是numpy数组,推理时间preprocess_time(ms): 38.90, inference_time(ms): 14.60, postprocess_time(ms): 14.90,依旧远远超过yolov5s的推理时间。 对于yolov5s,我使用的是相同的nms阈值,前处理部分仅仅使用letterbox,也是在gpu进行推理。 1.我想知道论文中所提到的速度超过yolov5s 44%是如何进行推理? 2.为什么我传入图片和numpy数组差别这么大?我该如何才能达到与yolov5s相同的推理时间8ms左右? 3.我尝试直接在infer_yaml修改尺寸,但是推理失败,我该如何修改推理时的尺寸。 4.关于propress部分,如果我想删除或者修改其操作,应该在哪一部分修改。直接修改infer_cfg文件一直报错

yghstill commented 3 years ago

ESNet中的channel_scales这个参数是用来做什么的?

@gaorui999 channel_scales这个参数用来控制ESNet中NAS算法搜出来的每个block的channel裁剪率。

yghstill commented 3 years ago

@zwhua006

  1. 关于在GPU上的推理时间:PP-PicoDet是移动端模型,我们paper中的比较结果都是在骁龙865手机上实测速度对比,测试程序为:https://github.com/JiweiMaster/MobileDetBenchmark ,YOLOv5s和PP-PicoDet我们没有直接在GPU上比较过两者的差别,在CPU和GPU上的优化工作接下来也会进一步尝试。(比如dw5x5卷积等在GPU上支持不友好等问题)
  2. infer_yaml的尺寸和模型input是匹配的,只修改infer_yaml是不行的,在模型导出时需要设置,具体的,修改TestReader 中的image_shape 后再导出即可:https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.3/configs/picodet/_base_/picodet_416_reader.yml#L32
songh11 commented 3 years ago

@zwhua006

  1. 关于在GPU上的推理时间:PP-PicoDet是移动端模型,我们paper中的比较结果都是在骁龙865手机上实测速度对比,测试程序为:https://github.com/JiweiMaster/MobileDetBenchmark ,YOLOv5s和PP-PicoDet我们没有直接在GPU上比较过两者的差别,在CPU和GPU上的优化工作接下来也会进一步尝试。(比如dw5x5卷积等在GPU上支持不友好等问题)
  2. infer_yaml的尺寸和模型input是匹配的,只修改infer_yaml是不行的,在模型导出时需要设置,具体的,修改TestReader 中的image_shape 后再导出即可:https://github.com/PaddlePaddle/PaddleDetection/blob/release/2.3/configs/picodet/_base_/picodet_416_reader.yml#L32

请问导出onnx模型修改尺寸是否只修改TestReader的image_shape,是否需要修改Resize中的target_size

yghstill commented 3 years ago

@songh11 只需要修改TestReader的image_shape即可。

songh11 commented 3 years ago

@songh11 只需要修改TestReader的image_shape即可。

感谢回复,我目前在做高通845上的移植,发现在dsp推理耗时占yolov5s的2/3左右

yghstill commented 3 years ago

感谢回复,我目前在做高通845上的移植,发现在dsp推理耗时占yolov5s的2/3左右

@songh11 是PicoDet-L-640模型吗?

gaorui999 commented 3 years ago

在相同lr=0.01,epoch=100情况下,同样没有使用预训练参数在划分相同的数据集上开始训练。 yolov3_mobilenet_v3_large_270e_voc的mAP=83%,训练时长4个小时 PicoDet-L-640 的mAP=78%,训练时长6个小时

这是为什么呢,怎么能提高picodet的mAP?

songh11 commented 3 years ago

感谢回复,我目前在做高通845上的移植,发现在dsp推理耗时占yolov5s的2/3左右

@songh11 是PicoDet-L-640模型吗?

是这个模型,只修改了一些高通snpe不支持的算子

yghstill commented 3 years ago

@gaorui999 PicoDet采用lr cosine策略,会从base_lr开始逐渐下降,将起始学习率适当调大再试下呢?按照上面FAQ中的比例调整下。