AILab-CVC / YOLO-World

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

推理时如何移除text encoder呢,离线词汇表具体含义,预训练模型中yolo-world-l-clip和yolo-world-l有啥区别呀 #262

Open JasonLiJin opened 5 months ago

JasonLiJin commented 5 months ago
  1. 想在端侧部署推理服务,可以移除clip的text model吗?2. 推理时的offline 词汇表是指推理时已经编码过的词汇不需要重新encode吗?3. 预训练模型中yolo-world-l-clip和yolo-world-l有啥区别呀
wondervictor commented 5 months ago

Hi @JasonLiJin,

  1. 端侧推理,我们是推荐移除CLIP,有两种方式,一种是提前计算好相应类别的embeddings, 可以采用我们提供的脚本 generate_text_prompts. 然后使用YOLOWorldPromptDetector(不带text encoder);第二种方式是采用YOLOWorldDetector中的reparameterize实现编码并写入到model中,之后可以去除text encoder;这部分可以参考我们提供的export_onnx.py
  2. 推理的offline vocabulary会经过ONNX/TFLite等工具编码到模型中,不再需要encode
  3. 您应该指的的是YOLO-World-v2-LYOLO-World-v2-L-CLIP-Large, 后者采用了更强大的 CLIP-Large作为text encoder。
zhujiajian98 commented 5 months ago

@wondervictor Hello, in the code of generate_text_prompts, how can I adapt to the format of coco_class_captions.json?

zhujiajian98 commented 5 months ago

@wondervictor Is it like [[person], [bicycle]]?

wondervictor commented 5 months ago

Yep. It's simple and you can modify the script as you like. More details can be referred to: https://github.com/AILab-CVC/YOLO-World/blob/master/docs/data.md#1-multimodaldataset

zhujiajian98 commented 5 months ago

@wondervictor OK, thanks for your explanation.

JasonLiJin commented 5 months ago

Hi @JasonLiJin,

  1. 端侧推理,我们是推荐移除CLIP,有两种方式,一种是提前计算好相应类别的embeddings, 可以采用我们提供的脚本 generate_text_prompts. 然后使用YOLOWorldPromptDetector(不带text encoder);第二种方式是采用YOLOWorldDetector中的reparameterize实现编码并写入到model中,之后可以去除text encoder;这部分可以参考我们提供的export_onnx.py
  2. 推理的offline vocabulary会经过ONNX/TFLite等工具编码到模型中,不再需要encode
  3. 您应该指的的是YOLO-World-v2-LYOLO-World-v2-L-CLIP-Large, 后者采用了更强大的 CLIP-Large作为text encoder。

多谢大佬解答,另外就是看源码用mm engine和mm yolo封装了很多,目前想在高通端侧部署,想问下yolo-world前后处理跟yolo v8有什么区别吗,目前只看到demo里的nms后处理?

wondervictor commented 4 months ago

@JasonLiJin 您好,前后处理和YOLOv8没有区别,目前我们提供了deploy/onnx_demo.py可供参考。如果不想在ONNX中引入NMS,我们也即将push一个新版本将NMS排除ONNX外并提供推理测试的脚本,欢迎关注!

JasonLiJin commented 4 months ago

@JasonLiJin 您好,前后处理和YOLOv8没有区别,目前我们提供了deploy/onnx_demo.py可供参考。如果不想在ONNX中引入NMS,我们也即将push一个新版本将NMS排除ONNX外并提供推理测试的脚本,欢迎关注!

多谢,我在导出为onnx的时候,发现输出的维度都是变量,export的时候是把默认的class重参数化到backbone的,num_dets name: num_dets tensor: int64[ReduceSumnum_dets_dim_0,1] boxes name: boxes tensor: float32[ReduceSumnum_dets_dim_0,Splitboxes_dim_1,Splitboxes_dim_2] scores name: scores tensor: float32[ReduceSumnum_dets_dim_0,Splitboxes_dim_1] labels name: labels tensor: int32[Castlabels_dim_0,Castlabels_dim_1],现在就导致转出为mnn会有维度丢失问题,请问我这个输出头是不是不正常的,如果是正常,可以有办法让输出维度固定么

chenjiafu-George commented 4 months ago

@JasonLiJin 您好,前后处理和YOLOv8没有区别,目前我们提供了deploy/onnx_demo.py可供参考。如果不想在ONNX中引入NMS,我们也即将push一个新版本将NMS排除ONNX外并提供推理测试的脚本,欢迎关注!

多谢,我在导出为onnx的时候,发现输出的维度都是变量,export的时候是把默认的class重参数化到backbone的,num_dets name: num_dets tensor: int64[ReduceSumnum_dets_dim_0,1] boxes name: boxes tensor: float32[ReduceSumnum_dets_dim_0,Splitboxes_dim_1,Splitboxes_dim_2] scores name: scores tensor: float32[ReduceSumnum_dets_dim_0,Splitboxes_dim_1] labels name: labels tensor: int32[Castlabels_dim_0,Castlabels_dim_1],现在就导致转出为mnn会有维度丢失问题,请问我这个输出头是不是不正常的,如果是正常,可以有办法让输出维度固定么

您好,我目前也在看这个export_onnx.py,但是我运行出现了这个问题。 image 请问您在这个过程中有遇到这个问题吗,如何解决,如您回复,十分感谢!