缺陷检测——机器学习

  • 写在前面
  • 1. create_ocr_class_mlp
    • 1.1 ocr识别就只能识别ocr吗?
    • 1.2 简单的图形分类
  • 2. create_class_mlp
    • 2.1 将区域作为训练对象
    • 2.2 基本流程和算子
  • 2.3 看一个案例

写在前面

这篇文章只是讲解了一些非常简单的halcon里机器学习的案例,所以只能初步给大家呈现一下机器学习的基本步骤。不要试图用很短的时间或者很少的精力就能学好机器学习,这是一个漫长的过程,希望我们能一起努力。

halcon提供了3套机器学习的算子,它们都可以用来检测缺陷,接下来就一次介绍它们

1. create_ocr_class_mlp

1.1 ocr识别就只能识别ocr吗?

  • halcon在ocr识别中提供了一套算子,支持我们自己去训练模型,然后再拿训练好的模型来识别字符,我在前面的文章中写过,感兴趣的小伙伴可以去查看:
    https://editor.csdn.net/md/?articleId=115208338
  • 那么问题来了,识别ocr的算子真的就只能识别ocr吗?当然不是了,它也可以用来做一些其他的一些简单的分类检测。其实不难理解,ocr识别时,我们训练模型,也是训练这个字符的一些特征,再手动的将这些特征和一些标签联系起来,下一次找到特征,就输出特征对应的标签。那么工件也有特征,把工件的特征放到训练模型中,再打上工件的标签,我们不就可以拿这个模型做工件的分类了吗?
  • 下面我们就看一个例子吧:

1.2 简单的图形分类

halcon案例:classify_metal_parts_ocr.hdev

dev_update_off ()* 案例: classify_metal_parts_ocr.hdev
* 混料检测 (多层神经感知) ocr的一套算子  分类* 创建分类器:特征的选择/样本量/特征向量预处理类型
create_ocr_class_mlp (110, 110, 'constant', 'moments_central',\['circle','hexagon','polygon'], \10, 'normalization', 10, 42, OCRHandle)
* 获得分类器使用的特征
get_params_ocr_class_mlp (OCRHandle, WidthCharacter, HeightCharacter, Interpolation, \Features, Characters, NumHidden, Preprocessing, NumComponents)* 产生trf文件(样本文件)
FileNames := ['./nuts_01','./nuts_02','./nuts_03',\'./washers_01','./washers_02','./washers_03',\'./retainers_01','./retainers_02','./retainers_03']
ClassNames := ['hexagon','hexagon','hexagon','circle','circle','circle','polygon','polygon','polygon']file_exists ('./train_ocr.trf', FileExists)
if(FileExists)delete_file ('./train_ocr.trf')
endiffor Index := 0 to |FileNames|-1 by 1read_image (Image, FileNames[Index])* 这个函数能够获得特征的具体值* get_features_ocr_class_mlp (Image, OCRHandle, 'true', Features1)threshold (Image, Region, 6, 114)fill_up (Region, RegionFillUp)connection (RegionFillUp, ConnectedRegions)count_obj (ConnectedRegions, Number)for I := 0 to Number-1 by 1select_obj (ConnectedRegions, ObjectSelected, I+1)append_ocr_trainf (ObjectSelected, Image, \ClassNames[Index], './train_ocr.trf')endfordev_display (Image)
endfor* 3. 训练
trainf_ocr_class_mlp (OCRHandle, './train_ocr', 200, 1, 0.01, Error, ErrorLog)file_exists ('./train_ocr.omc', FileExists)
if(FileExists)delete_file ('./train_ocr.omc')
endifwrite_ocr_class_mlp (OCRHandle, './train_ocr.omc')
read_ocr_class_mlp ('./train_ocr.omc', OCRHandle1)
* 4. 识别
Text:=''
dev_get_window (WindowHandle)
set_display_font (WindowHandle, 20, 'mono', 'true', 'false')
for J := 1 to 4 by 1read_image (Image, 'rings/mixed_' + J$'02d')threshold (Image, Regions, 0, 159)fill_up (Regions, RegionFillUp1)connection (RegionFillUp1, ConnectedRegions1)count_obj (ConnectedRegions1, Number1)dev_display (Image)for Index1 := 1 to Number1 by 1select_obj (ConnectedRegions1, ObjectSelected1, Index1)do_ocr_single_class_mlp (ObjectSelected1, Image, OCRHandle1, 1, Class, Confidence)area_center (ObjectSelected1, Area, Row, Column)if(Class == 'hexagon')dev_set_color ('red')elseif (Class == 'circle')dev_set_color ('blue')elseif (Class == 'polygon')dev_set_color ('green')endifdev_display (ObjectSelected1)endforstop()
endfordev_update_on ()

