AILab-CVC / YOLO-World

[CVPR 2024] Real-Time Open-Vocabulary Object Detection
https://www.yoloworld.cc
GNU General Public License v3.0
4.53k stars 443 forks source link

about deploy #106

Open xiyangyang99 opened 7 months ago

xiyangyang99 commented 7 months ago

在python deploy.py的时候,转onnx或者trt,报错的日志如下。模型是自己微调之后的。 Switch model to deploy modality. Process Process-2: Traceback (most recent call last): File "/home/bowen/anaconda3/envs/yolo8/lib/python3.8/multiprocessing/process.py", line 315, in _bootstrap self.run() File "/home/bowen/anaconda3/envs/yolo8/lib/python3.8/multiprocessing/process.py", line 108, in run self._target(*self._args, *self._kwargs) File "/home/bowen/anaconda3/envs/yolo8/lib/python3.8/site-packages/mmdeploy/apis/core/pipeline_manager.py", line 107, in call ret = func(args, **kwargs) File "/home/bowen/anaconda3/envs/yolo8/lib/python3.8/site-packages/mmdeploy/apis/pytorch2onnx.py", line 64, in torch2onnx data, model_inputs = task_processor.create_input( File "/home/bowen/anaconda3/envs/yolo8/lib/python3.8/site-packages/mmdeploy/codebase/mmdet/deploy/object_detection.py", line 217, in createinput data = testpipeline(data) File "/home/bowen/anaconda3/envs/yolo8/lib/python3.8/site-packages/mmcv/transforms/base.py", line 12, in call return self.transform(results) File "/home/bowen/anaconda3/envs/yolo8/lib/python3.8/site-packages/mmcv/transforms/wrappers.py", line 88, in transform results = t(results) # type: ignore File "/media/bowen/6202c499-4f0a-4280-af7e-d2ab4b6c74dd/home/bowen/YOLO-World-master/./yolo_world/datasets/transformers/mm_transforms.py", line 114, in call assert 'texts' in results or hasattr(self, 'class_texts'), ( AssertionError: No texts found in results. 03/06 22:50:35 - mmengine - ERROR - /home/bowen/anaconda3/envs/yolo8/lib/python3.8/site-packages/mmdeploy/apis/core/pipeline_manager.py - pop_mp_output - 80 - mmdeploy.apis.pytorch2onnx.torch2onnx with Call id: 0 failed. exit. 请问怎么解决?

xiyangyang99 commented 7 months ago

这个我解决了,上一个issue里回复你了。但这个解决之后,还会无尽地报问题,我挨着解决了两天了,还是有新问题

其他人有成功转出onnx or tensorrt的嘛?

wondervictor commented 7 months ago

在处理了,这两天会随一个新feature一并更新,大家可以把遇到的问题或者潜在的solution共享一下,感谢支持!

xiyangyang99 commented 7 months ago

在处理了,这两天会随一个新feature一并更新,大家可以把遇到的问题或者潜在的solution共享一下,感谢支持!

xiyangyang99 commented 7 months ago

在处理了,这两天会随一个新feature一并更新,大家可以把遇到的问题或者潜在的solution共享一下,感谢支持!

taofuyu commented 7 months ago

在处理了,这两天会随一个新feature一并更新,大家可以把遇到的问题或者潜在的solution共享一下,感谢支持!

  1. yolo_world的extract_feat()接口、yolo_world_head的predict()接口,形参和mmdeploy的接口不一样:extract_feat()多需要一个"batch_data_samples",predict()需要img_feat和txt_feature。这导致调用到这儿时就会报错。我把这儿按如下改了: x = self.extract_feat(batch_inputs) output = self.bbox_head.predict(x, data_samples, rescale=False) 改成 img_feats, txt_feats = self.extract_feat(batch_inputs, data_samples) output = self.bbox_head.predict(img_feats, txt_feats, data_samples, rescale=False) 当然也可以修改extract_feat()predict(),避免修改通用的mmdeploy。

2.用yolov8作为对比例子: yolo_world_head和yolov8_head都继承自yolov5_head,而yolov5_head的predict_by_feat()接口,为了部署,是有重写的,即yolov5_head__predict_by_feat()。 yolov8_head自身没有重写predict_by_feat()接口,因此会调用yolov5_head的predict_by_feat(),即在部署时也就调用了yolov5_headpredict_by_feat()。 而yolo_world_head不一样,是重写了predict_by_feat()的(虽然和yolov5_head的一字不差...),这就导致不会调用yolov5_headpredict_by_feat(),转换失败。 解决办法是删除predict_by_feat()即可。

这样我转换出来了一个onnx文件,但貌似其中包含了CLIP部分。你们的demo网站上,是可以一键deploy一个onnx文件出来的 而且融合了CLIP部分,不太清楚为什么相应功能在github仓里没有提供。

xiyangyang99 commented 7 months ago

在处理了,这两天会随一个新feature一并更新,大家可以把遇到的问题或者潜在的solution共享一下,感谢支持!

  1. yolo_world的extract_feat()接口、yolo_world_head的predict()接口,形参和mmdet的通用接口是不一样的:extract_feat()多需要一个"batch_data_samples",predict()需要img_feat和txt_feature。这导致调用到这儿时就会报错。我把这儿按如下改了: x = self.extract_feat(batch_inputs) output = self.bbox_head.predict(x, data_samples, rescale=False) 改成 img_feats, txt_feats = self.extract_feat(batch_inputs, data_samples) output = self.bbox_head.predict(img_feats, txt_feats, data_samples, rescale=False) 当然也可以修改extract_feat()predict(),避免修改通用的mmdeploy。

2.用yolov8作为对比例子: yolo_world_head和yolov8_head都继承自yolov5_head,而yolov5_head的predict_by_feat()接口,为了部署,是有重写的,即yolov5_head__predict_by_feat()。 yolov8_head自身没有重写predict_by_feat()接口,因此会调用yolov5_head的predict_by_feat(),即在部署时也就调用了yolov5_headpredict_by_feat()。 而yolo_world_head不一样,是重写了predict_by_feat()的(虽然和yolov5_head的一字不差...),这就导致不会调用yolov5_headpredict_by_feat(),转换失败。 解决办法是删除predict_by_feat()即可。

这样我转换出来了一个onnx文件,但貌似其中包含了CLIP部分。你们的demo网站上,是可以一键deploy一个onnx文件出来的 而且融合了CLIP部分,不太清楚为什么相应功能在github仓里没有提供。

大佬,我的报错也是你说的这样,我按你说的方法转了,我直接转的trt。

taofuyu commented 7 months ago

在处理了,这两天会随一个新feature一并更新,大家可以把遇到的问题或者潜在的solution共享一下,感谢支持!

  1. yolo_world的extract_feat()接口、yolo_world_head的predict()接口,形参和mmdet的通用接口是不一样的:extract_feat()多需要一个"batch_data_samples",predict()需要img_feat和txt_feature。这导致调用到这儿时就会报错。我把这儿按如下改了: x = self.extract_feat(batch_inputs) output = self.bbox_head.predict(x, data_samples, rescale=False) 改成 img_feats, txt_feats = self.extract_feat(batch_inputs, data_samples) output = self.bbox_head.predict(img_feats, txt_feats, data_samples, rescale=False) 当然也可以修改extract_feat()predict(),避免修改通用的mmdeploy。

2.用yolov8作为对比例子: yolo_world_head和yolov8_head都继承自yolov5_head,而yolov5_head的predict_by_feat()接口,为了部署,是有重写的,即yolov5_head__predict_by_feat()。 yolov8_head自身没有重写predict_by_feat()接口,因此会调用yolov5_head的predict_by_feat(),即在部署时也就调用了yolov5_headpredict_by_feat()。 而yolo_world_head不一样,是重写了predict_by_feat()的(虽然和yolov5_head的一字不差...),这就导致不会调用yolov5_headpredict_by_feat(),转换失败。 解决办法是删除predict_by_feat()即可。 这样我转换出来了一个onnx文件,但貌似其中包含了CLIP部分。你们的demo网站上,是可以一键deploy一个onnx文件出来的 而且融合了CLIP部分,不太清楚为什么相应功能在github仓里没有提供。

大佬,我的报错也是你说的这样,我按你说的方法转了,我直接转的trt。

主要是转的过程还应该融合CLIP

xiyangyang99 commented 7 months ago

在处理了,这两天会随一个新feature一并更新,大家可以把遇到的问题或者潜在的solution共享一下,感谢支持!

  1. yolo_world的extract_feat()接口、yolo_world_head的predict()接口,形参和mmdet的通用接口是不一样的:extract_feat()多需要一个"batch_data_samples",predict()需要img_feat和txt_feature。这导致调用到这儿时就会报错。我把这儿按如下改了: x = self.extract_feat(batch_inputs) output = self.bbox_head.predict(x, data_samples, rescale=False) 改成 img_feats, txt_feats = self.extract_feat(batch_inputs, data_samples) output = self.bbox_head.predict(img_feats, txt_feats, data_samples, rescale=False) 当然也可以修改extract_feat()predict(),避免修改通用的mmdeploy。

2.用yolov8作为对比例子: yolo_world_head和yolov8_head都继承自yolov5_head,而yolov5_head的predict_by_feat()接口,为了部署,是有重写的,即yolov5_head__predict_by_feat()。 yolov8_head自身没有重写predict_by_feat()接口,因此会调用yolov5_head的predict_by_feat(),即在部署时也就调用了yolov5_headpredict_by_feat()。 而yolo_world_head不一样,是重写了predict_by_feat()的(虽然和yolov5_head的一字不差...),这就导致不会调用yolov5_headpredict_by_feat(),转换失败。 解决办法是删除predict_by_feat()即可。 这样我转换出来了一个onnx文件,但貌似其中包含了CLIP部分。你们的demo网站上,是可以一键deploy一个onnx文件出来的 而且融合了CLIP部分,不太清楚为什么相应功能在github仓里没有提供。

大佬,我的报错也是你说的这样,我按你说的方法转了,我直接转的trt。

主要是转的过程还应该融合CLIP

我转出来用netron看了下图结构,有文本的部分。但是转出来的过程中,trt推理出来没有结果。里面有个算子mmdeploybatchedNMS不支持。