深度学习:C++和Python如何对大图进行小目标检测

        最近在医美和工业两条线来回穿梭,甚是疲倦,一会儿搞搞医美的人像美容,一会儿搞搞工业的检测,最近新接的一个项目,关于瑕疵检测的,目标图像也并不是很大吧,需要放大后,才能看见细小的瑕疵目标。有两种,一种是912*5000的图,一种是1024*2048的图,但是深度学习训练的时候,对图像的大小有一定的限制,比方说我的电脑配置可能就只能最大跑1024*1024大小的图像,否则就出现内存溢出,无法进行训练,对于这种912*5000的图就比较不好训练,如果把它强制转化成912*912大小的话,细小的目标可能会丢失。所以只能对其进行裁剪,如何裁剪,裁剪的多大,这样根据你自己的图像情况去设置,比方说你的图像是有一些冗余信息的,可以考虑裁剪的时候把空白区域裁剪出去,反正具体问题具体分析吧。具体最后瑕疵检测我用的哪个模型,这里就不赘述了,这里主要是想总结一些图像裁剪的方法,代码实现,以供大家参考使用。

 方法1、

std::vector<std::vector<int64_t>> compute_steps_for_sliding_window(std::vector<int64_t> image_size, std::vector<int64_t> tile_size, double tile_step_size)
{std::vector<double> target_step_sizes_in_voxels(tile_size.size());for (int i = 0; i < tile_size.size(); ++i)target_step_sizes_in_voxels[i] = tile_size[i] * tile_step_size;std::vector<int64_t> num_steps(tile_size.size());for (size_t i = 0; i < image_size.size(); ++i)num_steps[i] = static_cast<int64_t>(std::ceil((image_size[i] - tile_size[i]) / target_step_sizes_in_voxels[i])) + 1;std::vector<std::vector<int64_t>> steps;for (int dim = 0; dim < tile_size.size(); ++dim) {int64_t max_step_value = image_size[dim] - tile_size[dim];double actual_step_size;if (num_steps[dim] > 1)actual_step_size = static_cast<double>(max_step_value) / (num_steps[dim] - 1);elseactual_step_size = 99999999999;std::vector<int64_t> steps_here(num_steps[dim]);for (size_t i = 0; i < num_steps[dim]; ++i)steps_here[i] = static_cast<int64_t>(std::round(actual_step_size * i));steps.push_back(steps_here);}return steps;
}

 方法2:

std::vector<cv::Mat> splitImageIntoBlocks(const cv::Mat& image, int blockSize) {std::vector<cv::Mat> blocks;int rows = image.rows / blockSize;int cols = image.cols / blockSize;for (int i = 0; i < rows; ++i) {for (int j = 0; j < cols; ++j) {cv::Rect roi(j * blockSize, i * blockSize, blockSize, blockSize);cv::Mat block = image(roi).clone();blocks.push_back(block);}}return blocks;
}

方法3:

int divideImage(const cv::Mat& img, int blockWidth,int blockHeight,std::vector<cv::Mat>& blocks){// init image dimensionsint imgWidth = img.cols;int imgHeight = img.rows;std::cout << "IMAGE SIZE: " << "(" << imgWidth << "," << imgHeight << ")" << std::endl;// init block dimensionsint bwSize;int bhSize;int y0 = 0;while (y0 < imgHeight){// compute the block heightbhSize = ((y0 + blockHeight) > imgHeight) * (blockHeight - (y0 + blockHeight - imgHeight)) + ((y0 + blockHeight) <= imgHeight) * blockHeight;int x0 = 0;while (x0 < imgWidth){// compute the block heightbwSize = ((x0 + blockWidth) > imgWidth) * (blockWidth - (x0 + blockWidth - imgWidth)) + ((x0 + blockWidth) <= imgWidth) * blockWidth;// crop blockblocks.push_back(img(cv::Rect(x0, y0, bwSize, bhSize)).clone());// update x-coordinatex0 = x0 + blockWidth;}// update y-coordinatey0 = y0 + blockHeight;}return 0;
}

代码细节就不在描述了哈,自己理解吧,上面是c++的实现,下面写一个python实现的也比较简单,直接利用滑动框的库SAHI,只要pip这个库,调用这个库里的滑动框函数就可以了实现了。

代码如下 :

