目标检测框架
CNN based以及Transformer based。
01.CNN based通常又可以划分为
以Faster RCNN和RetinaNet为代表
和以YOLO系列为代表
阈值筛选(Confidence threshold)和非极大值抑制(NMS)处理两个关键步骤
02.Transformer based
目标检测:DETR
DETR:End-to-End Object Detection with Transformers, DETR 是 Facebook 团队于2020年提出的基于Transformer的端到端目标检测
DETR是第一篇将Transformer应用到目标检测方向的算法。
DINO 端到端目标检测器DINO
DETR with Improved DeNoising Anchor Boxes for End-to-End Object Detection
大模型-BLIP
01. CLIP 由OpenAI在2021年1月发布 WIT(Web Image Text 收集了共4个亿的文本-图像对(Contrastive Language-Image Pre-Training,以下简称 CLIP)
CLIP直接用ViT做出图像的embed,用BERT做出文字的embed,然后两者做双塔的contrastive learning来匹配语
02. BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation
再利用BLIP进行后续工作的时候,既可以使用其理解的能力(encoder),又可以利用其生成的能力(decoder)
一个ITC(image-text contrastive),一个ITM(image-text match),一个language modeling,share一下参数
BLIP简介 BLIP(Bootstrapping Language-Image Pretraining)是salesforce在2022年提出的多模态框架,是理解和生成的统一,引入了跨模态的编码器和解码器,
Salesforce - 赛富时客户关系管理系统CRM
BLIP的主要特点是结合了encoder和decoder,形成了统一的理解和生成多模态模型。
03.GLIP 是Microsoft团队针对多模态预训练范式发表了《Grounded Language-Image Pre-training(GLIP)》
2.图片生成
Latent Diffusion-Github上火爆开源的Stable Diffusion便是基于LDMs开发的
Midjourney : 基于条件生成对抗网络
应用
Grounding DINO可以根据文字描述检测指定目标-开放世界目标检测问题(open-set object detection)
close-set detector由三个重要部分组成:Backbone用于提取特征,Neck用于特征增强,Head用于bbox预测
open-set detection方法
Grounding DINO是一个双encoder单decoder结构,
它包含了一个image backbone用于提取image feature、
一个text backbone用于提取text feature、
一个feature enhancer用于融合image和text feature
一个language-guide query selection模块用于query初始化
一个cross-modality decoder用于bbox预测
图像坐标
原点往右为X轴的正方向,原点往下为Y轴的正方向
交并比(Interection-over-unio,简称 IOU)来衡量两个边界框之间的重叠程度
Intersection over Union (IoU)
is used to evaluate the performance of object detection
by comparing the ground truth bounding box to the preddicted bounding box and IoU is the topic of this tutorial.
box是规则矩形框,计算IOU也非常简单,有两种方法:
1. 两个矩形的宽之和减去组合后的矩形的宽就是重叠矩形的宽,同比重叠矩形的高
2. 右下角的minx减去左上角的maxx就是重叠矩形的宽,同比高
然后 IOU = 重叠面积 / (两矩形面积和—重叠面积)
不规则的
python的shapely包可以直接做
import numpy as np
import shapely
from shapely.geometry import Polygon,MultiPoint #多边形
计算一对一交并比
def iou(box0: np.ndarray, box1: np.ndarray):
""" 计算一对一交并比 box0, box1: `~np.ndarray` of shape `(4, )` """
xy_max = np.minimum(box0[2:], box1[2:])
xy_min = np.maximum(box0[:2], box1[:2])
# 计算交集
inter = np.clip(xy_max-xy_min, a_min=0, a_max=np.inf)
inter = inter[0]*inter[1]
# 计算并集
area_0 = (box0[2]-box0[0])*(box0[3]-box0[1])
area_1 = (box1[2]-box1[0])*(box1[3]-box1[1])
union = area_0 + area_1- inter
return inter/union
def box_iou(boxes0: np.ndarray, boxes1: np.ndarray):
""" 计算多个边界框和多个边界框的交并比 [xmin, ymin, xmax,ymax]格式
Parameters``(x1, y1, x2, y2)`` format with ``0 <= x1 < x2`` and ``0 <= y1 < y2``
boxes0: `~np.ndarray` of shape `(A, 4)`
boxes1: `~np.ndarray` of shape `(B, 4)`
Returns
iou: `~np.ndarray` of shape `(A, B)`
# [N,2] -> [N,1,2] -> [N,M,2] # [M,2] -> [1,M,2] -> [N,M,2]
这两组bbox中两两之间对应的overlap部分的面积,那么我们需要先求解得到对应部分的左上角坐标lt和右下角坐标rb
"""
A = boxes0.shape[0]
B = boxes1.shape[0]
xy_max = np.minimum(boxes0[:, np.newaxis, 2:].repeat(B, axis=1), np.broadcast_to(boxes1[:, 2:], (A, B, 2)))
xy_min = np.maximum(boxes0[:, np.newaxis, :2].repeat(B, axis=1), np.broadcast_to(boxes1[:, :2], (A, B, 2)))
# 左上角的点 # [N,2] -> [N,1,2] -> [N,M,2] # [M,2] -> [1,M,2] -> [N,M,2]
lt = np.maximum( box0[:, :2].unsqueeze(1).expand(N, M, 2), box1[:, :2].unsqueeze(0).expand(N, M, 2), )
rb = np.minimum( box0[:, 2:].unsqueeze(1).expand(N, M, 2), box1[:, 2:].unsqueeze(0).expand(N, M, 2),)
wh = rb - lt # [N,M,2]
inter = wh[:, :, 0] * wh[:, :, 1] # [N,M]
## # [N,]# [N,] -> [N,1] -> [N,M]
area1 = (box1[:, 2]-box1[:, 0]) * (box1[:, 3]-box1[:, 1])
area1 = area1.unsqueeze(1).expand_as(inter)
# 计算交集面积
inter = np.clip(xy_max-xy_min, a_min=0, a_max=np.inf)
inter = inter[:, :, 0]*inter[:, :, 1]
# 计算每个矩阵的面积
area_0 = ((boxes0[:, 2]-boxes0[:, 0])*( boxes0[:, 3] - boxes0[:, 1]))[:, np.newaxis].repeat(B, axis=1)
area_1 = ((boxes1[:, 2] - boxes1[:, 0])*( boxes1[:, 3] - boxes1[:, 1]))[np.newaxis, :].repeat(A, axis=0)
return inter/(area_0+area_1-inter)
设计理解
一个灵活好用的配置系统,模块化设计,一套完整的训练测试验证流程
从用户角度去考虑一个项目的构造,以及它需要传达到哪些程度,才能最小化用户的负担
np.clip()是一个截取函数,用于截取数组中小于或者大于某值的部分,并使得被截取部分等于固定值。
import numpy as np
out = np.clip(a, a_min, a_max, out=None)
cuda 不是英伟达的护城河,是你能接触到的所谓护城河
为机床配置工人,为工人配置电脑。机械和信息处理。物质和信息--信息行业的快速发展
参考
如何使用 numpy 和 pytorch 快速计算 IOU https://www.cnblogs.com/zhiyiYo/p/15586440.html
https://pytorch.org/vision/main/generated/torchvision.ops.box_iou.html
https://github.com/facebookresearch/detr/blob/master/util/box_ops.py
https://github.com/pytorch/vision/blob/main/torchvision/ops/boxes.py
https://www.cnblogs.com/zhiyiYo/p/15586440.html
python shapely.geometry.polygon任意两个四边形的IOU计算实例 https://cloud.tencent.com/developer/article/1740131
https://pyimagesearch.com/2016/11/07/intersection-over-union-iou-for-object-detection/
https://zhuanlan.zhihu.com/p/424241927
https://github.com/rentainhe
https://github.com/MILVLG
标签:NLP,DETR,AI,com,https,np,inter,box1,box0
From: https://www.cnblogs.com/ytwang/p/17982607