Transformers库中owlvit2模型的注意事项

Huggingface 中的 transformers 库中的 owlvit2 模型具体由三种应用

  1. 检测 target image 可能存在的目标(与owlvit的主要区别)
  2. 利用 query text 在 target image 上进行目标检测 (text guided detection)
  3. 利用 query image 在 target image 上进行目标检测 (image guided detection)

下面以owlv2-base-patch16模型为例,上文中的第三种应用为例进行伪码讲解

Owlvit2检测流程如下所示:

预处理

# Target image
target_url = "http://images.cocodataset.org/val2017/000000039769.jpg"
target_image = Image.open(requests.get(target_url, stream=True).raw)

# Source image
query_url = "http://images.cocodataset.org/val2017/000000058111.jpg"
query_image = Image.open(requests.get(source_url, stream=True).raw)

processor = Owlv2Processor.from_pretrained("google/owlv2-base-patch16")

# Process target and source image for the model
inputs = processor(images=target_image, query_images=source_image, return_tensors="pt")

target image 和 query image 调整成模型所规定的尺度 (3, 960, 960),使用transformers.Owlv2Processor预处理函数即可,但需要注意的是,该函数会先将图像pad成正方形,然后resize成目标大小,这点与owlvit1中不使用pad不同,使用pad能够保留物体的长宽比信息,提高检测准确率。但使用pad也存在一些问题,即若query image也进行pad,则会增加 query image 与 target image 中pad衔接处的物体相似性,从而影响检测准确性,所以截取的query image 尽量是正方形,或者提前resize成正方形。

该部分在transformers库中具体的预处理执行函数image_processing_owlv2.py文件中的 Owlv2ImageProcessor 类中的 preprocess 函数

模型推理

outputs = model.image_guided_detection(**inputs)

outputs中的一些数据信息如下:

  • image_embeds={Tensor:(1, 60, 60, 768)} # 960/16=60,一张图分割60*60=3600个patches
  • query_image_embeds={Tensor:(1, 60, 60, 768)}
  • class_embeds={Tensor:(1, 3600, 512)} # 3600个框,512类
  • logits{Tensor:(1, 3600, 1)} # 每个框对应的目标检测置信概率
  • target_pred_boxes={Tensor:(1,3600,4)} # 每个框对应的检测框位置

其中 logits = similarity (class_embeds, query_embeds)
query_embeds 由 query_image_embeds (或者text) 编码得到,且query_embeds和class_embeds的尺寸相同,text在第二个应用中使用 (text guided detection)

后处理

results = processor.post_process_image_guided_detection(outputs=outputs, threshold=0.98, nms_threshold=1.0, target_sizes=target_sizes)

后处理函数对模型推理得到的outputs进行非极大值抑制nms等操作,去除冗余的检测框。
但需要注意的是huggingface官方的后处理函数会对目标检测概率logits重新归一化到0~1,这也就意味着即使图像中的patch最高概率为0.2,也会映射到1.0,这不便于我们进行概率阈值分割,所以不使用官方的后处理函数,或者自行修改官方源码。

Owlvit2和owlvit的检测原理相同

每个图像patch具有一个检测框,每个 image patch 经视觉编码器得到 image patch embeding,众多组成 image embedings

每一个文本text经过文本编码器得到query embeding,多个文本得到query embedings,通过计算每一组query embeding和patch embeding的相似度得到置信概率logit

query embedings也可以从guided image 得到,这就是第三种应用 (image guided detection) 。具体方法为将guided image 经视觉编码器得到query image embeddings ,query image embeddings 经 class_predictor() 函数得到 query embedings

Transformers库中owlvit2模型的注意事项_第1张图片

你可能感兴趣的:(目标跟踪,人工智能,计算机视觉)