# arrange an instance segmentation model for test
from sahi import AutoDetectionModel
import time
import cv2
from sahi.utils.cv import read_image
from sahi.utils.file import download_from_url
from sahi.predict import get_prediction, get_sliced_prediction, predict
from IPython.display import Image
model_path = 'runs/train/exp/weights/best.pt'
detection_model = AutoDetectionModel.from_pretrained(model_type='xxx',model_path=model_path,confidence_threshold=0.3,device="cuda:0", # or 'cuda:0'
)
image_name="anormal.jpg"
currentTime = time.time()
result = get_sliced_prediction("test/"+image_name,detection_model,slice_height = 640,slice_width = 640,overlap_height_ratio = 0.2,overlap_width_ratio = 0.2
)
result.export_visuals(export_dir="test/",file_name="output_"+image_name)#图像保存,output_anormal.jpg
endTime = time.time()
print("时间差:", endTime - currentTime)

关于这里面的model_type的变量值,我此处用xx表示了,你可以在代码里按住ctr。点函数

AutoDetectionModel进到相应类的脚本,在脚本最上方有model_tpye变量里选择你用的模型,比方说你用的yolov8,那么xxx就置换为yolov8。
MODEL_TYPE_TO_MODEL_CLASS_NAME = {"yolov8": "Yolov8DetectionModel","rtdetr": "RTDetrDetectionModel","mmdet": "MmdetDetectionModel","yolov5": "Yolov5DetectionModel","detectron2": "Detectron2DetectionModel","huggingface": "HuggingfaceDetectionModel","torchvision": "TorchVisionDetectionModel","yolov5sparse": "Yolov5SparseDetectionModel","yolonas": "YoloNasDetectionModel","yolov8onnx": "Yolov8OnnxDetectionModel",
}

然后运行就可以了。不在细细描述了,自己研究吧。不理解的可以评论询问。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/39117.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Java的跨平台移动应用开发

基于Java的跨平台移动应用开发 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨基于Java的跨平台移动应用开发&#xff0c;这是一种强大的技术方案…

使用 App Store Connect API 生成和读取分析报告

文章目录 前言安装 API Swift SDK配置 API Swift SDK生成分析报告获取所有可用的报告获取报告的分段下载分段的数据总结 前言 Apple 最近推出了50多个新的分析报告&#xff0c;其中包含数百个新的数据点和指标&#xff0c;以帮助开发者了解他们的应用程序的表现情况。 这些报…

构建安全稳定的应用:Spring Security 实用指南

前言 在现代 Web 应用程序中&#xff0c;安全性是至关重要的一个方面。Spring Security 作为一个功能强大且广泛使用的安全框架&#xff0c;为 Java 应用程序提供了全面的安全解决方案。本文将深入介绍 Spring Security 的基本概念、核心功能以及如何在应用程序中使用它来实现…

相比共享代理,为什么要用独享代理IP?

随着互联网的广泛普及和应用&#xff0c;涉及网络隐私、数据安全和网络访问控制的问题变得越来越重要。代理服务器作为一种常见的网络工具&#xff0c;可以在跨境电商、海外社媒、SEO投放、网页抓取等领域发挥作用&#xff0c;实现匿名访问并加强网络安全。在代理服务器类别中&…

Hadoop:全面深入解析

Hadoop是一个用于大规模数据处理的开源框架&#xff0c;其设计旨在通过集群的方式进行分布式存储和计算。本篇博文将从Hadoop的定义、架构、原理、应用场景以及常见命令等多个方面进行详细探讨&#xff0c;帮助读者全面深入地了解Hadoop。 1. Hadoop的定义 1.1 什么是Hadoop …

CDC模型

引言 聚类是一种强大的机器学习方法&#xff0c;用于根据特征空间中元素的接近程度发现相似的模式。它广泛用于计算机科学、生物科学、地球科学和经济学。尽管已经开发了最先进的基于分区和基于连接的聚类方法&#xff0c;但数据中的弱连接性和异构密度阻碍了其有效性。在这项…

Linux 下的性能监控与分析技巧

在日常的服务器管理和问题诊断过程中&#xff0c;Linux 命令行工具提供了强大的支持。本文通过几个常用的示例&#xff0c;介绍如何快速定位问题、监控服务器性能。 无论你是编程新手还是有一定经验的开发者&#xff0c;理解和掌握这些命令&#xff0c;都将在你的工作中大放异…

第四篇——作战篇:战争里的激励与成本

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 前面进行了分析之后&#xff0c;这篇显然又从经济的角度进行了介绍和分析…

STELLA系统动态模拟技术及在农业、生态及环境等科学领域中的应用技术

