设置首页收藏本站在线聊天
授权版本:2024_09
开启左侧

大恒深度学习

 关闭 [复制链接]
wenluderen 发表于 2020-5-26 08:13:44 | 显示全部楼层 |阅读模式
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| wenluderen 发表于 2020-5-26 08:23:31 | 显示全部楼层
第一节课主题是分类识别,是李东平老师讲解的
***
分类识别是目标检测 和分割的基础,
源代码地址:
https://1drv.ms/u/s!ArUD58OpStZ5hrYkr6cEFxVkwFb9wA

2.jpg

使用深度学习步骤分3步:
1.图像分类:在images目录下按类名建文件夹,分别放入对应的图像文件;测试图像放test目录下;推荐png或bmp格式,不建议使用jpg格式;
2.运行2_train.hdev读入标注数据,训练得到网络;
3.运行3_infer.hdev使用训练好的网络推断新的图像;


奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| wenluderen 发表于 2020-5-26 08:37:49 | 显示全部楼层
代码拆解:Model := 'pretrained_dl_classifier_compact.hdl'
*Model := 'pretrained_dl_classifier_enhanced.hdl'
*Model := 'pretrained_dl_classifier_resnet50.hdl'
*Model := 'model_best.hdl'

MVT合计预训练了三个神经网络,依次是:pretrained_dl_classifier_compact   ,pretrained_dl_classifier_enhanced,pretrained_dl_classifier_resnet50
这三个神经网络能此依次增强,但是运算时间也依次增加
李东平老师的这个范例调用的  pretrained_dl_classifier_compact 这个预训练神经网络

*******
 一般dev_update_off放在开始,dev_update_on放在程序结束。
dev_update_window:定义 程序执行打开和关闭期间,图像对象是否在图形窗口中显示;
在单步模式下,该规则无效,单个算子调用以后,对象总是显示在图形窗口上;
在测量一系列算子的运行时间的时候,应该设置为OFF,以减少HDevelop中GUI更新的运行时间的影响


dev_close_window ()关闭当前窗口
NumEpochs := 100 定义一个变量,并且赋值100, 这个变量是后期作为一个参数,用于设定整个样本库的训练次数。
LearningRate := 0.001*1 定义一个变量,并且赋值0.001 .这个变量是后期作为一个参数, 用于设定学习效率, 学习效率的初始值一般都是0.001
LearningRateStepEveryNthEpoch := 5 定义一个变量,并且赋值5 ,这个变量是后期作为一个参数, 用于每间隔多少次epoch, 学习效率变化一次


奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| wenluderen 发表于 2020-5-26 09:04:32 | 显示全部楼层
tuple_pow 计算两个元组的幂函数

tuple_pow(10, (-2.0 * LearningRateStepEveryNthEpoch / NumEpochs), LearningRateStepRatio)

tuple_pow — Calculate the power function of two tuples.


-2.0 * LearningRateStepEveryNthEpoch / NumEpochs======-2.0 * 5/ 100===-0.1

====>tuple_pow(10, -0.1 LearningRateStepRatio)===> 10的 -0.1的幂  ===》10的0.1的幂,然后取倒数。

LearningRateStepRatio最终算出的值是:0.794328

tuple_pow computes the power function of the input tuples T1^{T2}.

If both tuples have the same length the power function is applied to the corresponding elements of both tuples.
如果两个元组的长度相同,则将幂函数应用于两个元组的相应元素。

Otherwise, either T1 or T2 must have length 1. In this case, the power function is performed for each element of the longer tuple with the single element of the other tuple.
The result is always a floating point number. The power function of strings is not allowed.
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| wenluderen 发表于 2020-5-26 09:09:41 | 显示全部楼层
list_files('images', 'directories', Directories)

tuple_regexp_replace(Directories, 'images', 'data', PreDirectories)

tuple_insert(PreDirectories,0,'data',PreDirectories)

file_exists ('data', FileExists)

if (FileExists)
    remove_dir_recursively('data')
endif
for I := 0 to |PreDirectories| - 1 by 1
    make_dir (PreDirectories[I])
endfor
*****
一些文件夹的处理,这个halocn里面使用的相对路径。


奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| wenluderen 发表于 2020-5-26 09:16:42 | 显示全部楼层
read_dl_classifier (Model, DLModelHandle)
这个函数是MVT自己的函数,就是读取预训练神经网络
Model := 'pretrained_dl_classifier_compact.hdl'

