• 深度学习_13_YOLO_图片切片及维度复原


    需求:

    在对获取的图片进行识别的时候,如果想减少不必要因素的干扰,将图片切割只对有更多特征信息的部分带入模型识别,而剩余有较多干扰因素的部分舍弃,这就是图片切割的目的,但是又由于模型对图片的维度有较高的要求,切割后的图片在维度上已经不满足模型所需要的维度,而将被切割图片的维度恢复,进而能带入模型识别,是本次重点

    对于图片处理有两种手段:

    1、填充式还原

    即保留的图片部分不变,剩余的被切割部分用白色填充 (当然也可以用其他的颜色填充)

    函数代码:

    def picture_Fill(img, boundary): # 填充函数
        # 创建与原始图像相同大小的全白图像
        white_frame = np.ones_like(img) * 255  # 255 白色,床创建全白图片
        white_frame[0:boundary, :] = img[0:boundary, :] # 水平方向全部取出,垂直方向取0~boundary
        return white_frame
    
    • 1
    • 2
    • 3
    • 4
    • 5

    即创建一个与原图片一样大小的白色图片,将需要被保留的部分填入白色图片中

    2、扩大还原式

    对切割后的图片进行放大,恢复到原来的维度值

    函数代码:

    def picture_BrowUp(img, boundary):
        img_copy = img.copy() # 备份
        img = img[0:boundary, :] # 截取
        img = cv2.resize(img, (img_copy.shape[1], img_copy.shape[0]), interpolation=cv2.INTER_LINEAR) # 放大
        return img
    
    • 1
    • 2
    • 3
    • 4
    • 5

    获取原本图片的所有维度大小,在扩大的过程中指定扩大的大小值

    测试:

    切割目标:

    在这里插入图片描述

    1、填充式测试
    代码:

    import matplotlib.pyplot as plt
    import cv2
    import numpy as np
    
    def picture_BrowUp(img, boundary):
        img_copy = img.copy() # 备份
        img = img[0:boundary, :] # 截取
        img = cv2.resize(img, (img_copy.shape[1], img_copy.shape[0]), interpolation=cv2.INTER_LINEAR) # 放大
        return img
    
    def picture_Fill(img, boundary): # 填充函数
        # 创建与原始图像相同大小的全白图像
        white_frame = np.ones_like(img) * 255  # 255 白色,床创建全白图片
        white_frame[0:boundary, :] = img[0:boundary, :] # 水平方向全部取出,垂直方向取0~boundary
        return white_frame
    
    # 读取原始图像
    frame = cv2.imread('C:\\Users\\86153\\Pictures\\Camera Roll\\1.png')  # 请将 'your_image_path.jpg' 替换为你的图像路径
    
    frame = picture_Fill(frame, 300) # 填充函数
    
    
    plt.imshow(frame)
    plt.axis('off')  # 关闭坐标轴
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    效果:

    在这里插入图片描述
    2、扩大式测试

    代码:

    import matplotlib.pyplot as plt
    import cv2
    import numpy as np
    
    def picture_BrowUp(img, boundary):
        img_copy = img.copy() # 备份
        img = img[0:boundary, :] # 截取
        img = cv2.resize(img, (img_copy.shape[1], img_copy.shape[0]), interpolation=cv2.INTER_LINEAR) # 放大
        return img
    
    def picture_Fill(img, boundary): # 填充函数
        # 创建与原始图像相同大小的全白图像
        white_frame = np.ones_like(img) * 255  # 255 白色,床创建全白图片
        white_frame[0:boundary, :] = img[0:boundary, :] # 水平方向全部取出,垂直方向取0~boundary
        return white_frame
    
    # 读取原始图像
    frame = cv2.imread('C:\\Users\\86153\\Pictures\\Camera Roll\\1.png')  # 请将 'your_image_path.jpg' 替换为你的图像路径
    
    frame = picture_BrowUp(frame, 300) # 填充函数
    
    
    plt.imshow(frame)
    plt.axis('off')  # 关闭坐标轴
    plt.show()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    效果:

    在这里插入图片描述
    实践效果评价:

    从机器识别上述处理过的图片来看,填充式的效果更加好,其原因在于将不必要的部分用白色代替,减少了不必要的干扰,而扩大式的识别较差,可能是图片的放大损坏了图片的空间结构,也不难排除扩大操作耗费的时间较多导致识别过慢,当然也和所用的识别图片模型的不同有关。

    补充:

    OpenCV(cv2库)是一个开源计算机视觉库,它提供了许多用于图像处理、计算机视觉和机器学习的功能。这个库被广泛应用于各种各样的领域,包括图像处理、视频分析、对象识别、人脸识别、机器视觉等领域。

    它提供了丰富的函数和工具,用于加载、保存、处理图像和视频。OpenCV
    能够执行图像的基本操作(如裁剪、调整大小、旋转等),还能进行更高级的图像处理(如图像滤波、边缘检测、特征提取等)。此外,它还提供了许多机器学习算法的实现,用于对象检测、人脸识别、姿态估计等任务。

    这个库支持多种编程语言,包括 C++、Python、Java 等,让开发者能够在不同的平台上使用相同的功能。OpenCV
    在计算机视觉和图像处理领域是一个非常强大和受欢迎的工具。

    图片的维度和pytorch的维度排布有所差别例如图片的shape为(500, 720, 3)那么其高度、宽度、通道数分别为500、720、3而对将图片转化成pytorch张量之后就变成了(3, 500, 720)即通道数,高度宽度

    转换代码如下:

    # 转换为 PyTorch Tensor,并调整维度
    image_tensor = torch.from_numpy(np.transpose(image, (2, 0, 1)))  # 调整维度为 (通道数, 高度, 宽度)
    
    • 1
    • 2

    至于为什么要把图片转换为 pytorch (张量),因为一般训练出来的模型都是用张量数据的图片训练出来的,直接用图片的话,维度不一样,会报错

    而且张量的优势在于其能添加一个批量大小维度,这样能一次性识别多个图片,这一样问题就转化成上节的多类分类问题

    添加维度代码:

    # 如果你有多张图片,可以添加批量维度
    # image_tensor = image_tensor.unsqueeze(0)  # 添加批量维度,变成 (1, 3, 500, 720) 形状的 Tensor
    
    • 1
    • 2

    一般模型都是有批量维度,也就是说有四维,如果仅仅用三维图片张量是无法带入模型识别的,所以必须添加批量维度

  • 相关阅读:
    ROS环境下使用WHEELTEC N100惯导模块
    Ansible中的角色使用
    【算法练习Day2】有序数组的平方&&长度最小子数组&&螺旋矩阵II
    【CCPC2020长春站】【区间dp】Abstract Painting
    leetcode-49.字母异位词分组
    OpenCV自学笔记十四:Canny边缘检测
    基于滑模控制的不确定中立型系统有限时间稳定
    通过Demo学WPF—数据绑定(二)
    比Linus更厉害的程序员,这家伙一定是穿越回来的!
    LeetCode刷题3:哈希篇
  • 原文地址:https://blog.csdn.net/xyint/article/details/134426502