使用Python Matplotlib绘制用于CNN训练图片的方法及实践

图片识别是属于分类问题,例如工业设备运行工况,包括正常、供液不足等等数据分析图,用计算机模拟人学习分析图像,首先需要收集待学习的图片,并对图片进行分类管理,对于这些分类需要在计算机文件系统上分别建立目录,把对应分类的图片存储到相应的目录下,由于有些Python工具对中文支持的不好,建议最好直接使用数字建立目录,便于操作并省去麻烦。

 

对于训练学习的图片,考虑计算资源及响应速度等要求,要求图片尽可量的小,使用有限的像素表述清楚特征供计算机学习就足够了。

 

目前,图像识别主要是自然景物,例如人脸、动物、物体等方向等识别,而对于决策分析等方向的图表分析,几乎是空白,通过研究、实践总结出一点小经验,分享一起讨论。

 

工业大数据、人工智能中,有决策分析等方向等需求,例如学习人类看曲线图、饼图、直方图、帕特图等等。这类图像有个共同的特点,有坐标系!

 

坐标系是非常重要的参照特征,下面通过实验来进行验证。

 

1. 创建目录

 

目录样式如下:

示例代码如下:

 

def mkdir(path):
    # 去除首位空格
    path=path.strip()
    # 去除尾部 \ 符号
    path=path.rstrip("\\") 
    # 判断路径是否存在,存在——True;不存在——False
    isExists=os.path.exists(path) 
    # 判断结果
    if not isExists:
        # 如果不存在则创建目录,创建目录操作函数
        os.makedirs(path)  
        return True
    else:
        # 如果目录存在则不创建,并提示目录已存在
        return False

 

2. 从数据库中提取绘图数据

 

略。

 

3. 绘制图形并保存为图片

 

3.1. 创建画板

 

每画一幅图片时,需要先创建新的空白画板,并定义好图片尺寸,语法自己网上百度去,这里先给出简单的样例。

 

plt.figure(figsize(1.92, 1.2)) # 设置 figsize 192*120

 

3.2. 设置画板

 

首先,定义最大坐标视窗。例如 plt.axis([0,4,0,50]),二维的坐标系;

 

其次,增加图片中网格,方便分析曲线,语句是plt.grid()。

 

3.3. 画图

 

plt.plot(x,y,color="Blue")
plt.plot(upx,upy,color="Red")
plt.plot(downx,downy,color="Red")

 

3.4. 保存图片

 

使用pythonplt.savefig()保存图片到指定目录中。

 

为了提高CNN的性能,最直接的是减小图片尺寸,需要把图片四周空白去掉,并保留坐标系(可以不要刻度值)。

对比效果,最后采用temp2的方案——去白边留刻度。示例代码如下:

3.5. 关闭画板

 

保存图片到磁盘中,应关闭画板(如果是少量图片,无所谓了,但是,大量图片的情况下,如果不关闭画板,则很快耗尽资源而崩溃),使用方法:plt.close()。

 

最后,分享关键代码片段如下:

 

while row < c:
    tmp_data = data_X[row]
    ......
    #1.创建画板
    plt.figure(figsize(1.92, 1.2)) # 设置 figsize 192*120
    #plt.rcParams['savefig.dpi'] = 300 #图片像素
    #plt.rcParams['figure.dpi'] = 300 #分辨率
    # 默认的像素:[6.0,4.0],分辨率为100,图片尺寸为 600&400
    
    plt.axis(ax)
    plt.grid()
        
    plt.plot(x,y,color="Blue")
    plt.plot(upx,upy,color="Red")
    plt.plot(downx,downy,color="Red")
    
    # 去掉图片四周的空白,减少图片像数
    #plt.gca().xaxis.set_major_locator(plt.NullLocator()) 
    #plt.gca().yaxis.set_major_locator(plt.NullLocator()) 
    plt.subplots_adjust(top=1,bottom=0.05,left=0.05,right=1,hspace=0,wspace=0) 
    #plt.subplots_adjust(top=1,bottom=0,left=0,right=1,hspace=0,wspace=0) 
    plt.margins(0,0)
        
    #plt.show()
    mkdir(str(data_Y[row]))
    plt.savefig(str(data_Y[row]) + "\\" + str(row)+".jpg")
    #紧凑图像,会改变图像尺寸,在此不适用
    #plt.savefig(str(data_Y[row]) + "\\" + str(row)+".jpg",bbox_inches='tight')
    plt.close() # 关闭画板
    row = row + 1

 

通过CNN两层神经网络分析、测试,总结如下:

 

1、图像在坐标系位置准确,坐标轴、网格(grid)对预测结果没有(显着)影响;

 

2、图像尺寸由192×120缩减到160×100,对预测结果没有(显着)影响。

 

欢迎读者反馈指导,一起研究。

 

参考:

 

《使用Python Matplotlib绘图并输出图像到文件中的实践》 CSDN博客 肖永威 2018.04

发表评论

电子邮件地址不会被公开。 必填项已用*标注