风机桨叶故障诊断(四)
正负样本准备——从图像中随机扣图
在之前的工作中,我们已经训练了一个400×25×2的三层BP神经网络,通过这个基础的神经网络进行了误差分析,对我们的问题有了更深刻的认识。现在我们要开始不断完善我们的预测算法。
在一个机器学习系统中,样本选取的好坏至关重要。不是有这么个著名论断嘛,“It's not who has the best algorithm that wins.It's who has the most data.”所以我们完善算法的第一步,就是完善我们的样本。在项目的最初我们就获取了可以用来提取所需样本的图像库,筛选掉不合适的图像后大概有2000张。我们的下一步,就是从这里面选取我们的样本(上一篇文章中我是手动截取的少量样本,这具有主观性,且样本数量也不够)。
所以现在我们要从图像库中重新筛选样本,为了让所选的正、负样本能够具有代表性,尽量包含所有可能出现的情况,我们应该在图像中在随机位置,截取出随机大小的图。经过对于实际问题的分析,我选取扣图的随机大小范围限定在250-400之间,位置随机选定,只要所截取的整幅图像不超越原图的边界即可。然后选定在每幅图像中随机截取出20张图作为待处理的样本。
在所选的文件夹中对所有图像进行随机位置随机大小扣图的matlab实现如下:
function [ ] = BuildLotOfExample( ) %随机抓取生成大量样本 for i=1:25:5176 %读取图像 image_toRead_name=strcat('F:\风机桨叶故障诊断项目\视频2截图\',num2str(i)); image_toRead_name=strcat(image_toRead_name,'.jpg'); if exist(image_toRead_name,'file') %读取图像 OriImage=imread(image_toRead_name); grayImage=rgb2gray(OriImage); [rows,cols]=size(grayImage); %由原始图像,每幅图扣出20张随机大小,随机位置的图像,再进行筛选 %随机扣图的大小,边长250-400之间 sizeArray=round(rand(1,20)*150+250); for x=1:length(sizeArray) %得到本次抠图边长 length_of_size=sizeArray(x); rowIndex=round(rand()*(rows-length_of_size-1)+1); colIndex=round(rand()*(cols-length_of_size-1)+1); tempImage=grayImage(rowIndex:rowIndex+length_of_size,colIndex:colIndex+length_of_size); %保存图像 image_toSave_name=strcat('F:\风机桨叶故障诊断项目\随机抽取样本\',num2str(i+1)); image_toSave_name=strcat(image_toSave_name,'_'); image_toSave_name=strcat(image_toSave_name,num2str(x)); image_toSave_name=strcat(image_toSave_name,'.jpg'); imwrite(tempImage,image_toSave_name); end end end end在运行完上面代码后的工作就是比较枯燥的了,在所有截取出的图像中认真筛选出正样本和负样本,并剔除出少量可能对算法产生较大干扰的图像。在漫长的工作之后,我们的正负样本集就得到了,最后我将它们进行归一化,变成了25×25的灰度图像。
今天筛选样本做了不少枯燥的体力活动,肩膀都疼了。不过好的样本选取是机器学习系统的基石,希望这些天的努力不会白费!