当前位置: 首页 > news >正文

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

需求:

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

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

1、填充式还原

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

函数代码:

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

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

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、填充式测试
代码:

import matplotlib.pyplot as plt
import cv2
import numpy as npdef 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 imgdef picture_Fill(img, boundary): # 填充函数# 创建与原始图像相同大小的全白图像white_frame = np.ones_like(img) * 255  # 255 白色,床创建全白图片white_frame[0:boundary, :] = img[0:boundary, :] # 水平方向全部取出,垂直方向取0~boundaryreturn 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()

效果:

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

代码:

import matplotlib.pyplot as plt
import cv2
import numpy as npdef 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 imgdef picture_Fill(img, boundary): # 填充函数# 创建与原始图像相同大小的全白图像white_frame = np.ones_like(img) * 255  # 255 白色,床创建全白图片white_frame[0:boundary, :] = img[0:boundary, :] # 水平方向全部取出,垂直方向取0~boundaryreturn 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()

效果:

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

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

补充:

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)))  # 调整维度为 (通道数, 高度, 宽度)

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

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

添加维度代码:

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

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

相关文章:

  • 如何下载 Apache + PHP + Mysql 集成安装环境并结合内网穿透工具实现公网访问内网服务
  • 【 云原生 | K8S 】kubeadm 部署Kubernetes集群
  • Redis 5大数据类型命令解读
  • 作为程序员,我建议你学会写作
  • 如何解决网页中的pdf文件无法下载?pdf打印显示空白怎么办?
  • 在Spring Boot中使用进程内缓存和Cache注解
  • 当我只有一个代理,我该如何从内网搭建一个docker环境
  • edge/chrome浏览器favicon.ico缓存问题
  • TEMU要求提交RSL Report 铅镉RSL邻苯项目化学物质检测报告
  • Sentinel
  • Clickhouse学习笔记
  • 【博客系统】 二
  • Vue 路由使用
  • 虚幻C++ day5
  • 【matlab学习】组合系统的模型计算
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • codis proxy处理流程
  • Docker容器管理
  • Effective Java 笔记(一)
  • express + mock 让前后台并行开发
  • laravel with 查询列表限制条数
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Sass 快速入门教程
  • SpringBoot几种定时任务的实现方式
  • Vue.js-Day01
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 程序员该如何有效的找工作?
  • 对象管理器(defineProperty)学习笔记
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 排序算法之--选择排序
  • 前端
  • 网页视频流m3u8/ts视频下载
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 从如何停掉 Promise 链说起
  • #Spring-boot高级
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • $ git push -u origin master 推送到远程库出错
  • (175)FPGA门控时钟技术
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (二)pulsar安装在独立的docker中,python测试
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (论文阅读11/100)Fast R-CNN
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (转载)从 Java 代码到 Java 堆
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET 常见的偏门问题
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .net 怎么循环得到数组里的值_关于js数组
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • [《百万宝贝》观后]To be or not to be?
  • [AIGC] 使用Curl进行网络请求的常见用法