检测分割是视觉检测长期的课题,在工业检测需求中,分割一般采用阈值的方式进行分割。为了设置稳定的阈值参数,现场调试会非常复杂。为了解决这个问题,工业采用机器学习进行对象分割。基础思路是采用分类的方式对标注的区域进行学习,检测过程对整幅图片的像素进行标识。获取分割区域,检测有效区域。
下面例子是采用MLP对颜色区域进行分割。目前学习方式进行分割的方法有很多,机器学习的分割方式,是不采用预训练的方式进行分割。主要针对特定场景和一致性好的场景区域进行分割,训练和预测都可以在普通CPU完成。
*读取第一种检测图片
read_image (Image, 'color/citrus_fruits_01')
*获取图片基础属性
get_image_pointer1 (Image, Pointer, Type, Width, Height)
*创建MLP模型
create_class_mlp (3, 3, 3, 'softmax', 'normalization', 10, 42, MLPHandle)
*设置第一种检测对象以的区域
gen_rectangle1 (OrangeRegion, 100, 130, 230, 200)
*设置检测的背景区域
gen_rectangle1 (BackgroundRegion, 30, 20, 50, 50)
*设置一个空的区域对象,主要是预留区域ID给其他一种检测对象
****************************************下面过程是添加一个检测数据组的方式***************
gen_empty_region (EmptyRegion)
*设置一个训练的容器对象
gen_empty_obj (TrainingRegions1)
*添加第一种检测对象区域到容器
concat_obj (TrainingRegions1, OrangeRegion, TrainingRegions1)
*添加第二种检测对象区域到容器
concat_obj (TrainingRegions1, EmptyRegion, TrainingRegions1)
*添加背景对象第三种检测对象到容器
concat_obj (TrainingRegions1, BackgroundRegion, TrainingRegions1)
*添加容器和图片到分类的指针对象里面
add_samples_image_class_mlp (Image, TrainingRegions1, MLPHandle)
**************************************************************************************
*读取第二种检测对象图片
read_image (Image, 'color/citrus_fruits_03')
*设置第二种检测对象区域
gen_rectangle1 (LemonRegion, 180, 130, 230, 240)
*设置检测的背景区域
gen_rectangle1 (BackgroundRegion, 400, 20, 430, 50)
****************************************下面过程是添加一个检测数据组的方式***************
*设置一个训练的容器对象
gen_empty_obj (TrainingRegions2)
*添加第一种检测对象区域到容器
concat_obj (TrainingRegions2, EmptyRegion, TrainingRegions2)
*添加第二种检测对象区域到容器
concat_obj (TrainingRegions2, LemonRegion, TrainingRegions2)
*添加背景对象第三种检测对象到容器
concat_obj (TrainingRegions2, BackgroundRegion, TrainingRegions2)
*添加容器和图片到分类的指针对象里面
add_samples_image_class_mlp (Image, TrainingRegions2, MLPHandle)
**************************************************************************************
*添加完数据进行训练
train_class_mlp (MLPHandle, 200, 1, 0.01, Error, ErrorLog)
**********************数据进行测试***************************************
I:=5
*读取图片
read_image (Image, 'color/citrus_fruits_' + I$'.2d')
*对图片数据进行预测,0.5代表执信度阈值
classify_image_class_mlp (Image, ClassRegions, MLPHandle, 0.5)
*获取结果,第一种检测对象的区域
select_obj (ClassRegions, ClassOranges, 1)
*获取结果,第二种检测对象的区域
select_obj (ClassRegions, ClassLemons, 2)
*获取结果,第三种检测对象的区域
select_obj (ClassRegions, ClassBackground, 3)
核心模块基本的思路是。准备好检测对象的图片,使用标注的方式获取要检测对象的区域,并提前要知道分类和检测的数量。作为创建模型create_class_mlp的输出目标值,图片的通道数作为输出值。
添加数据类型的时候,是根据gen_empty_obj,创建对象里面,添加顺序做的类型标识,如果图片上面没有要添加的类型区域,可以设置一个空区域进去。
获取分割结果的时候,也是通过select_obj,根据区域的ID获取不同对象的结果,ID对应的是添加的顺序,顺序从1开始。