2. create_class_mlp

2.1 将区域作为训练对象

  • halcon为我们提供的第二套算子是以区域作为神经感知模型的训练对象的。以区域作为训练对象,最终返回的结果自然也是区域,我们当然可以获得这些区域的特征,比如面积中心点坐标等等。
  • 这个返回结果有时候是非常有用的,比如需要抓取的时候,直接将区域的中心坐标转成世界坐标,发送给机器人就可以了。(这里涉及到了手眼标定)

2.2 基本流程和算子

  1. 准备区域:
    首先要准备好你想要训练的区域,区域个数至少是两个,一个是前景(目标物),一个是背景。如果你的背景明暗变化比较大,可以使用多个区域联合成一个区域,(联合后的区域还是看成一个区域),或者增加区域的个数,比如训练3个、4个区域;
  2. 创建mlp模型
    create_class_mlp( : : NumInput, NumHidden, NumOutput, OutputFunction, Preprocessing, NumComponents, RandSeed : MLPHandle)

    • **NumInput:**图像通道数
    • **NumHidden:**中间隐藏神经元的个数
    • **NumOutput:**输出特征数量,你准备了几个训练区域,就输出几个区域就行了
    • **OutputFunction:**激活函数
    • **Preprocessing:**预处理类型,一般选择归一化
    • **NumComponents:**变换后的特征数量(对于Preprocessing ='none’和Preprocessing ='normalization’忽略)
    • **RandSeed:**随机种子
    • **MLPHandle:**模型句柄
  3. 添加特征到模型中
    add_samples_image_class_mlp(Image, ClassRegions : : MLPHandle : )

    • **ClassRegions:**特征(区域)
  4. 训练模型
    train_class_mlp( : : MLPHandle, MaxIterations, WeightTolerance, ErrorTolerance : Error, ErrorLog)

    • **MaxIterations:**迭代次数
    • **WeightTolerance:**优化算法的两次迭代之间MLP权重差异的阈值
    • **ErrorTolerance:**优化算法的两次迭代之间的训练数据上MLP的平均误差之差的阈值
    • Error: MLP在训练数据上的平均误差。
  5. 分类
    classify_image_class_mlp(Image : ClassRegions : MLPHandle, RejectionThreshold : )

2.3 看一个案例

如下图:想知道工件的个数,你要如何做呢?

这里我们采用了多层神经感知的方法:下面就是halcon的实现代码:

