省流建议
本文针对以下需求:
确定好需求,那么我们发车!
我知道你对文字不感兴趣,你想直接拿代码来就用!
那么,它来了。
在下一节中,我们将演示一个开放集对象目标检测。在这里,我们将使用一个预先训练的模型来检测’玻璃与盖子’(作为文本提示)通过摄像头饲料。
首先导入相关的库和 模块。代码的最后两行导入所需的推理模块。
import os
import cv2
import numpy as np
from PIL import Image
接下来,定义 模型配置文件和权重文件路径。除此之外,我们还定义了两个超参数框和图像阈值来控制对象框和图像的选择。默认情况下,模型输出900个对象框,这些对象框根据它们与输入文本的相似性得分进行排序。通过调整 max _ box 超参数,可以更改接地 DIN模型输出的对象框的数量。
HOME = os.getcwd()
# set model configuration file path
CONFIG_PATH = os.path.join(HOME, "groundingdino/config/GroundingDINO_SwinT_OGC.py")
# set model weight file ath
WEIGHTS_NAME = "groundingdino_swint_ogc.pth"
WEIGHTS_PATH = os.path.join(HOME, "weights", WEIGHTS_NAME)
# set text prompt
TEXT_PROMPT = "glass with lid"
# set box and text threshold values
BOX_TRESHOLD = 0.35
TEXT_TRESHOLD = 0.25
最后,我们使用 opencv 模块启动我们的摄像机 feed,并连续读取帧。在将摄像机提要传递给模型之前,我们需要对图像帧执行一些变换。首先,通过执行三个图像转换创建一个转换对象。
随机尺寸([800] ,max _ size = 1333)-此转换将图像的宽度调整为800,最大高度为1333像素。这有助于防止模型过度适应特定的尺寸。
ToTensor ()-这个转换将图像转换为一个 Python 张量。
正常化([0.485,0.456,0.406] ,[0.229,0.224,0.225])-这个转换通过减去平均值并除以 ImageNet 数据集的标准差来正常化图像。这有助于使模型对闪电和其他因素的变化更加稳健。
接下来,帧(相机帧的一个数字数组)被转换成 RGB 颜色空间中的 PIL 图像对象,最后通过执行上述三个转换转换成一个转换对象。
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
# create a transform function by applying 3 image transaformations
transform = T.Compose(
[
T.RandomResize([800], max_size=1333),
T.ToTensor(),
T.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
]
)
# convert frame to a PIL object in RGB space
image_source = Image.fromarray(frame).convert("RGB")
# convert the PIL image object to a transform object
image_transformed, _ = transform(image_source, None)
# predict boxes, logits, phrases
boxes, logits, phrases = predict(
model=model,
image=image_transformed,
caption=TEXT_PROMPT,
box_threshold=BOX_TRESHOLD,
text_threshold=TEXT_TRESHOLD,
device='cpu')
# annotate the image
annotated_frame = annotate(image_source=frame, boxes=boxes, logits=logits, phrases=phrases)
# display the output
out_frame = cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB)
cv2.imshow('frame', out_frame)
不是图片中所有的类别你都想要,你只想获取部分目标,那么你在定义时要如下操作:
需要将Text Prompt做替换 ,如你只想对图片中的熊感兴趣:
则Text Prompt=bear.
对应生成的label/json文件
"shapes": [
{
"label": "dog",
"points": [
[
20.913907284768214,
26.47019867549669
],
[
87.96688741721854,
97.66225165562913
]
],
"group_id": null,
"shape_type": "rectangle",
"flags": {}
},
{
"label": "cat",
"points": [
[
91.11258278145695,
43.35761589403974
],
[
131.50993377483442,
84.91390728476821
]
],
如果对大海和熊感兴趣,则:
Text Prompt=bear,sea
注意 逗号间隔!
可以说做到了完美贴合P图 ,再也不用PS工具费时费力修图啦
code get:见博客底部推广