深度学习: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);
		else
			actual_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 dimensions
	int imgWidth = img.cols;
	int imgHeight = img.rows;
	std::cout << "IMAGE SIZE: " << "(" << imgWidth << "," << imgHeight << ")" << std::endl;
	// init block dimensions
	int bwSize;
	int bhSize;
	int y0 = 0;
	while (y0 < imgHeight)
	{
		// compute the block height
		bhSize = ((y0 + blockHeight) > imgHeight) * (blockHeight - (y0 + blockHeight - imgHeight)) + ((y0 + blockHeight) <= imgHeight) * blockHeight;
		int x0 = 0;
		while (x0 < imgWidth)
		{
			// compute the block height
			bwSize = ((x0 + blockWidth) > imgWidth) * (blockWidth - (x0 + blockWidth - imgWidth)) + ((x0 + blockWidth) <= imgWidth) * blockWidth;
			// crop block
			blocks.push_back(img(cv::Rect(x0, y0, bwSize, bhSize)).clone());
			// update x-coordinate
			x0 = x0 + blockWidth;
		}
		// update y-coordinate
		y0 = 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.mfbz.cn/a/770206.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

行人检测技术:思通数科大模型在自动驾驶安全中的应用

在自动驾驶技术飞速发展的今天&#xff0c;行人检测已成为确保道路交通安全的关键技术之一。本文将探讨如何结合思通数科大模型和计算机视觉技术&#xff0c;实现在城市交通环境中对行人的高效检测&#xff0c;为自动驾驶车辆提供必要的行人安全保障。 引言 行人检测技术是利…

Dubbo内部通信流程

我当时在学习的过程中搭建过demo&#xff0c;具体流程就是&#xff0c;我先定义了一个api接口模块&#xff0c;还定义一个服务提供者模块&#xff0c;然后服务提供方实现该接口&#xff0c;定义该方法具体的实现impl类&#xff0c;服务提供方启动时&#xff0c;将要暴露的服务和…

【架构-20】死锁

什么是死锁&#xff1f; 死锁(Deadlock)是指两个或多个线程/进程在执行过程中,由于资源的互相占用和等待,而陷入一种互相等待的僵局,无法继续往下执行的情况。 产生死锁的四个必要条件: &#xff08;1&#xff09;互斥条件(Mutual Exclusion)&#xff1a;至少有一个资源是非共享…

跨阻放大器

#创作灵感# 最近涉及到微电流的监测项目&#xff0c;而里面的核心就是跨阻放大器&#xff0c;所以这里做一个简单的介绍&#xff0c;后续等项目完成了&#xff0c;再做一个实例的介绍。 #正文# 跨阻放大器&#xff08;Transimpedance Amplifier, TIA&#xff09;是一种将输入电…

Windows编程之多线程事件对象(Event Object)用法详解

目录 一、前言 二、基础用法 三、API详解 1.创建事件对象 2控制事件状态 3.等待事件对象&#xff1a; 四、实战案例 1.案例描述 2.代码设计 3.总设计代码 4.运行结果 一、前言 事件对象&#xff08;Event Object&#xff09;是我们在大型项目中&#xff0c;进行多线…

股价持续低迷,业绩颓势不减,冀光恒难救平安银行?

文&#xff5c;新熔财经 作者&#xff5c;宏一 周一一上班&#xff0c;就听到旁边的同事感慨今年股市行情很不错&#xff0c;尤其是银行股&#xff0c;上半年累计上涨了17.02%&#xff0c;是涨幅最大的板块。 听到这里&#xff0c;我美滋滋地打开自己的账户&#xff0c;结…

如何对低代码平台进行分类?

现在市面上的低代码平台就像雨后春笋一样冒出来&#xff0c;而且源源不绝&#xff0c;但总结下来&#xff0c;大致的也就以下三类。 一、 aPaaS多引擎类&#xff08;有很多成熟引擎、做好东西要一起用&#xff09; 这类产品包括&#xff1a;织信Informat&#xff08;国内&…

照明物联网:基于网关的智能照明云监控系统解决方案

智能照明系统就是利用物联网技术&#xff0c;将同一空间的照明、空调、新风、排风等系统共同接入物联网平台&#xff0c;实现了“设备互联、数据互通”的智慧物联能力。照明数据、环境监测数据通过网关上传云端&#xff0c;在云端进行统计分析并将结果通过各种终端共享&#xf…

MySQL—常用的数据类型

数据类型 整型 1.创建一个含有无符号/有符号整型的字段的表 CREATE TABLE L1(id tinyint unsigned #无符号 ) CREATE TABLE L2(id tinyint #默认为有符号 ) 数值型(bit) 2.数值型(bit)的使用 小数 3.数值型(小数)的基本使用 字符串 4.字符串的基本使用 #演示字符串类型…

REGX52.H报错

keil cannot open source input file "REGX52.H": No such file or directory 选择下面这个目录 Keil\C51\INC\Atmel

AI绘画Stable Diffusion 新手入门教程:万字长文解析Lora模型的使用,快速上手Lora模型!

大家好&#xff0c;我是设计师阿威 今天给大家讲解一下AI绘画Stable Diffusion 中的一个重要模型—Lora模型&#xff0c;如果还有小伙伴没有SD安装包的&#xff0c;可以看我往期入门教程2024最新超强AI绘画Stable Diffusion整合包安装教程&#xff0c;零基础入门必备&#xff…

【软件测试】Selenium自动化测试框架 | 相关介绍 | Selenium + Java环境搭建 | 常用API的使用

文章目录 自动化测试一、selenium1.相关介绍1.Selenium IDE2.Webdriverwebdriver的工作原理&#xff1a; 3.selenium Grid 2.Selenium Java环境搭建3.常用API的使用1.定位元素2.操作测试对象3.添加等待4.打印信息5.浏览器的操作6.键盘事件7.鼠标事件8.定位一组元素9.多层框架定…

手把手家教你进行ChatGPT私有化部署

背景 随着AI技术的不断成熟&#xff0c;加上ChatGPT如火如荼的发布新版本迭代更新&#xff0c;人工智能的热度也升温到史无前例的高度。 我们有理由相信&#xff0c;现在身边还不愿主动去接触这项技术&#xff0c;深入了解的小伙伴&#xff0c;在不久的将来&#xff0c;一定会…

网络攻防——kali操作系统基本使用

1.阅读前的声明 本文章中生成的木马带有一定的攻击性&#xff0c;使用时请遵守网络安全相关的法律法规&#xff08;恶意攻击操作系统属于违法行为&#xff09;。 2.环境安装 生成木马主要需要如下工具&#xff1a;kali操作系统&#xff0c;VMware15&#xff08;搭建kali操作…

用Python制作动态钟表:实时显示时间的动画

文章目录 引言准备工作前置条件 代码实现与解析导入必要的库初始化Pygame绘制钟表函数主循环 完整代码 引言 动态钟表是一种直观且实用的UI元素&#xff0c;能够实时显示当前时间。在这篇博客中&#xff0c;我们将使用Python创建一个动态钟表&#xff0c;通过利用Pygame库来实…

无线物联网题集

测试一 未来信息产业的发展在由信息网络向 全面感知和 智能应用两个方向拓展、延伸和突破。 各国均把 物联网作为未来信息化战略的重要内容,融合各种信息技术,突破互联网的限制,将物体接入信息网络。 计算机的出现,开始了第四次工业革命,开始了人机物的高度融合&#xff08;&…

LVS负载均衡群集部署之——DR模式的介绍及搭建步骤

一、LVS-DR集群介绍1.1 LVS-DR 工作原理1.2 数据包流向分析1.3 LVS-DR 模式的特点1.4 LVS-DR中的ARP问题1.4.1 问题一1.4.2 问题二二、构建LVS-DR集群2.1 构建LVS-DR集群的步骤&#xff08;理论&#xff09;1.配置负载调度器&#xff08;192.168.80.30&#xff09;&#xff08;…

护眼指南之适合学生写作业的台灯:看看学生护眼台灯哪个品牌好

随着人们健康意识的提高&#xff0c;越来越多的人开始关注眼睛的健康问题&#xff0c;照明技术的进步也为缓解眼疲劳提供了可能&#xff0c;现在的照明产品可以通过调整光线亮度、色温、频闪等参数&#xff0c;使光线更加柔和、均匀&#xff0c;减少眼睛的不适感。人们都希望通…

重生奇迹MU 最动听的声音 最精彩的游戏

在重生奇迹MU的世界里&#xff0c;每个玩家都是重生奇迹的见证者&#xff0c;同时也是重生奇迹的创造者。每个玩家都有属于自己的冒险故事&#xff0c;每时每刻都会有新的喜悦降临。这款神奇的游戏让人沉浸于冒险的精彩中&#xff0c;实在引人入胜。 “叮”的一声让你倍感喜悦…

<Linux> 多线程

文章目录 线程线程互斥锁死锁 线程同步生产者消费者模型POSIX信号量基于环形队列的生产消费模型 线程池 线程 线程是进程内部可以独立运行的最小单位 进程是资源分配的基本单位&#xff0c;线程是调度器调度的基本单位 线程在进程的地址空间内运行 进程内的大部分资源线程是…