利用torchvision库实现目标检测与语义分割

这篇具有很好参考价值的文章主要介绍了利用torchvision库实现目标检测与语义分割。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、介绍

利用torchvision库实现目标检测与语义分割。

二、代码

1、目标检测

from PIL import Image
import matplotlib.pyplot as plt
import torchvision.transforms as T
import torchvision
import numpy as np
import cv2
import random


COCO_INSTANCE_CATEGORY_NAMES = [
    '__background__', 'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus',
    'train', 'truck', 'boat', 'traffic light', 'fire hydrant', 'N/A', 'stop sign',
    'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow',
    'elephant', 'bear', 'zebra', 'giraffe', 'N/A', 'backpack', 'umbrella', 'N/A', 'N/A',
    'handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball',
    'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard', 'tennis racket',
    'bottle', 'N/A', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl',
    'banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza',
    'donut', 'cake', 'chair', 'couch', 'potted plant', 'bed', 'N/A', 'dining table',
    'N/A', 'N/A', 'toilet', 'N/A', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone',
    'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'N/A', 'book',
    'clock', 'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush'
]


def get_prediction(img_path, threshold):
    # 加载 mask_r_cnn 模型进行目标检测
    model = torchvision.models.detection.maskrcnn_resnet50_fpn(pretrained=True)
    model.eval()
    img = Image.open(img_path)
    transform = T.Compose([T.ToTensor()])
    img = transform(img)
    pred = model([img])
    pred_score = list(pred[0]['scores'].detach().numpy())
    print(pred[0].keys())  # ['boxes', 'labels', 'scores', 'masks']
    pred_t = [pred_score.index(x) for x in pred_score if x > threshold][-1]  # num of boxes
    pred_masks = (pred[0]['masks'] > 0.5).squeeze().detach().cpu().numpy()
    pred_boxes = [[(int(i[0]), int(i[1])), (int(i[2]), int(i[3]))] for i in list(pred[0]['boxes'].detach().numpy())]
    pred_class = [COCO_INSTANCE_CATEGORY_NAMES[i] for i in list(pred[0]['labels'].numpy())]
    pred_masks = pred_masks[:pred_t + 1]
    pred_boxes = pred_boxes[:pred_t + 1]
    pred_class = pred_class[:pred_t + 1]
    return pred_masks, pred_boxes, pred_class


def random_colour_masks(image):
    colours = [[0, 255, 0], [0, 0, 255], [255, 0, 0], [0, 255, 255], [255, 255, 0], [255, 0, 255], [80, 70, 180],
               [250, 80, 190], [245, 145, 50], [70, 150, 250], [50, 190, 190]]
    r = np.zeros_like(image).astype(np.uint8)
    g = np.zeros_like(image).astype(np.uint8)
    b = np.zeros_like(image).astype(np.uint8)
    r[image == 1], g[image == 1], b[image == 1] = colours[random.randrange(0, 10)]
    coloured_mask = np.stack([r, g, b], axis=2)
    return coloured_mask


def instance_segmentation_api(img_path, threshold=0.5, rect_th=3, text_size=2, text_th=2):
    masks, boxes, cls = get_prediction(img_path, threshold)
    img = cv2.imread(img_path)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    for i in range(len(masks)):
        rgb_mask = random_colour_masks(masks[i])
        randcol = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
        img = cv2.addWeighted(img, 1, rgb_mask, 0.5, 0)
        cv2.rectangle(img, boxes[i][0], boxes[i][1], color=randcol, thickness=rect_th)
        cv2.putText(img, cls[i], boxes[i][0], cv2.FONT_HERSHEY_SIMPLEX, text_size, randcol, thickness=text_th)
    plt.figure(figsize=(20, 30))
    plt.imshow(img)
    plt.xticks([])
    plt.yticks([])
    plt.show()
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    cv2.imwrite('result_det.jpg', img)


if __name__ == '__main__':
    instance_segmentation_api('horse.jpg')