read_dl_classifier — Read a deep-learning-based classifier from a file.


**
list_image_files ('images', 'default', ['recursive','follow_links'], ImageFiles)
read_image (Image, ImageFiles[0])
下面的代码是读取原始图像的大小, 然后做了一个缩放。 缩放的原则之前有提到,就是特征还是清晰的
get_image_size(Image, Width, Height)
Scale := 4
Width  := Width / Scale
Height := Height / Scale



****
count_channels(Image, Channels)
Count channels of image.统计图像里面的通道数目, 返回值是3

奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| wenluderen 发表于 2020-5-26 09:41:02 | 显示全部楼层
本帖最后由 wenluderen 于 2020-5-26 09:42 编辑

调整预训练神经网络里面的参数, 首先调整的是通道数目。
set_dl_classifier_param (DLModelHandle, 'image_num_channels', Channels)


这行被注释掉了,他的原计划应该是调整 图像的宽  高  还有通道数
*set_dl_classifier_param (DLModelHandle, 'image_dimensions', [Width, Height, Channels])

这样没有注释掉, 或去神经网络里面的参数,image_dimensions  。dimensions是尺寸的意思。
get_dl_classifier_param (DLModelHandle, 'image_dimensions', ImageDimensions)
2020-05-26_094043.jpg
ImageDimensions 这个参数后续没有用到,


奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| wenluderen 发表于 2020-5-26 10:09:40 | 显示全部楼层
for I := 0 to |ImageFiles| - 1 by 1
    read_image (Image, ImageFiles[I])‘读取图像
    preprocess (Image, ImagePreprocessed, DLModelHandle)//
    tuple_regexp_replace(ImageFiles[I], 'images', 'data', Name) //tuple 替换。 主要是需改name 这个变量里面的数据,为了下行代码准备,保存图
    write_image (ImagePreprocessed, 'tiff', 0, Name)//图像保存,奇怪 的是,此处保存的图像,NG部分被标注了,
endfor

2020-05-26_100526.jpg
*************
|ImageFiles|  返回个数
preprocess,  Call the standard procedure with no generic parameters.,调用没有通用参数的标准过程。
preprocess_dl_classifier_images这个函数里面调用了 Preprocess images for deep-learning-based classification training and inference. 这个是MVT自己的写的,是可以打开进去看的函数,里面的东西非常多。相当的复杂,说不清楚啊。。。。{:1_306:}
后面再说吧



奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| wenluderen 发表于 2020-5-26 10:35:10 | 显示全部楼层
preprocess_dl_classifier_images
****
MVT的官方解释是: Preprocess images for deep-learning-based classification training and inference.
预处理图像以进行基于深度学习的分类训练和推理。
就是说,将原始样本(此处是OK  和NG两个文件夹里面的图),做了一个预处理,这个预处理是为了后面的训练做准备的

**
PS:不要把图像的预处理 和  神经网络的预训练 混在一起。  神经网路的预训练是MVT的研发人员做的,和我们没有关系, 我们仅仅是把他们预训练得到的神经网络拿过来用而已
**
preprocess_dl_classifier_images is obsolete and is only provided for reasons of backward compatibility.
New applications should use the general CNN-based procedure preprocess_dl_dataset.


preprocess_dl_classifier_images已过时啦,仅出于向后兼容的原因提供。
新应用程序应使用基于CNN的常规过程preprocess_dl_dataset。

**
我靠这是看玩笑吗,我都没有开始学习preprocess_dl_classifier_images ,这个函数,MVT就告诉我说他已经过时了,晕死。
估计preprocess_dl_classifier_images这个是函数是之前的HALCON版本里面的东西,在19.11里面 或是后续的版本里面 MVT不推荐使用
不过现在还是要稍稍学习一下下,
在MVT帮助文档里面说,用preprocess_dl_dataset代替preprocess_dl_classifier_images。 不过帮助文档里面没有找到preprocess_dl_dataset。
诡异啊。看来还是要把 preprocess_dl_classifier_images搞的清楚一些。


