- 博客(40)
- 收藏
- 关注
原创 基于全卷积网络的彩色显微图像光照不均匀校正
参考:论文英文题目:Correction of uneven illumination in color microscopic image based on fully convolutional network在做显微图像相关任务是,遇到由于显微光源或者光学系统孔阑造成的图像局部阴影问题,也可称作图像渐晕。为了校正这类图像问题,看了一些相关的论文。
2024-02-23 16:44:42
1714
1
原创 相位相关匹配法的opencv C++实现
这一段就是PCIAM算法的核心了,计算两幅图像的峰值相关矩阵,也是完全按照matlab移植过来的,但是后面几行,是为了筛选一些不可能存在的情况,比如边缘处的完全重合,或者只有一行,或者一列重合等等情况,由于PCIAM算法在边缘处的响应值高,所以在一些场景下可能是一种干扰,所以进行了剔除,当然可以不剔除,就是对后期的峰值选取会有影响。头文件,以及各类函数,还有主函数,第一次独立的写这种分文件类型的项目,写的拉跨还请包涵,以及当然可以转成类的形式,但感觉有点小麻烦,后期再修改吧。
2023-12-29 15:54:59
2612
9
原创 使用OpenCV DNN模块进行人脸检测
需要对网络进行蒸馏,剪枝,轻量化,是模型大小适宜硬件配置,此外为了更好,更快速的推理,还需要将模型转成不同的模型格式,使其更加适配软件推理。这段代码就是推理的主要流程,其中几个比较重要的点就是blobFromImage函数是将待预测的图片转成网络输入的格式,一般网络的图像输入格式为N,C,H,W。N就是batch数,在推理时一般为1,C即通道数,H,W即为图像的高宽,除此之外这个函数还可缩放图像的像素值,默认1.0表示不变,也可以resize图像宽高,这里缩放到(300X300)为网络的输入。
2023-12-22 16:16:02
2932
2
原创 cuda编程(示例,topk问题,代码解读与cuda基础概念)
使用锁页内存当数据传输频繁且对带宽要求高。使用零拷贝内存对于大量但访问频率较低的数据。使用托管内存以简化内存管理,尤其在数据访问模式不确定的情况下。每种内存类型都有其优势和局限,选择合适的类型取决于具体的应用需求和性能目标。好了,以上是一些基础概念。继续回到代码。总的思路即就是在每个block中求出最大的前20个值,放入中间结果数组,然后再执行一遍核函数对中间结果求前20个,最后输出结果。这样为什么如下定义应该就明白了。#define N 100000000 //数据大小。
2023-12-13 17:22:14
571
原创 C/C++编程中的宏与内联函数
小结,内联函数与宏函数都可在使用处展开,可以避免函数调用的开销,宏函数是由预处理机制展开,不会检查类型安全,所以在传入错误参数时会出问题,而内联函数是一个函数,是由编译器决定是否内联,会对传入的参数进行类型检查。在C++中,在类的内部定义了函数体的函数,被默认为是内联函数。第二个示例中do {...}whlie(0)是宏定义的内容,可以认为是一个函数,这里do{...}while中的内容才是宏的主体,也就是函数内容。所以一般定义宏或者宏函数的代码量都很少,很小,基本上是一些简单操作。
2023-12-12 09:14:46
86
原创 10中排序算法代码实现(Python与C++)
小结,这个算法也很好理解,但只对整数有用,主题也可以理解为哈希查找的一种,这里是利用数组小标来计数,还能改进就是将计数数组的大小精简到max-min+1,做一个0到max-min+1等于min-max的映射,这里c++版本并没有再用一个for循环去累计当前元素的位置。选择排序是一种简单直观的排序算法,它的工作原理是每次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。尽管这不是一个特别高效的算法,但它的实现简单,且在数据量较小的情况下表现良好。
2023-12-10 22:16:14
126
原创 Opencv cuda版本+cuda(五)NLM 非局部均值去噪
非局部均值去噪(Non-Local Means,简称NLM)是一种用于图像处理的去噪算法,特别适用于去除图像中的高斯噪声。它的核心思想是考虑图像中的每个像素,并将其与图像中其他位置的相似区域进行比较。不同于传统的局部去噪方法,NLM算法利用了图像中更广泛区域的信息,从而更好地保持了图像的细节和结构。
2023-12-04 14:10:40
542
1
原创 CUDA全局内存(CUDA C编程 权威指南)
访问共享内存必须同步。常量内存:使用__constant__来修饰常量变量,必须在全局空间内和核函数之外进行声明,大小只有64KB,常量内存时静态声明的,并对统一编译单元中所有的核函数可见。这种类型的内存分配对于主机(CPU)和设备(GPU)之间的异步内存传输非常有利,因为GPU可以直接访问它,无需将数据复制到可分页内存中的缓冲区。统一内存寻址提供了一个“单指针到数据”模型,在概念上类似于零拷贝内存,但零拷贝内存是在主机内存中进行分配,因此受到在PCIe总线上访问零拷贝内存的一个像,核函数性能具有高延迟。
2023-11-30 14:29:08
355
原创 3D缺陷检测(1)
产品异常产生缺陷,缺陷检测检出产品是否存在缺陷,即使识别次品,避免造成更大的损失。内部缺陷:气泡,孔洞,内部裂纹(检测技术:x射线,超声波,机械应力波)外部缺陷:刮痕,破损,脏污(检测技术 2D(图像处理,滤波,分割),3D(点云,深度图))例如:环形3D结构光,不同高度具有不同的颜色,依赖光源的稳定性,均匀性等。3D的数据,点云和深度图。主要以PCB检测为例,比如少锡、多锡、虚焊。通过检测爬锡高度,或者爬坡角度等指标,卡控不良。缺陷检测的准确率很重要,漏检容易造成很严重的问题。
2023-11-25 18:57:54
1025
原创 注意力机制
我们在生活中外观所接受的信息是非常庞大的,但我们的大脑只会专注于一件事。比如,你看到一个场景,里面有天空和云,还有飞机,你的注意力就会直接关注到飞机,因为天空和云在你大脑中会被提示为这是非重要的物品,而飞机则作为重点被当作关注对象。而这种注意力也分为自主的和非自主的。自主的即就是你想做一件事,你的注意力就在其中。(即由内心而发)非自主即就是一种天性,比如你在听人说话时听到谁的八卦时就会很上心,注意力集中在这件事上。(即由感官得到的环境信息)那么怎么才能使用两种方式设计注意力机制的框架呢。
2023-11-19 17:18:39
130
原创 CUDA专家手册+gpu变成权威指南 笔记(一)
CUDA中用于映射锁页内存(mapped pinned memory)的API,把分配的主机内存映射到CUDA内核的地址空间,使得他们能够直接被访问,称作零复制,因为内存是共享的,复制操作不需要通过总线。事实上,在传输受限型的工作量上,一个集成的GPU可以超过一个更大的独立GPU。虚拟寻址,虚拟地址空间,为物理内存一个一个分配连续编号,以便进行访问,比如0~64kb内存位置是0~65535,指定内存位置的16位值成为地址,地址的计算和相应内存位置上的操作过程统称为寻址。点对点内存寻址是非对称的。
2023-11-12 16:40:21
220
原创 CUDA编程实例:图像处理的归一化相关系数计算
该方法在模板匹配中经常使用,通过计算模板图像与输入图像子集的相关性信息,判断图像中是否包含该模板,如果在某个位置处强相关,则返回匹配位置。归一化互相关的流行源于其幅度的独立性(amplitude independence),这就意味着即使两幅图像的亮度不同,但对于其统计信息也是稳定的。其中I和T,表示图像和模板,\bar{T}为模板像素的品均值,\bar{I}为图像中对应模板范围的像素的平均值。所以预先要求的就是图像和模板的统计量SumI,SumT,SumIT,sumI^2,sumT^2。
2023-11-10 16:09:34
503
原创 opencv_cuda版本+cuda学习 (4)图像的腐蚀与膨胀
腐蚀模板算子,中心和周围8个点,如果周围有像素点为0,则中心点为0。全255,才为255首先对输入的灰度图像二值化,设定自己的阈值,这里设定为130.将图像变成二值图像。后进行腐蚀。二者的索引方式本质上是相同的,但为了对四周像素值及逆行索引,将ix,iy转成ix-1,ix+1,iy-1,iy+1。其中利用max,min的值,设定前面4个索引不会超出图像边界。比如第一个像素(0,0)处只有3个相邻的,(x+1,y)(x+1,y+1),(x,y+1),其他5个都是自己本身,其余类推。
2023-11-08 15:14:21
152
原创 深度学习医学图像语义分割实战(一)
一般是只对图像整体做分类,那么如果是将图像的目标提取出来,这就是语义分割。与分类不同的是,语义分割需要判断每个像素点的类别,进行精确分割,产生目标的掩码,图像的语义分割是像素级别的。
2023-11-06 20:24:01
1144
16
原创 Faster_RCNN 血液细胞检测项目实战(三)
在训练好网络后,训练好的网络权值就保存在checkpoint中,可以看到每个epoch中train和test的miou值。这里说一嘴,在训练的时候 可以看到每个epoch的网络的loss值,loss逐渐减并收敛,当时loss值差不多稳定时,那么就确定网络已经训练好。这时就可以在checkpoint中选择一个权重文件.pth用来推理测试了。以上是一个对比代码,在model之前主要是显示真实数据的标注情况,model后就是对输入图像进行推理,得到输出的细胞分类名及其对应检测框位置。
2023-11-06 19:09:17
164
3
原创 opencv的各模块
OpenCV 是一个流行的计算机视觉库,用于处理图像和视频数据,它包含了许多模块,以支持不同的计算机视觉任务。这是 OpenCV 的核心模块,提供了基本的数据结构和功能,如图像加载、保存、绘图、数据类型转换等。(1)基本的数据结构Core 模块包括了许多基本数据结构,如cv::Mat用于存储图像和矩阵数据,以及cv::Pointcv::Rectcv::Size等用于表示点、矩形和大小的结构。
2023-11-04 19:43:55
330
原创 Faster_RCNN 血液细胞检测项目实战(二)
上一节项目从数据集认识到数据加载器的制作。其实对于任何一个已确定网络框架的深度学习任务,后面的训练并不是最难的,最难的还是如何将数据加载进网络,这就需要将数据制作成适合网络的形状,这一点很难,因为我们无法预料到我们的原始数据集是怎样的,对于越复杂的任务,其数据集越难处理。不过对于血细胞检测的分类回归任务包含了对标签,标签框的处理,由于图像这块数据集已经提前进行过数据增强所以就不需要我们操作。有了以上的总结,从本节开始,逐渐走进网络,但是在此之前还有一个小内容,对于本项目。即如何绘制检测框。
2023-11-03 16:18:50
216
原创 Faster_RCNN 血液细胞检测项目实战(一)
本项目所使用的数据集是BCCD数据集。WBC(白细胞)、RBC(红细胞)、Platelets(血小板)本文所使用的是2021.2.25版本的。包含847张图片,每张图像大小为416x416,图像格式为.jpg所以在后面阶段不需要对图像进行增强操作。当然新版本或者其他版本不同也不影响使用,一些版本图像大小不同,一些对图像并未做预处理,后期可能需要。如果下载的数据集内容不一致,感兴趣的可以在这里下载,我已经上传。该数据集已经分好test,train,vaild文件。
2023-11-02 19:28:20
508
原创 YOLO一些笔记(1)
x,y,w,h 位置误差,x,y的位置误差(平方差之和) + w,h的大小误差(根号差的平方之和),因为物体的大小不一样,物体有可能会小一点,需要为w,h加根号对小物体的检测更敏感。大的卷积核参数多,堆叠小的卷积核所需的参数更少一些,并且卷积越多,特征提取就会越细致,加入的非线性变换也随着增多,还不会增大权重的参数个数。所以TP = 20,女生得到女生,FP = 30,男生得到女生,FN = 0 ,男生得到男生,没有这个情况,TN女生得到男生, 80-30 = 50;(先预选,后得到结果)
2023-10-29 21:29:14
53
1
原创 图像拼接算法总结:
图像拼接技术主要有三个主要步骤:图像预处理:图像预处理主要指对图像进⾏⼏何畸变校正和噪声 点的抑制等,让参考图像和待拼接图像不存在明显的⼏何畸变。图像配准:图像配准主要指对参考图像和待拼接 图像中的匹配信息进⾏提取,在提取出的信息中寻找最佳的匹配,完成图像间的对齐。图像拼接的成功与否主要是图像的配准。待拼接的图 像之间,可能存在平移、旋转、缩放等多种变换或者⼤⾯积的同⾊区域等很难匹配的情况,⼀个好的图像配准算法应该能够在各种情况下准 确找到图像间的对应信息,将图像对齐。图像融合:。
2023-10-28 20:08:25
920
原创 CUDA编程(十三) CUDA标准库与Thrust库
CUDA标准库简介Thrust 库Thrust 是一个实现了众多基本并行算法的C++模板库,类似于C++的标准模板库(stan dard template library,STL)。该库自动包含在 CUDA 工具箱中。这是一个模板库,仅仅由 一些头文件组成。在使用该库的某个功能时,包含需要的头文件即可。该库中的所有类型 与函数都在名字空间(namespace)thrust中定义,所以都以thrust::开头。用名字空间 的目的是避免名字冲突。例如,Thrust中的thrust::sort和STL
2023-10-28 19:06:02
1174
原创 CUDA编程(十二)使用同一内存编程
统一内存是一种逻辑上的概念,它既不是显存,也不是主机的内存,而是一种系统中 的任何处理器(CPU或GPU)都可以访问,并能保证一致性的虚拟存储器。这种虚拟存储 器是通过CPU和GPU各自内部集成的内存管理单元(memorymanagementunit)实现的。在某种程度上,可以将一个系统中某个处理器的内存看成整个统一内存的超级大缓存。在统一内存之前,还有一种零复制内存(zero-copymemory)。
2023-10-28 18:52:18
246
原创 CUDA编程(十一)CUDA流
我们之前讨论的都是核函数内部的并行。核函数外部的并行主要指:1.2.3.4.5.核函数计算,主机计算,数据传输,这里的核函数外部并行就是这三者的相互并行,不同的是核函数有好多可以并行,数据传输也是可以是并行。srccountkind第四个参数具有不同的数据传输类型,这种也可以做到并行。一般来说,核函数外部的并行不是开发CUDA程序时考虑的重点。我们前面强调过,要获得较高的加速比,需要尽量减少主机与设备之间的数据传输及主机中的计算,尽量在设备中完成所有计算。
2023-10-28 18:44:24
612
原创 opencv_cuda版本+cuda学习 (二)图像反向
img是待处理图像在设备上的副本,d_dst是预先申请处理后的图像。前两个参数都是int类型,而后面两个是参数是PtrStepb类型,这在上节也有提到,它是OpenCV中的一个封装类,允许你以指针方式访问图像数据,同时提供了图像的宽度和步幅信息。我们想象一下,我们将一个3通道的图像存放在GPU中,我们对图像的操作本质上还是在一个3维的立体空间中,只不过实际情况下电脑是将图像数据展开成一维。而里面的操作索引却采用 3*x,3*x+1,3*x+2,基于这样的索引可以明白,图像在GPU的存储方式应该是这样的。
2023-10-28 15:06:46
91
原创 CUDA编程10 线程束基本函数与协作组
线程束(warp)一个线程块分成两个线程束,每个线程束都是连续的32个线程。从硬件上来看,一个GPU被分为若干个流多处理器(SM)。核函数中定义的线程块在执行时将被分配到还没有完全沾满的SM中。一个线程块不会被分配到不同的SM中,而总是在一个SM中,但一个SM可以有一个或多个线程块。不同的线程块之间可以并发或顺序地执行,一般来说不能同步(即使利用协作组,也只能在一些特殊的情况下进行线程块的同步)。当某些线程块完成计算任务后。对应的SM会部分或完全地空闲,然后会有新的线程块被分配到空闲的SM。
2023-10-27 18:54:23
895
1
原创 opencv_cuda版本+cuda编程学习(一)图像显示
首先来看看上一节的代码,因为是并没有完整的学过opencv,所以一些opencv的基础我也会查清楚。
2023-10-26 16:52:02
757
原创 在VS2022中配置opencv_cuda版本,并运行,与cuda runtime结合
完了之后,因为是vs2022,所以在空项目里跑.cu文件时修改不到CUDA文件类型,所以会出问题。这里我是在cuda runtime项目里配置的opencv cuda环境。其中有些gpu文件时opencv的老文件了,在新版已经舍弃了。刚开始学习opencv与cuda配合的操作。我是cuda11.6,opencv4.6,没啥问题。安装cuda工具,opencv编译创建环境啥的。然后测试运行了这本书里的代码。就是编译会花很长很长时间。
2023-10-26 14:51:50
401
原创 CUDA编程(九)原子函数的合理使用
实施原子操作(atomicoperation)的函数,简称为原子函数。在CUDA中,一个线程的原子操作可以在不受其他线程的任何操作的影响下完成对某个(全局内存或共享内存中的)数据的一套“读-改-写”操作。该套操作也可以说是不可分的。
2023-10-26 14:39:34
512
3
原创 CUDA编程(八)共享内存的合理使用
共享内存:共享内存是 一种可被程序员直接操控的缓存,主要作用有两个:一个是减少核函数中对全局内存的访问次数,实现高效的线程块内部的通信,另一个是提高全局内存访问的合并度。我们将通 过两个具体的例子阐明共享内存的合理使用,包括一个数组归约的例子和第7节讨论过的 矩阵转置的例子。其中,数组归约是一个非常适合学习CUDA编程的例子,通过它可以了 解CUDA编程的很多方面。
2023-10-25 16:03:11
499
原创 CUDA编程(七)全局内存的合理使用
当读取全局内存以及仅使用L2缓存的情况时,一次数据传输指的就是将32字节的数据从全局内存(DRAM)通过32字节的L2缓存片段(cache sector)传输到SM。比如,第一个线程块中的线程束将访问x中的0~31个元素,对应128字节的连续内存,而且首地址一定是256字节的整数倍。因为这里 的每一对数据都不在一个连续的32字节的内存片段,故该线程束的访问将触发次 数据传输。合并访问指的时一个线程束对全局内存的一次访问请求(读或者写)导致最少数量的数据传输,否则称访问时非合并的。
2023-10-24 10:34:18
252
原创 CUDA编程(六)CUDA的内存组织
现代计算机中的内存往往存在一种组织结构(hierarchy)。在这种结构中,含有多种类 型的内存,每种内存分别具有不同的容量和延迟(latency,可以理解为处理器等待内存数 据的时间)。一般来说,延迟低(速度高)的内存容量小,延迟高(速度低)的内存容量大。当前被处理的数据一般存放于低延迟、低容量的内存中;当前没有被处理但之后将要被处理的大量数据一般存放于高延迟、高容量的内存中。相对于不用分级的内存,用这种分级的内存可以降低延迟,提高计算效率。总结,内存两个重要参数容量和延迟,一般,容量大,延迟高。
2023-10-23 21:58:52
267
原创 CUDA编程 (五)获得GPU加速的关键
CUDA程序获得高性能要求:1.数据传输比例所占时间小。2.核函数的算术强度较高。3.核函数中定义的线程数目较多。所以,在编写与优化CUDA程序时,一定要想方设法(主要是指仔细设计算法)做到以下 几点:• 减少主机与设备之间的数据传输。• 提高核函数的算术强度。• 增大核函数的并行规模。
2023-10-23 20:07:26
503
原创 CUDA编程(四)程序错误检测
有的错误在编译的过程中就可以被编译器捕捉,称为编译错误。有的错误在编译期间没有被发现,但在 运行的时候出现,称为运行时刻的错误。运行时刻的错误更难排错。那么如何检测错误就很重要了。
2023-10-23 15:28:29
426
原创 CUDA编程(三)CUDA程序的基本框架
设备函数:核函数可以调用不带执行配置的自定义函数,这样的自定函数称为设备函数(device function)。他是在设备中执行,并在设备中被调用的。与之相比,核函数时在设备中执行,但在主机端被调用。现在也支持在一个核函数中调用其他和函数,甚至该核函数本身。函数执行空间表示符:__gloabal__:核函数,一般由主机调用,在设备中执行,如果使用动态并行,则也可以在核函数中调用自己或其他核函数。__device__:设备函数,只能被核函数或其他设备函数调用,在设备中执行。
2023-10-23 10:59:54
147
原创 CUDA编程(二)CUDA中的线程组织
假如某个核函数的执行配置是<<<10000,256>>>,那么网格大小gridDim.x的值为10000,线程块大小blockDim.x的值为256。线程块指标 blockIdx.x 可以取0到9999之间的值,而每一个线程块中的线程指标threadIdx.x可以取0到255之间的值。所以,核函数中总的线程数就等于网格大小乘以线程块大小,而三括号中的两个数字分别就是网格大小和线程块大小,即<<<网格大小,线程块大小>>>。网格大小2,线程块大小4,总的线程数时2X4=8。这些限制是必须牢记的。
2023-10-22 21:08:23
188
1
原创 cuda编程(一)cuda简介
CUDA提供两层API接口,CUDA驱动(driver)API和CUDA运行时(runtime)API。GPU概念,图形处理器,也称显卡,适合进行密集数据运算,包含大量ALU计算核心。CPU概念,中央处理器,适合进行逻辑,ALU计算核心较少。4.显存带宽,运算单元与显存的传输速率,带宽越大,交换速率越大。GPU本省并不能单独计算,CPU+GPU组成异构计算架构;GPU作为CPU的协处理器,一般称为Device。CUDA支持C++,python,java。CUDA是一个软件平台,配合GPU使用。
2023-10-21 16:57:26
575
原创 字节跳动春招研发部分编程题 1 万万没想到之聪明的编辑
如果count1为2则表示要求AA格式,flag标识符加1,若不相同,则替换之前的字符tmp为当前字符,count1重置为1;当检测到AABC时,这里利用count2对变化计数,计数为2则表示AA-B-C,变换两次,flag自减为0,不满足剔除定律,当检测到AABCC时,flag = 0,不满足剔除,则实现顺序优先剔除。并且flag = 2,则为AABB格式,所以要剔除最后一个B,将count1重置为1,flag--,即退化为AAB合适,在其他情况则将是s[i]追加至t的后面,利用t = t+s[i];
2023-06-30 16:39:35
286
原创 Visual studio 项目中包含多个可以运行的文件时,如何让他们不影响指定文件的运行
解决以上问题,只需要将不需要运行的文件从生成内容中排除即可,即右键cpp文件,属性-常规-从生成内容中排除,选是即可,cpp文件右下角会出现一个红色的禁止符号。这样虽然省去了创建项目的时间,但代码也因此跑不了了,因为一个项目里存在多个main函数,即会出现以下问题 LNK200。在初步学习C++时,跟着视频老师学习C++,不想每一个文件都创建一个项目很麻烦,所以将多个文件创建在了一个项目下。以上即为解决办法,入门小白,第一篇。
2023-04-04 21:33:50
633
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人