- 博客(46)
- 资源 (9)
- 收藏
- 关注
原创 AI 魔法:无需代码,AI 助手 40 分钟构建手势识别系统
需要在距离判断后,当距离足够近的时候,再对移动距离进行判断,如果移动距离很小,就不改变是否握持的判断结果,若移动距离较大,才重新判断握持状态""现在程序的整体逻辑已经差不多了,但是仅根据一帧的判别结果就修改最终的握持判定有一些不稳定,结果有的时候会存在闪烁,我想,在判断结果的时候,如果连续3帧都做出了同一判定,再修改判定结果,否则判定结果就一直保持原装""现在对检测到的手的坐标和鼠标的坐标进行判断,根据坐标、手型、两者的运动关系,判断是否在手拿着鼠标,还是没有拿着,并把是否拿鼠标的检测结果显示在左上角"
2025-02-27 10:14:18
613
原创 Halcon.Net与Numpy、OpenCV联合编程
Halcon作为一个机器视觉领域的家喻户晓的工具,包含了非常多的算子,在工程中使用起来是非常方便的。但是一些更学术的功能,或是一些开源的前沿算法,Halcon中是不具有的,这时OpenCV可能是更适合的解决方案。这篇博客记录了我将Python代码中的函数返回的Numpy数组转化为Halcon.Net的HImage变量的方法。1. Python代码编写。这一步没有什么特殊的,就是常规的一个Python函数,返回值是一个Numpy对象。2. C#调用Python函数。[捂脸]这个实现是真的很小众。
2025-02-11 10:06:30
449
原创 C#调用Python的函数(编译为pyd,避免源码泄露)
我的电脑上是通过anaconda来使用的python,这个python并不在我的系统环境变量中,所以程序运行时找不到python解释器。其中,durand_22是我的pyd文件的名称,SharpenImage是我的python函数名,imagePath是函数的输入参数,dd是函数的输出,是一个numpy的数组,表示高清化后的图像数据。将Python代码编译为pyd动态库,在C#中直接调用Python的函数,经过对比,代码执行效果和速度与Python环境中完全一致,pyd文件还避免了python源码的泄露。
2025-02-11 09:28:36
747
原创 (M3DM)RGB-D异常检测经典论文《Multimodal Industrial Anomaly Detection via Hybrid Fusion》阅读笔记-1
这篇文章收录于2023年CVPR,文章下载链接,代码下载链接。文章的代码目前已经137星了,在异常检测领域尤其是RGB-D异常检测这个一个细分领域中应该是非常难得的高星代码了,其影响力和经典程度由此可见一斑。在我的印象中,这篇文章应该是最早提出的跨模态知识蒸馏方式,取得了最高分数的同时也启发了很多其他同领域的学者,后续又出现了几篇对它的升级和完善的文章,我也会在随后的博客中逐一介绍并作出对比分析。文章所提出的模型的整体结构如下图:输入为RGB图像和点云。
2024-09-14 15:10:10
1933
3
原创 3D异常检测最新论文《Complementary Pseudo Multimodal Feature for Point Cloud Anomaly Detection》阅读笔记
在BTF这篇文章中指出,点云的特征提取至关重要,但因为预训练点云特征网络的训练与使用的域差异,导致这些网络的性能甚至不如手工制作的特征提取方法。因此,作者产生了将二者结合起来的思路。之后,根据投影过程的对应关系,可以将每个像素的2D特征赋给对应的3D点,并使用平均值池化进行聚合,也就是一个3D点的特征是它对应的不同视角下所得到的这些2D特征的平均。另外对于在MVTec 3D-AD上进行3D异常检测的算法,其评判标准有失偏颇,因为一些缺陷是仅能通过RGB判断的,这对统计3D异常检测算法的性能是不充分的。
2024-09-12 10:59:32
1403
2
原创 异常检测经典论文:《Catching Both Gray and Black Swans: Open-set Supervised Anomaly Detection》阅读笔记-2:异常分数解析
其中的已见异常和人工异常训练过程中的损失函数是如下定义的,在异常图像的所有patch中,选择其中异常分数最高的k个patch进行损失计算。这样做的原因是,异常图像中的多数patch也是与正常图像的特征一致的,也就是说,有问题的异常区域只是图像的一部分。毕竟是21年的文章了,有些老了。异常评分网络的训练之前,首先要对异常分数进行指导,(或者说是进行数据的标注),这篇文章中提出了一个“参考分数生成器”,通过对随机选择的一些样本的异常分数进行统计,获得异常分数的均值方差,然后。
2024-09-09 10:48:31
531
原创 异常检测经典论文:《Catching Both Gray and Black Swans: Open-set Supervised Anomaly Detection》阅读笔记-1
综合:在训练过程中,已知异常被送入head1和head3, 生成异常被送入head2和head3,正常样本被送入head1,head2,head3,head4,经过训练后,我的理解是,head1输出一个样本属于已知异常的分数,head2输出该样本为合成异常的分数,head3输出该样本为异常的分数(通过与参考样本做差得到的残差特征),head4输出该样本为合格样本的分数。这部分就有很多的类似方式了,有一系列的异常检测算法就是通过生成伪缺陷图像进行训练的,我觉得这里也可以换成其他的类似方式。
2024-09-05 10:37:42
1075
原创 多模态工业异常检测算法整理
本文统计了MVTec 3D-AD上的多个多模态异常检测算法,仅对比其I-AUROC指标。数据的来源为,这位博主经常分享很多工业异常检测的优秀博文,质量很高。和。
2024-08-30 10:05:29
1354
1
原创 CPMF复现笔记(2):训练MVTecAD-3D数据集, 精度SOTA
在上一篇博文中,我详细介绍了CPMF的环境配置与数据预处理,预处理的作用有2个:第一是去除背景(这也是几乎所有MVTecAD-3D相关文章都会进行的操作),二是生成多视角图像和与之对应的点云特征。小插曲:root/feature_extractors/features.py的第66行需要稍微修改一点,因为模型和数据一个在cpu一个在gpu,不然会报错。可以看到,对于每一个xyz,都生成了一系列的各个视角的图像。在这里,我的实验名称为t1,那么我得到的结果保存在results/csv/t1.csv中。
2024-08-20 16:56:04
894
原创 CPMF复现笔记(1):docker环境配置+数据预处理
我只是解决了这个问题,但对于其中的原理并没有深入的了解(我只想尽快开展异常检测算法的研究,不想在这里多花费精力)希望其他朋友遇到类似的问题时可以从这篇文章中得到帮助。从init.sh中可以看到,作者使用的是torch1.13.1+cu116,刚好我之前拉取过这个镜像,就直接创建容器了。3. 下载MVTec3D-AD数据集,作者给出了下载链接,但我之前已经下载好了,就按照对应的路径导入到docker容器中了。作为对比,我测试了matplotlib的远程可视化功能,我在容器中运行了如下代码,
2024-08-20 14:19:50
1136
原创 Docker+Win11:显示Docker中的GUI,解决报错“[Open3D WARNING] GLFW Error: X11: Failed to open display :0 [Open3D”
之前查看了很多相关的为docker挂载显示器的博客,其中都是使用了本机的物理地址或127.0.0.1,我使用后都是不成功的,因为这些博客的宿主机都是linux,而我使用的是windows。我查阅了很多资料,但几乎没有人在Windows宿主机上解决这个问题,所以我将我的解决办法分享出来,希望帮助到同样遇到这个问题的朋友。在本系列博文中,我将Pytorch部署在Win11为宿主的Docker中,并成功的调用GPU进行了训练。如果你运行了代码,时钟顺利的显示到你的显示器上,那么恭喜你,你已经成功完成了配置!
2024-08-20 12:55:59
1151
原创 Halcon中的三维位姿变换实现公转与自转效果(有代码)
回到本案例,我们所最终得到的工件位姿等价于依次进行变换: [0,0,0,0,0,theta,0],Pose1,[0,0,0,0,0,-1*theta,0]。4. 加入公转运动后的工件位姿为pose2 := pose_compose([0,0,0,0,0,theta,0],Pose1 )3. 当工件转动角度theta时,创建转动位姿PoseRotate := [0,0,0,0,0,theta,0]5. 加入自转的工件位姿为pose_compose(pose2 ,[0,0,0,0,0,-1*theta,0])
2024-08-19 17:13:29
480
原创 Anomaly Detection(8):异常检测的学术与工业界差异
初期的生产线上往往是人机共存的,若是模型能够达到极高的召回率(即次品几乎完全检出了,虽然此时的误检也很多),我便可以安排人工只检测模型认为有问题的产品,这节省了一定比例的人工。反之,若模型具有极高的精准率,那么它可以在几乎不干扰人工生产过程的情况下,对人工检查过的产品进行复检,一定程度的提高产品质量。但是目前的主流模型普遍追求的是最高的F1Score,并没有把极致的精准率或召回率作为目标,导致很难应用到实际的项目中去。),很多模型已经达到了非常完美的性能,他们的图像准确率普遍超过99.5%。
2024-08-16 16:14:57
656
5
原创 Anomalib(7):使用配置文件训练自己的数据集
可以看到,主要有trainer,normalization,task,metrics,logging,data,model几大部分,这样一来,我们就不必去写输入参数了,还可以一目了然的看到所有参数的配置情况。并且随着使用的深入和对模型了解的加深,我想要调节模型的一些参数,这时我就不得不翻阅模型的文档查看参数说明,并在指令中通过输入参数来进行设置。第二种也很好理解,当默认参数不能满足你的需求的时候,你可以输入一些参数,来覆盖掉默认的参数;使用这种配置文件的形式去训练自己的数据集,只需要按照我这篇博客。
2024-08-16 15:31:18
2774
原创 Anomalib(6):EfficientAD训练自己的数据集
此外,为了进行快速的检测,教师和学生都采用了这种最简单的PDN结构,相同的模型结构会更加容易让学生模型对教师模型产生过度的泛化,进而影响检测效果。起初我对EfficientAD的细节不够了解,我只是简单的知道EfficientAD属于“教师-学生”类型,需要在大型数据集(如ImageNet)上对教师模型进行训练,之后在异常检测数据集(如MVTecAD)上利用教师模型对学生模型进行蒸馏。因此,我以为只要找到别人在ImageNet上训练好的权重,接下来直接在我自己的数据集上蒸馏就好了。
2024-08-15 16:10:49
1760
8
原创 Win11+docker(5):使用共享显存解决训练模型显存不足的问题
我们的显存都是8GB,这时我才发现,在训练过程中我的显存占用为11G,其中8G为专用显存(3070显卡显存为8G),其余占用了3G的共享显存,但我并没有对共享显存进行过专门的设置。随后,我在其基础上配置了Anomalib,使用了PatchCore训练了MVTec的缺陷检测以及我自己的数据集,取得了很高的准确率(99.7%)。如果您的代码遇到显存不足的问题,手头又没有适合的GPU环境,不妨试一试共享显存的方法。2.我的训练环境是通过docker配置的,他是直接在windows训练的。
2024-08-15 13:15:12
1840
原创 Anomalib:PatchCore使用API与CLI精度不一致(4)
之后我再次在我自己的训练集上进行了训练,这次我的准确率达到了99.4%,这远远超出了我的预期,推理速度大约为160ms(3070GPU)。在前几篇博文中,我使用Win11+Docker配置了anomalib,并成功的训练了我自己的一个火腿肠缺陷检测的数据集,其中使用的模型就是PatchCore。我是这样理解的,这种产品的每个patch都是符合正常品特征的,但貌似模型没有能够充分的理解一个正常品应该包含的各个组成部分,从而使这种部分结构缺失的样本被漏掉。这说明我的代码可能是存在问题的。
2024-08-12 17:48:24
771
3
原创 Win11+docker+vscode配置anomalib并训练自己的数据(3)
数据集是我在工作中收集到的火腿肠缺陷数据,与MVTec等数据不同,我的火腿肠数据来源于多台设备和多个品种,因此,它们表面的纹理与颜色差异以及不同设备间的成像质量差异要远大于标准数据集,使得检测变得更难了。因为我的图像数量有些多,单个类别有1000个样本,MVTec AD是200多个,这导致我的训练时间很长,约2个小时吧。我的数据集是包含了合格样本和异常样本的,但只包含图像标签,并没有标注异常区域的mask,因此我需要使用classification类别的task。接下来,按照docker文档的提示,
2024-08-07 17:09:52
1627
原创 Win11+docker+gpu+vscode+pytorch配置anomalib(2)
关于数据集:anomalib会自动下载数据集和模型,但MVTec数据集还是比较大的,我们也可以自己下载好数据,然后把它解压到anomalib/datasets/MVTec路径,这样就不需要在运行代码时下载了。其实在anomalib/notebooks中提供了jupyter示例代码,但我的vscode提示不能在远程容器中运行jupyter,只能够运行py文件,所以我就创建了一个测试代码。初次代码运行会报错,提示缺少一些lib,根据报错提示很容易就能搜索到缺失的软件,将这些软件安装好就可以正常运行了。
2024-08-06 10:27:27
813
1
原创 Win11+docker+gpu+vscode+pytorch配置
近期在研究异常检测相关算法,奈何各个经典算法的代码都是基于不同的pytorch版本的,而且好多代码还需要配置knn_cuda和pointnet2_ops_lib,这两个与cuda版本需要满足对应关系,因此通过conda虚拟环境已经无法满足需求了,不得已,只能来试试docker了。这里需要注意的是,我下载的docker镜像是pytorch1.12.1的官方镜像,已经发布2年多了,比较老。3. 作为经典算法的集合,anomalib是我最需要的,因此,我决定从配置anomalib开始。2. 需要使用GPU。
2024-08-05 13:45:13
844
原创 HALCON使用RealSense获取深度图
问题情况:在图像采集助手中,无法识别到Realsense设备,直接运行RealSense相关的例程时,会报错hAcqRealsense.dll出错。解决办法:首先需要安装RealSenseSDK,并且在安装路径中找到RealSense2.dll,把它复制到halcon的目录bin/x64-win64中去,之后就能正常的打开了。Halcon在20.11版本之后已经支持了直接获取RealSense的深度图,但我在使用时遇到了一些问题,这里分享给大家,以免大家遇到同样问题。
2024-06-04 09:06:41
451
原创 Auto-Encoder理解
是一种无监督学习模型,可以理解为令最常见的3层的神经网络的“输入->中间层->输出”中的输出等于输入,而目的是得到训练后的中间层。中间层的节点数少于出入层与输出层,这样,如果输出层能够很好的拟合出输入,那么中间层就相当于实现了数据的降维。如果自编码器都是在正常品数据中训练得到的,那么它很可能对于异常数据无法进行拟合,即模型输出与输入存在很大的差异,这种方法可以用于进行异常检测。结合了自身的一些理解,更加具体的信息及代码请阅读该文章。本文主要来源于知乎文章。
2024-02-05 09:40:30
506
1
原创 BGAD文章复现笔记-1
论文Explicit Boundary Guided Semi-Push-Pull Contrastive Learning for Supervised Anomaly Detection的复现笔记
2024-01-29 15:38:46
735
1
原创 learn2learn环境配置(2023年12月)
learn2learn是元学习方向的一个非常实用的库,但其发布时间较早,与最新版本的pytorch可能存在一些兼容性问题,在2023年12月这个时间进行安装时会遇到一些问题,以下是我遇到的问题及解决的方法。3. 经过检查,torch在安装时自动安装了最新版本的torchvision,但torch与torchvision是有版本对应关系的,1.8.2的torch必须对应0.9.2的torchvision。最终经过测试,以下安装可以顺利运行示例。
2023-12-01 09:13:00
969
原创 元学习示例:maml_miniimagenet无法下载数据的解决办法
从上边的代码中可以发现,learn2learn一共提供了三种下载地址,但实际上我们国内所能访问的只有最后一种zenodo,至少在我的电脑上google drive和drop box都是无法连接的。而learn2learn下载部分的代码其实没有使用zemodo这个地址,只是使用了前两种,导致运行程序时不会自动的下载数据。在learn2learn库中,有一个示例:maml_miniimagenet.py。将下载好的文件放到home/data路径下,那么再次运行程序的时候就不需要下载了,就可以开心的进行训练了!
2023-11-30 15:37:12
629
原创 C#如何实现汇报后台线程进度
熟悉C#程序开发的朋友们都知道,当我们在UI线程里进行一些运行时间较长的操作时,程序会因为UI线程繁忙而陷入假死状态。此时,正确的做法是将这些复杂的任务放入到后台线程中去执行。 比如,下面的代码实现了将一个长时间运算后的结果显示到UI中的一个按钮的Text属性中去。 private async void button1_Click(object sender, EventArgs e) { int i= await GetV();...
2022-01-10 21:53:06
565
原创 使用异步函数实现后台线程更新UI
当我们的UI程序在运行一些长时间的运算时,或者需要进行一定时间的等待时,如果我们直接把运算或者等待的代码放在UI线程里执行,就会导致UI卡住,此时任何的操作都不会得到响应,用户的体验很不好。这时,我们往往都会选择把这些复杂的运算放到后台线程去处理。 但如果后台线程运行完毕,我们需要在UI线程获取运算结果,或者显示一个运行完毕的状态,就往往需要在后台线程中操作UI控件。一般来说,从其他非UI线程去操作控件的行为是不允许的,如果我们强制关闭掉线程检测虽然可以实现跨线程去操作UI...
2021-11-30 13:53:44
366
原创 C#使用SQLServer2016
最近在项目中需要用到SQLServer2016,在这里记录一下使用的方法,也希望能帮到同样在sqlserver入门阶段的朋友们。因为我之前一直在使用的都是SQLite,这里也对SQLServer和SQLite做一些对比。 1. 安装SQLServer2016 安装就按照这篇博客来进行就OK了。SQLServer安装时哪些功能是必需的(sql server 2016安装时选择哪些功能 必须安装的功能组件 必选的功能组件 轻便精简安装选项) - 亟待! - 博...
2021-11-19 14:00:48
752
原创 C#实现windows设备管理器的“卸载设备”和“扫描检测硬件改动”,解决Realsense无法连接的问题。
在我近期的一个项目中,我使用了C#调用Realsense去实现了一些三维的测量功能。但Realsense的连接稳定性好像有一些问题。我遇到了以下几种:1.设备会断连,软件中重新初始化一次设备对象就可以继续使用;2. 设备断联后重新初始化能够初始化成功,但无法采集到图像,此种情况我通过自动重启软件解决掉了3. 最麻烦的问题,有时候设备断联后无法再次连接了,不管是使用我自己的软件或者是RealsenseViewer,都无法再次连接到这台...
2021-11-11 11:43:03
3048
1
原创 C#实现ModbusTCP从站
很久以前,写过一篇C#做Modbus从站的博客C#工控机作为Modbus从站的方法_gaooolianggg的专栏-CSDN博客_c# modbus 从站,当时用的是NModbus,整体使用略微有些繁琐。最近在做项目时,使用了一个更方便的方法,这里分享出来。 这里使用的是EasyModbus。在Nuget程序管理中直接下载安装即可。如果你需要使用从站,只需要非常简单的几行代码ModbusServer modbusServer = new ModbusServer();...
2021-11-05 15:19:58
4031
5
原创 pycharm进入断点后自动退出
pycharm遇到进入断点后立刻自动停止运行程序,并报错:QObject::moveToThread: Current thread (0x55b7191fd7a0) is not the object's thread (0x55b71d8eeb60). Cannot move to target thread (0x55b7191fd7a0)这时,降低下opencv的版本就可以了pip install opencv-python==4.1.2.30...
2021-09-30 23:27:54
720
原创 使用PaddleDetection时预测类型错误的解决办法
使用PaddleDetection时,有时会出现预测结果的类别ID正确,但是类别string错误的情况。这是因为在配置文件中的datasets部分中,testDatasets的Dir没有写成绝对路径的原因。
2021-09-27 15:40:30
314
1
原创 使用C#部署PaddleX的图像分类任务报错
按照PaddleX/examples/C#_deploy at develop · PaddlePaddle/PaddleX · GitHub中的步骤,使用CMake去生成VS的sln。 打开sln,此时需要选择release模式,因为我在实际使用中发现Debug模式会编译报错,找不到yamlcpp-mt.lib,虽然这时,我们在链接器设置中将其修改为yamlcpp-mtd.lib即可通过编译,但生成的dll在调用时会报错。这里我也没找到解决的办法。 其他的就按照文档操作即可。...
2021-09-10 15:25:07
377
原创 修改onnx的输入,使其支持批量预测
在上一篇文章中C#使用onnxruntime进行预测,我展示了如何使用C#去读取一个resnet50的onnx模型,并且进行图像分类的预测。但我们把这个模型应用到实际项目中时,可能还存在这样一个问题:有时我们需要把多个图像同时送入模型,但此时该模型只能输出第一个图像的结果,而对其他的图像视而不见。这是因为该模型的输入batch是1,每次只能进行一张图像的识别。这里,我们就需要修改模型的输入,使其能够满足多个图像同时识别的需求。 修改输入的代码如下,resnet50-v2-7...
2021-07-21 10:53:14
5272
3
原创 C#使用OnnxRuntime进行Resnet50分类(支持GPU)
在深度学习部署环节中,基于C#的部署资料很少。本文展示了如何使用C#来部署一个基于Resnet50的图像分类任务。 本文的代码来自OnnxRuntime自带的示例。这里我已经把代码和深度学习模型文件整理好了,可以直接下载:代码及深度学习模型onnx文件下载连接 首先,我们需要配置GPU运行环境(如果使用CPU可以省略这一步骤): 1. 安装Nvidia显卡驱动、CUDA、cudnn。并且CUDA和Cudnn的版本最好满足对应关系,否则...
2021-07-19 15:40:19
5541
原创 openCV如何绘制最小外接矩形的方向
在openCV中,使用最小外接矩形来定位目标是一个很常用的功能。有时,我们需要把矩形的中心和方向展示出来,这时,可以使用cv2.arrowedLine()来实现这一目标。具体实现方法如下: 首先,我们需要使用cv2.minAreaRect来获取最小外接矩形的参数,例如rect = cv2.minAreaRect(contours[max_index]) 获取到的rect结果为((中心点坐标),(宽度,高度),角度)。得到的结果中的宽度和高度并不是按照...
2021-07-13 20:59:17
1499
原创 open3d绘制箭头
在使用open3d的过程中,我需要将提取到的目标用箭头表示出来。箭头的起始点代表目标的位置,箭头的方向代表目标表面的法向量。但open3d中并没有直接可以调用的api。 在open3d的示例中,可以找到通过mesh生成坐标轴的代码,所以,我们对这个代码稍加修改,对坐标轴的mesh进行平移、旋转、缩放,就可以得到任意位置的箭头了。这里的代码是我在网络上搜索到的,但原始代码存在一些bug,箭头的尺度有一些问题,修复了问题的代码如下:import numpy as npi...
2021-07-11 20:30:27
2065
2
原创 RealSense在C#调用中,深度图与坐标的关系
因为项目需要用C#的界面采集图像,之后实时根据深度学习进行处理。而在深度学习这部分中用的是Python语言,所以在两者集成的过程中遇到了一些问题
2021-06-28 16:13:55
884
2
Microsoft.ML.OnnxRuntime.ResNet50v2Sample.7z
2021-07-19
NModbus-develop-test.rar
2020-02-10
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人