利用torchvision库实现目标检测与语义分割,机器学习,Python,目标检测,人工智能,计算机视觉

 利用torchvision库实现目标检测与语义分割,机器学习,Python,目标检测,人工智能,计算机视觉

 

2、语义分割

import torch
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
from torchvision import models
from torchvision import transforms


def pre_img(img):
    if img.mode == 'RGBA':
        a = np.asarray(img)[:, :, :3]
        img = Image.fromarray(a)
    return img


def decode_seg_map(image, nc=21):
    label_colors = np.array([(0, 0, 0), (128, 0, 0), (0, 128, 0), (128, 128, 0),
                             (0, 0, 128), (128, 0, 128), (0, 128, 128), (128, 128, 128),
                             (64, 0, 0), (192, 0, 0), (64, 128, 0), (192, 128, 0),
                             (64, 0, 128), (192, 0, 128), (64, 128, 128), (192, 128, 128),
                             (0, 64, 0), (128, 64, 0), (0, 192, 0), (128, 192, 0), (0, 64, 128)])
    r = np.zeros_like(image).astype(np.uint8)
    g = np.zeros_like(image).astype(np.uint8)
    b = np.zeros_like(image).astype(np.uint8)

    for l in range(0, nc):
        idx = image == l
        r[idx] = label_colors[l, 0]
        g[idx] = label_colors[l, 1]
        b[idx] = label_colors[l, 2]

    return np.stack([r, g, b], axis=2)


if __name__ == '__main__':
    # 加载 deep_lab_v3 模型进行语义分割
    model = models.segmentation.deeplabv3_resnet101(pretrained=True)
    model = model.eval()

    img = Image.open('horse.jpg')
    print(img.size)  # (694, 922)
    plt.imshow(img)
    plt.axis('off')
    plt.show()

    im = pre_img(img)
    transform = transforms.Compose([
        transforms.Resize(256),
        transforms.CenterCrop(224),
        transforms.ToTensor(),
        transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
    ])
    input_img = transform(im).unsqueeze(0)  # resize
    tt = np.transpose(input_img.detach().numpy()[0], (1, 2, 0))  # transpose
    print(tt.shape)  # (224, 224, 3)
    plt.imshow(tt)
    plt.axis('off')
    plt.show()

    output = model(input_img)
    print(output.keys())  # odict_keys(['out', 'aux'])
    print(output['out'].shape)  # torch.Size([1, 21, 224, 224])
    output = torch.argmax(output['out'].squeeze(), dim=0).detach().cpu().numpy()
    result_class = set(list(output.flat))
    print(result_class)  # {0, 13, 15}

    rgb = decode_seg_map(output)
    print(rgb.shape)  # (224, 224, 3)
    img = Image.fromarray(rgb)
    img.save('result_seg.jpg')
    plt.axis('off')
    plt.imshow(img)
    plt.show()

利用torchvision库实现目标检测与语义分割,机器学习,Python,目标检测,人工智能,计算机视觉

 利用torchvision库实现目标检测与语义分割,机器学习,Python,目标检测,人工智能,计算机视觉

 

三、参考

Pytorch预训练模型、内置模型实现图像分类、检测和分割文章来源地址https://www.toymoban.com/news/detail-684348.html

