在人工智能实验室的最新研究中,目标检测模型展现出了令人印象深刻的性能表现。尽管零样本检测模型能够以越来越高的精度检测目标,但小型定制模型在特定领域和用例中,相较于大型模型,展现出了更快的速度和更高的计算效率,同时保持了更高的准确率。尽管存在这些权衡,大型零样本模型的一个重要优势是:它们不需要数据标注或模型训练即可投入生产使用。
部署YOLO-World
通过几个简单的步骤,可以设置YOLO-World在Roboflow Inference上运行。首先,需要安装所需的包:
pip install -q inference-gpu[yolo-world]==0.9.12rc1
然后,将从Roboflow Inference导入YOLO-World,并设置想要检测的类别:
from inference.models.yolo_world.yolo_world import YOLOWorld
model = YOLOWorld(model_id="yolo_world/l") # 有多种不同大小:s, m 和 l。
classes = ["book"] # 根据需要更改为任何想要检测的目标
model.set_classes(classes)
一个单词的目标描述可能就足够了,但有时可能需要更详细的描述。尝试运行一个测试推理(如下所示),并查看关于提示YOLO-World的博客文章。接下来,可以对一个样本图像运行推理,并看到模型在行动中的表现:
import supervision as sv
import cv2
image = cv2.imread(IMAGE_PATH)
results = model.infer(image, confidence=0.2) # 多次推理并尝试调整这个置信度阈值
detections = sv.Detections.from_inference(results)
使用Supervision,可以可视化预测结果:
labels = [
f"{classes[class_id]} {confidence:0.3f}"
for class_id, confidence
in zip(detections.class_id, detections.confidence)
]
annotated_image = image.copy()
annotated_image = sv.BoundingBoxAnnotator().annotate(annotated_image, detections)
annotated_image = sv.LabelAnnotator().annotate(annotated_image, detections, labels=labels)
sv.plot_image(annotated_image)
对于设置YOLO-World的完整过程,请查看关于使用YOLO-World检测目标的帖子。现在可以开始使用YOLO-World进行预测,并且通过一些额外的代码,可以开始创建一个更快、更高效、更准确的模型。
主动学习
首先,为了存储数据,将为书籍检测模型创建一个Roboflow项目。完成后,可以使用Python的Roboflow API访问工作区。首先,让安装Roboflow Python SDK:
pip install roboflow
然后,可以使用API密钥和输入工作区和项目ID来访问项目:
from roboflow import Roboflow
rf = Roboflow(api_key="YOUR_ROBOFLOW_API_KEY")
project = rf.workspace("*workspace_id*").project("*project_id*")
之后,拥有将本指南的所有先前部分结合起来创建一个函数,可以使用YOLO-World进行预测,同时将这些预测添加到数据集中,以便可以训练一个定制模型。
# 项目设置(从上一节复制)
rf = Roboflow(api_key="YOUR_ROBOFLOW_API_KEY")
project = rf.workspace("*workspace_id*").project("*project_id*")
# 模型设置(从上一节复制)
model = YOLOWorld(model_id="yolo_world/l") # 有多种不同大小:s, m 和 l。
classes = ["book"] # 根据需要更改为任何想要检测的目标
model.set_classes(classes)
def infer(image):
results = model.infer(image, confidence=0.1)
detections = sv.Detections.from_inference(results)
image_id = str(uuid.uuid4())
image_path = image_id+".jpg"
dataset = sv.DetectionDataset(classes=classes,images={image_path:image},annotations={image_path:detections})
dataset.as_pascal_voc("dataset_upload/images","dataset_upload/annotations")
project.upload(
image_path=f"dataset_upload/images/{image_path}",
annotation_path=f"dataset_upload/annotations/{image_id}.xml",
batch_name="Bookshelf Active Learning",
is_prediction=True
)
return detections
可以根据部署需求更改infer函数。对于示例,计划在视频上运行检测,不希望也不需要将每一帧都上传,因此将修改infer函数,使其随机25%的时间上传:
def infer(image):
results = model.infer(image, confidence=0.1)
detections = sv.Detections.from_inference(results)
if random.random() < 0.25:
print("Adding image to dataset")
image_id = str(uuid.uuid4())
image_path = image_id+".jpg"
dataset = sv.DetectionDataset(classes=classes,images={image_path:image},annotations={image_path:detections})
dataset.as_pascal_voc("dataset_upload/images","dataset_upload/annotations")
project.upload(
image_path=f"dataset_upload/images/{image_path}",
annotation_path=f"dataset_upload/annotations/{image_id}.xml",
batch_name="Bookshelf Active Learning",
is_prediction=True
)
return detections
使用Supervision和以下代码,将对图书馆的视频进行推理:
def process_frame(frame, i):
print(i)
detections = infer(frame)
annotated_image = frame.copy()
annotated_image = sv.BoundingBoxAnnotator().annotate(annotated_image, detections)
return annotated_image
sv.process_video("library480.mov","library_processed.mp4",process_frame)
然后,当运行推理时,将看到图像被添加到Roboflow项目中。上传后,可以根据需要审查和纠正注释,然后创建一个新版本以开始训练定制模型!
对于如何训练模型的完整指南,请查看关于训练YOLOv8模型、YOLOv9模型或在Roboflow内训练模型的许多资源。训练后,能够以大约98.3%的平均精度(mAP)训练一个定制模型。