欢迎访问宙启技术站
智能推送

使用COCODemo()函数在Python中进行目标检测和识别的实例代码

发布时间:2024-01-04 23:00:02

目标检测和识别是计算机视觉中的重要任务之一,它可以用来识别输入图像中的目标物体,并对其进行分类和定位。在Python中,我们可以使用COCODemo()函数来实现目标检测和识别。下面是一个使用COCODemo()函数进行目标检测和识别的实例代码,并附带使用例子。

首先,我们需要安装必要的库和文件。执行以下代码安装并导入所需的库:

!pip install torch torchvision opencv-python
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
import torch
import torchvision.transforms as T
import cv2

接下来,我们定义一个COCODemo()函数,并在其中加载预训练的模型和标签:

class COCODemo(object):
    def __init__(self, cfg, confidence_threshold=0.7):
        self.cfg = cfg.clone()
        self.cfg.MODEL.RETINANET.SCORE_THRESH_TEST = confidence_threshold
        self.mdl = build_detection_model(self.cfg)
        self.mdl.load_state_dict(torch.load(cfg.MODEL.WEIGHTS))
        self.mdl.eval()
        self.device = torch.device(cfg.MODEL.DEVICE)
        self.mdl.to(self.device)
        self.transforms = self.build_transform()
        
        self.coco_demo_metadata = MetadataCatalog.get(cfg.DATASETS.TEST[0])
        
    def build_transform(self):
        t = []
        t.append(T.ToTensor())
        t.append(T.Normalize(
            mean=self.cfg.INPUT.PIXEL_MEAN,
            std=self.cfg.INPUT.PIXEL_STD))
        return T.Compose(t)

然后,我们定义一个函数来执行目标检测和识别,并在图像上绘制出检测到的物体和类别标签:

def detect_and_show_objects(image_path, coco_demo):
    img = cv2.imread(image_path)
    original_image = img.copy()
    height, width = img.shape[:2]
    
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    img = coco_demo.transforms(img)
    
    predictions = coco_demo.mdl([img.to(coco_demo.device)])
    predictions = coco_demo.mdl.postprocess(predictions, height, width, coco_demo.cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST)
    
    num_instances = len(predictions)
    for i in range(num_instances):
        boxes = predictions[i]["instances"].get_fields()["pred_boxes"].tensor.cpu().numpy()
        scores = predictions[i]["instances"].get_fields()["scores"].cpu().numpy()
        classes = predictions[i]["instances"].get_fields()["pred_classes"].cpu().numpy()
        
        for j in range(len(boxes)):
            box = boxes[j]
            score = scores[j]
            class_idx = classes[j]
            
            x1, y1, x2, y2 = box
            cv2.rectangle(original_image, (x1, y1), (x2, y2), (255,0,0), thickness=2)
            cv2.putText(original_image, coco_demo.coco_demo_metadata.thing_classes[class_idx] + ':{:.1f}%'.format(score*100), (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0,0,255), 2)
            
    plt.figure(figsize=(10, 10))
    plt.imshow(cv2.cvtColor(original_image, cv2.COLOR_BGR2RGB))
    plt.axis("off")
    plt.show()

现在,我们可以使用上述定义的函数来进行目标检测和识别了。请注意,我们需要提供一个输入图像的路径,以及COCODemo对象:

cfg = get_cfg()
cfg.MODEL.DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
cfg.merge_from_file("detectron2_repo/configs/COCO-Detection/faster_rcnn_R_50_FPN_3x.yaml")
cfg.MODEL.WEIGHTS = "detectron2://COCO-Detection/faster_rcnn_R_50_FPN_3x/137849458/model_final_cafdb1.pkl"

coco_demo = COCODemo(cfg)

image_path = "/path/to/your/image.jpg"
detect_and_show_objects(image_path, coco_demo)

以上代码中,我们首先通过调用get_cfg()函数来获取模型配置,然后加载预训练模型和标签。接下来,我们定义了一个COCODemo对象,并使用它来执行目标检测和识别。最后,我们调用detect_and_show_objects()函数,并传入输入图像的路径和COCODemo对象来展示检测到的物体和类别标签。

这就是一个使用COCODemo()函数在Python中进行目标检测和识别的实例代码,带有使用例子。