* 这个案例是使用mlp(多层神经感知)计数read_image (Image, './6.jpg')//1 前景
gen_rectangle1 (ROI_0, 890.924, 277.009, 933.712, 325.132)
gen_rectangle1 (TMP_Region, 1141.95, 812.778, 1176.18, 889.775)
union2 (ROI_0, TMP_Region, ROI_0)
gen_rectangle1 (TMP_Region, 762.559, 1172.1, 808.2, 1207.39)
union2 (ROI_0, TMP_Region, Block)//2 背景
gen_rectangle1 (ROI_0, 101.628, 225.616, 249.813, 785.902)
gen_rectangle1 (TMP_Region, 750.439, 17.5092, 1467.34, 113.558)
union2 (ROI_0, TMP_Region, ROI_0)
gen_rectangle1 (TMP_Region, 2144.18, 969.996, 2252.32, 1402.22)
union2 (ROI_0, TMP_Region, Background)//3 缝隙(我发现缝隙会影响最终的结果,导致两个物料连结到一起,无法通过腐蚀将它们分开)
//  所以我将缝隙也放入了训练模型当中进行了训练
gen_rectangle1 (ROI_2, 1519.43, 1704.42, 1564.84, 1713.5)
gen_rectangle2 (ROI_3, 958.303, 1261.95, rad(-128.176), 8.97139, 2.00968)
gen_rectangle2 (TMP_Region, 1299.65, 1488.25, rad(45.4293), 15.5433, 2.85932)
union2 (ROI_3, TMP_Region, ROI_3)concat_obj (Block, Background, ObjectsConcat)
concat_obj (ObjectsConcat, ROI_2, ObjectsConcat)
concat_obj (ObjectsConcat, ROI_3, ObjectsConcat)* 创建mlp模型
create_class_mlp (3, 10, 4, 'softmax', 'normalization', 10, 42, MLPHandle)//第一个参数是图像通道数
* 添加特征到模型中(这里添加的是4个区域对象)
add_samples_image_class_mlp (Image, ObjectsConcat, MLPHandle)
* 训练模型
train_class_mlp (MLPHandle, 200, 1, 0.01, Error, ErrorLog)
* 分类
classify_image_class_mlp (Image, ClassRegions, MLPHandle, 0.5)* 进一步处理得到目标数量
select_obj (ClassRegions, ObjectSelected, 1)//选择前景(目标物)
erosion_circle (ObjectSelected, RegionErosion, 8.5)//腐蚀
connection (RegionErosion, ConnectedRegions)//分割
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 1088.84, 10000)//筛选
count_obj (SelectedRegions, Number)//计数* 显示
dev_display (Image)
dev_display (SelectedRegions)
dev_get_window (WindowHandle)
set_display_font (WindowHandle, 26, 'mono', 'true', 'false')
disp_message (WindowHandle, Number, 'image', 12, 12, 'black', 'true')

这篇文章就先讲到这里,其他的方法和案例,我们下次再说吧。
对我介绍的内容感兴趣的小伙伴可以关注我,我会持续发布相关的文章。如果觉得我写的还不错的,就帮我点个赞吧!