***
This procedure preprocesses the provided images given by Images so that they can be handled by train_dl_classifier_batch and apply_dl_classifier_batch.
Note that depending on the data set, additional preprocessing steps might be beneficial.
The preprocessed images are returned in ImagePreprocessed. The network's image requirements are provided by the DLClassifierHandle.
此过程将预处理由图像提供的图像,以便可以使用train_dl_classifier_batch和apply_dl_classifier_batch处理它们。
请注意,根据数据集,其他预处理步骤可能会有所帮助。
预处理后的图像以ImagePreprocessed返回。 网络的图像要求由DLClassifierHandle提供。
***
The deep-learning-based classifier has certain requirements on the images.
In this procedure, the width, height, number of channels, and image type of each image is adapted accordingly.
To do so, the following types are accepted for the input images: 'real', 'byte', and in case of 'contrast_normalization' equals 'true' also integer-formats.
基于深度学习的分类器对图像有一定的要求。
在此过程中,将相应调整每个图像的宽度,高度,通道数和图像类型。
为此,可接受以下类型的输入图像:“实数”,“字节”,并且在“ contrast_normalization”等于“ true”的情况下,也是整数格式。
**
It is required that all images passed to train_dl_classifier_batch and apply_dl_classifier_batch are provided as returned by this procedure.
For the training, for example, you can do this step at the beginning of your program for all images, or alternatively for each batch that is trained separately.
要求提供传递给train_dl_classifier_batch和apply_dl_classifier_batch的所有图像,并按此过程返回的方式提供。
例如,对于训练而言,您可以在程序开始时针对所有图像执行此步骤,或者对单独训练的每个批次执行此步骤。

The following values for GenParamName are available:
下面得这些变量是需要的, 是一些参数。

* 'domain_handling': By default, it is set to 'full_domain'. Thus, reduced domains of images are ignored and the complete image is preprocessed. You can set it to 'crop_domain' to use the domains that were specified before with, for example, reduce_domain, to crop the images.
*'domain_handling':默认情况下,它设置为'full_domain'。 因此,将忽略图像的缩小域,并对整个图像进行预处理。 您可以将其设置为“ crop_domain”,以使用之前指定的域(例如reduce_domain)来裁剪图像。
说白了就是将图像里面哪些区域,作为要预处理的区域,一般都是全局的, 当然了,也可以缩小,这样可以提高预处理的效率


* 'contrast_normalization': Depending on the images, it can be beneficial for the deep classification to apply a contrast normalization. If 'contrast_normalization' is set to 'true', the gray values of every image are scaled to the maximum value range. The default is 'false'.
*'contrast_normalization':根据图像,对深度分类应用对比度归一化可能会有所帮助。
如果将“ contrast_normalization”设置为“ true”,则将每个图像的灰度值缩放到最大值范围。 默认值为“ false”。
字面意思明白了,不过深层次意义不明白


It is recommended to check the output images of this procedure to verify that they are suitable for a successful training of a classifier. For example, if after zooming defects on the images are no longer discernible, you have to choose a better image segment, where the defects are more prominent in the image.

建议检查此过程的输出图像,以确认它们适合成功训练分类器。
例如,如果在缩放后无法再识别图像上的缺陷,则必须选择一个更好的图像段,其中缺陷在图像中更加突出。

222222222.jpg
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| wenluderen 发表于 2020-5-26 10:44:31 | 显示全部楼层
下面粗略看下 preprocess_dl_classifier_images里面是什么
***
* Set defaults.
ContrastNormalization := 'false'
DomainHandling := 'full_domain'
* Set generic parameters.设定参数
for GenParamIndex := 0 to |GenParamName| - 1 by 1
    if (GenParamName[GenParamIndex] == 'contrast_normalization')
        * Set 'contrast_normalization'
        ContrastNormalization := GenParamValue[GenParamIndex]
    elseif (GenParamName[GenParamIndex] == 'domain_handling')
        * Set 'domain_handling'
        DomainHandling := GenParamValue[GenParamIndex]
    else
        throw ('Unknown generic parameter: \'' + GenParamName[GenParamIndex] + '\'')
    endif
endfor


上面大意应该是对输入的参数做一个检查。判断参数是:contrast_normalization 或domain_handling  如果不是就抛出异常。
Contrast Normalization 是对比度归一化的意思。
domain_handling 是域处理的意思。
***
在这个范例中
PreprocessingGenParamName := []
PreprocessingGenParamValue := []
所以应该不会执行这个代码,
所以
ContrastNormalization := 'false'
DomainHandling := 'full_domain'
**

奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表