到了这里,关于利用torchvision库实现目标检测与语义分割的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用爬虫代码获得深度学习目标检测或者语义分割中的图片。

    问题描述:目标检测或者图像分割需要大量的数据,如果手动从网上找的话会比较慢,这时候,我们可以从网上爬虫下来,然后自己筛选即可。 代码如下(不要忘记安装代码依赖的库): 这里以搜索明星的图片为例,运行代码,然后根据提示输入搜索图片的名字→搜索图片

    2024年02月10日
    浏览(48)
  • 浅谈语义分割、图像分类与目标检测中的TP、TN、FP、FN

    TP:正确地预测出了正类,即原本是正类,识别的也是正类 TN:正确地预测出了负类,即原本是负类,识别的也是负类 FP:错误地预测为了正类,即原本是负类,识别的是正类 FN:错误地预测为了负类,即原本是正类,识别成了负类 代码可见:一整套计算correct, labeled, inter,

    2024年02月19日
    浏览(44)
  • 耕地单目标语义分割实践——Pytorch网络过程实现理解

    (一)普通卷积(Convolution) (二)空洞卷积(Atrous Convolution)         根据空洞卷积的定义,显然可以意识到空洞卷积可以提取到同一输入的不同尺度下的特征图,具有构建特征金字塔的基础。 (三)深度可分离卷积(Depthwise-Separable Convolution)         在对深度可分离卷

    2024年02月11日
    浏览(46)
  • 可解释深度学习:从感受野到深度学习的三大基本任务:图像分类,语义分割,目标检测,让你真正理解深度学习

    目录   前言 一、初识感受野 1.1猜一猜他是什么? 1.2人眼视觉系统下的感受野 1.3深度神经网络中的感受野 1.3.1感受野的性质 1.3.2感受野的定义 1.3.3举一个例子 1.3.4以VGG网络为例 二、感受野的计算 2.1 哪些操作能够改变感受野? 2.2 感受野的计算公式 2.3 感受野的中心位置计算

    2024年02月02日
    浏览(53)
  • 卷积神经网络(CNN):基于PyTorch的遥感影像、无人机影像的地物分类、目标检测、语义分割和点云分类

    我国高分辨率对地观测系统重大专项已全面启动,高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成,将成为保障国家安全的基础性和战略性资源。随着小卫星星座的普及,对地观测已具备多次以上的全球覆盖能力,遥感影像也

    2024年02月04日
    浏览(54)
  • 从CNN到Transformer:基于PyTorch的遥感影像、无人机影像的地物分类、目标检测、语义分割和点云分类

    我国高分辨率对地观测系统重大专项已全面启动,高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成,将成为保障国家安全的基础性和战略性资源。随着小卫星星座的普及,对地观测已具备多次以上的全球覆盖能力,遥感影像也

    2024年01月22日
    浏览(55)
  • YOLOv5改进 | Neck篇 | 利用ASF-YOLO改进特征融合层(适用于分割和目标检测)

    本文给大家带来的改进机制是 ASF-YOLO(发布于2023.12月份的最新机制) ,其是特别设计用于细胞实例分割。这个模型通过结合空间和尺度特征,提高了在处理细胞图像时的准确性和速度。在实验中, ASF-YOLO在2018年数据科学竞赛 数据集上取得了卓越的分割准确性和速度,达到了

    2024年01月15日
    浏览(44)
  • 【实战篇:粘连物体分割——利用几何分割实现瓶盖分割检测】

        在去年学习opencv的过程当中,做过一张瓶盖分割的练习。目的就是为了分割出每个瓶盖,当时想着,除了霍夫圆检测思路之外,能不能根据相连瓶盖的特征进行分割呢?于是便想到了根据角点检测其相连位置,然后在相连位置之间画一根线进行切除。是不是想法很单纯

    2024年02月09日
    浏览(48)
  • torchvision pytorch预训练模型目标检测使用

    参考: https://pytorch.org/vision/0.13/models.html https://blog.csdn.net/weixin_42357472/article/details/131747022 有分类、检测、分割相关预训练模型 https://pytorch.org/vision/0.13/models.html#object-detection-instance-segmentation-and-person-keypoint-detection https://h-huang.github.io/tutorials/intermediate/torchvision_tutorial.html https

    2024年03月19日
    浏览(41)
  • 【实战篇:粘连物体分割——利用分水岭算法实现糖豆分割检测】

    通过pycharm安装时空门 问题: 讲一下分水岭算法的原理、实现步骤、以及应用。 回答: 分水岭算法是一种基于图像变换与分割的图像分析算法,主要用于图像分割。该算法可以解决很多图像处理领域的问题,例如医学图像分析、面部识别、数字水印等。下面将详细介绍分水岭

    2024年02月03日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包