Halcon缺陷检测——机器学习1相关推荐

  1. Halcon缺陷检测系列

    Halcon缺陷检测系列Halcon缺陷检测系列Halcon缺陷检测系列 一 注塑吸嘴缺口检测 二 铣刀刀口破损缺陷检测 三 网状产品表面破损检测 四 手机摄像头图像表面的轻微缺陷检测 五 皮革纹理表 ...

  2. Halcon 缺陷检测 金属拉丝表面缺陷检测(乘法增强、傅里叶变换与卷积、纹理过滤、动态阈值)

    Halcon 缺陷检测 拉丝表面缺陷检测(乘法增强.傅里叶变换与卷积.纹理过滤.动态阈值) 文件下载 链接:https://pan.baidu.com/s/1HNl4vy0jEaFx5OUuBDAMX ...

  3. halcon——缺陷检测常用方法总结(模板匹配(定位)+差分)

    引言 机器视觉中缺陷检测分为一下几种: blob分析+特征 模板匹配(定位)+差分 光度立体:halcon--缺陷检测常用方法总结(光度立体) - 唯有自己强大 - 博客园 (cnblogs.com) ...

  4. Halcon缺陷检测——测量拟合

    缺陷检测--测量拟合 1. 简单聊一聊测量的那些事 2. 做几个测量判断缺陷的项目 案例1. 测量液体线高度 案例2. 检测矩形通孔的缺陷 下载地址: 1. 简单聊一聊测量的那些事 测量为什么也能做缺 ...

  5. Halcon缺陷检测——差分

    缺陷检测--差分+定位 1. 简单的差分 案例1:检测毛刺 案例2:电路板线路缺陷检测 案例3:瓶口破损缺陷检测 2. 模板匹配定位+差分 案例1:印刷质量缺陷检测(standard) 案例2:检测工 ...

  6. Halcon 缺陷检测概述

    缺陷检测概述 1. 什么缺陷检测 2. 缺陷检测的方法总结 1. 什么缺陷检测 你认为不好的全是缺陷(划痕.脏污.缺损.正反.凹陷.凸起等) 缺陷检测项目之所以难度大,就是因为它的不确定性,灵活性,所 ...

  7. halcon缺陷检测——频域

    缺陷检测--频域和空间域 1. 理解傅里叶变换 2. 读懂频谱图 3. 使用频域处理图像的案例 3.1 脏污检测 3.2 检测表面微小凸起 3.3 检测磨砂表面的缺陷 4. 资源下载 1. 理解傅里叶 ...

  8. 基于halcon—缺陷检测常用方法与示例总结

    摘要 缺陷检测是视觉需求中难度最大一类需求,主要是其稳定性和精度的保证.首先常见缺陷:凹凸.污点瑕疵.划痕.裂缝.探伤等. 缺陷检测算法不同于尺寸.二维码.OCR等算法.后者应用场景比较单一,基本都是 ...

  9. halcon缺陷检测学习3暗斑检测detect_mura_defects_texture

    这个例子展示了如何检测高纹理图像中的色差不均匀缺陷 实现高纹理图像中缺陷的检测(黑色). 缺陷的特征是暗斑.因此,通过从原始图像中减去估计的背景光照,缺陷变得更加明显 dev_close_window ...

最新文章

  1. was unable to refresh its cache! status = Cannot execute request on any known server
  2. OSGI企业应用开发(二)Eclipse中搭建Felix运行环境
  3. resnet50网络结构_AAAI2020 | 利用网络结构关系加速NAS+Layer
  4. android 跑分,2018年10月国内Android手机安兔兔跑分性能排行榜
  5. 【Flink】FLink Barrier 在流经算子 做 checkpoint 的时候,数据是停止的吗?
  6. vue使用element案列
  7. 追忆我的2008-养成做笔记的习惯
  8. 文库下载软件 冰点文库下载器 软件 百度网盘链接地址
  9. nginx 配置https 负载均衡
  10. 手机邮箱怎么弄_如何设置Android手机邮箱的详细教程
  11. 阿里巴巴20周年直击,马云:阿里巴巴从来没有害怕过什么!
  12. 元宵大师的Python股票量化分析工具QTYX-版本更新说明
  13. 云桌面真的可以完全代替PC电脑吗?
  14. 微信小程序,大佬救我!!!
  15. 【STM32】在Keil上使用C++编程
  16. Linux ubuntu gtest googletest download compile apply TEST TEST_F TEST_P
  17. mysql dml语句 先读取在更新_事务的4个特性——ACID(原子性、一致性、隔离性和持久性)、更新丢失问题...
  18. 利用FFMPEG实现音频视频升降调
  19. WPF Visifire图表控件使用基础
  20. 2022-11-28-大数据可视化“可视化国产/进口电影票房榜单”分析,特征维度大于50

热门文章

  1. 使用Safari浏览器自带工具,查看页面中 css 样式的引用~
  2. 很久很久之前的一道面试题(老师的生日是那一天?)~
  3. 【Oracle】修改参数的同时添加注释
  4. jmeter解决不同线程组之间传递参数问题
  5. 双层感知机解决异或问题
  6. VS2008下编译C++程序,找不到 stdint.h,原因及解决方案
  7. 全网最详细的HBase启动以后,HMaster进程启动了,几秒钟以后自动关闭问题的解决办法(图文详解)
  8. 浏览器同源策略及跨域的解决方法
  9. Javascript .map文件-JavaScript源地图
  10. 为什么在Android上的某些设备上使用相机意图捕获的图像会被旋转?