STELLA是一种用户友好的计算机软件。通过绘画出一个系统的形象图形&#xff0c;并给这个系统提供数学公式和输入数据&#xff0c;从而建立模型。依据专业兴趣&#xff0c;STELLA可以用来建立各种各样的农业、生态、环境等方面的系统动态模型&#xff0c;为科研、教学、管理服务…

用例子和代码了解词嵌入和位置编码

1.嵌入&#xff08;Input Embedding&#xff09; 让我用一个更具体的例子来解释输入嵌入&#xff08;Input Embedding&#xff09;。 背景 假设我们有一个非常小的词汇表&#xff0c;其中包含以下 5 个词&#xff1a; "I""love""machine"&qu…

10 Posix API与网络协议栈

POSIX概念 POSIX是由IEEE指定的一系列标准,用于澄清和统一Unix-y操作系统提供的应用程序编程接口(以及辅助问题,如命令行shell实用程序),当您编写程序以依赖POSIX标准时,您可以非常肯定能够轻松地将它们移植到大量的Unix衍生产品系列中(包括Linux,但不限于此!)。 如…

DeepFaceLive----AI换脸简单使用

非常强大的软件,官方github https://github.com/iperov/DeepFaceLive 百度云链接: 链接&#xff1a;https://pan.baidu.com/s/1VHY-wxqJXSh5lCn1c4whZg 提取码&#xff1a;nhev 1下载解压软件 下载完成后双击.exe文件进行解压.完成后双击.bat文件打开软件 2 视频使用图片换…

k8s部署单机版mysql8

一、创建命名空间 # cat mysql8-namespace.yaml apiVersion: v1 kind: Namespace metadata:name: mysql8labels:name: mysql8# kubectl apply -f mysql8-namespace.yaml namespace/mysql8 created# kubectl get ns|grep mysql8 mysql8 Active 8s二、创建mysql配…

Ubuntu环境下Graphics drawString 中文乱码解决方法

问题描述 以下代码在,在本地测试时 ,可以正常输出中文字符的图片,但部署到线上时中文乱码 // 获取Graphics2D对象以支持更多绘图功能 Graphics2D g2d combined.createGraphics(); // 示例字体、样式和大小 Font font new Font("微软雅黑", Font.PLAI…

Swagger:swagger和knife4j

Swagger 一个规范完整的框架 用以生成,描述,调用和可视化 主要作用为 自动生成接口文档 方便后端开发进行接口调试 Knife4j 为Java MVC框架集成 依赖引入: <!-- knife4j版接口文档 访问/doc.html--> <dependency><groupId>com.github.xiaoymin<…

SSM学习4:spring整合mybatis、spring整合Junit

spring整合mybatis 之前的内容是有service层&#xff08;业务实现层&#xff09;、dao层&#xff08;操作数据库&#xff09;&#xff0c;现在新添加一个domain&#xff08;与业务相关的实体类&#xff09; 依赖配置 pom.xml <?xml version"1.0" encoding&quo…

解决ScaleBox来实现大屏自适应时,页面的饼图会变形的问题

封装一个公用组件pieChartAdaptation.vue 代码如下&#xff1a; <template><div :style"styleObject" class"pie-chart-adaptation"><slot></slot></div> </template><script setup lang"ts"> impo…

2.2.3 C#中显示控件BDPictureBox 的实现----控件实现

2.2.3 C#中显示控件BDPictureBox 的实现----控件实现 1 界面控件布局 2图片内存Mat类说明 原始图片&#xff1a;m_raw_mat ,Display_Mat()调用时更新或者InitDisplay_Mat时更新局部放大显示图片&#xff1a;m_extract_zoom_mat&#xff0c;更新scale和scroll信息后更新overla…

2024年精选100道软件测试面试题(内含文档)

测试技术面试题 1、我现在有个程序&#xff0c;发现在 Windows 上运行得很慢&#xff0c;怎么判别是程序存在问题还是软硬件系统存在问题&#xff1f; 2、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f; 3、测试的策略有哪些&#xff1f; 4、正交表测试用…

Eureka与Spring Cloud Bus的协同:打造智能服务发现新篇章

Eureka与Spring Cloud Bus的协同&#xff1a;打造智能服务发现新篇章 在微服务架构中&#xff0c;服务发现是实现服务间通信的关键机制。Eureka作为Netflix开源的服务发现框架&#xff0c;与Spring Cloud Bus的集成&#xff0c;提供了一种动态、响应式的服务治理解决方案。本文…