全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 数据分析与数据挖掘
837 0
2020-09-28
使用卷积神经网络进行图像识别
该博客探讨了使用卷积(“深度学习”)神经网络的典型图像识别任务。为此,我们将使用D.Persson提供的简单JavaCNN程序包,并使用Python脚本语言使我们的示例简洁明了。也可以用Java,Groovy,JRuby或Java虚拟机支持的任何脚本语言重写此示例。
本示例将使用灰度格式(PGM)的图像。名称“ PGM”是从“便携式灰度图”派生而来的首字母缩略词,其中单元格值介于0到255之间。文件通常为二进制格式(其神奇的值为“ P5”-您可以通过打开以下选项之一来查看它这样的文件),但您可以将它们转换为“普通”(或未压缩的PGM),
我们的输入图像来自公共数据库(CBCL人脸数据库MIT生物学和计算学习中心)。让我们使用此(略微修改)数据库复制一个zip文件并解压缩。为此,请安装最新的DataMelt程序,制作一个文件“ example.py”,然后使用DataMelt运行以下命令:
从jhplot导入*
打印Web.get(“ http://jwork.org/dmelt/examples/data/mitcbcl_pgm_set2.zip”)
打印IO.unzip(“ mitcbcl_pgm_set2.zip”)
最后一个命令解压缩两个目录“ train”和“ test”。您可以省略“打印”,仅用于打印这些命令的状态。每个目录中都有带有人脸的图像(“ face_ *”)和一些其他图像(“ cmu_ *”。请注意,文件名中的“ _”很重要,因为这有助于识别图像类型。“ train”目录中包含约1500个文件,带有人脸图像和13700文件以及其他类型的图像,让我们看一看图像并研究其属性,我们将使用IJ Java程序包,将以下代码添加到前几行:
从ij import *
imp = IJ.openImage(“ mitcbcl_pgm_set2 / train / face_00001.pgm”)
打印“ Width:”,imp.width,“ Hight:”,imp.height
imp.show()#在框架中显示此图像
ip = imp.getProcessor()。convertToFloat()
pixel = ip.getPixels()#获取像素数组
打印像素#打印像素数组
这些命令在屏幕上显示图像,打印其尺寸(19x19像素),以及带有PGM图像值的3D矩阵。现在让我们创建一个将执行以下操作的代码:
从“ train /”目录中读取图像
从“ test /”目录中读取图像
使用几个卷积层和池化层初始化CNN
它运行超过50次迭代。您可以根据所需的图像识别精度来增加或减少此数字。
在每次迭代期间,它都会计算“ test /”目录中带有面孔的正确识别图像的概率,并将CNN保存到文件中
训练结束时,它将从文件中读取训练后的CNN,并在测试图像上执行最终运行,并打印预测。
复制这些行并将其保存在文件“ example.py”中。然后在DataMelt中运行以下代码:
从jhplot导入*
打印Web.get(“ http://jwork.org/dmelt/examples/data/mitcbcl_pgm_set2.zip”)
打印IO.unzip(“ mitcbcl_pgm_set2.zip”)
NMax = 50#总运行次数。减少此数字可
从org.ea.javacnn.data导入DataBlock,OutputDefinition,TrainResult
从org.ea.javacnn.layers导入DropoutLayer,FullyConnectedLayer,InputLayer,LocalResponseNormalizationLayer
从org.ea.javacnn.layers导入ConvolutionLayer,RectifiedLinearUnitsLayer,
来自org.ea.javacnn.losslayers的PoolingLayer 从org.ea.javacnn.readers导入SoftMaxLayer
从org.ea.javacnn.trainers导入ImageReader,MnistReader,PGMReader,Reader
从org.ea.javacnn导入AdaGradTrainer,Trainer
导入JavaCNN
从java.util导入ArrayList,
从java.lang导入的数组系统
图层= ArrayList(); de = OutputDefinition()
打印“运行总数=”,NMax
打印“正在读取火车样本。”
mr = PGMReader(“ mitcbcl_pgm_set2 / train /”)
打印“培训图像的总数=“,mr.size(), “类型的Nr =”,mr.numOfClasses()
打印“读取测试样本..”
mrTest = PGMReader(“ mitcbcl_pgm_set2 / test /”)
打印“测试图像的总数=”,mrTest.size(),“ types =“,mrTest.numOfClasses()
modelName =” model.ser“#将NN保存到此文件   
layers.add(InputLayer(de,mr.getSizeX(),mr.getSizeY(),1))
layers.add(ConvolutionLayer (de,5,
layer.add(RectifiedLinearUnitsLayer())#应用非饱和激活函数
layer.add(PoolingLayer(de,2
layer.add(ConvolutionLayer(de,5,64, 1,2))
layers.add(RectifiedLinearUnitsLayer())
layers.add(PoolingLayer(de,
2
layers.add(LocalResponseNormalizationLayer())
layers.add (DropoutLayer(de))
layers.add(FullyConnectedLayer(de,mr.numOfClasses()))
layers.add(SoftMaxLayer(de))
打印“ Training ..”
net = JavaCNN(layers)
trainer = AdaGradTrainer(net,20, 0.001)
从jarray导入零
numberDistribution,correctPredictions =零(10,“ i”),零(10,“ i”)
开始= System.currentTimeMillis()
db = DataBlock(mr.getSizeX(),mr.getSizeY(),1,0)
for j在范围(NMax)中:对于范围(ir)
  中的i,
  损耗= 0

    db.addImageData(mr.readNextImage(),mr.getMaxvalue())
    tr = trainer.train(db,mr.readNextLabel() )
    损失=损失+ tr.getLoss()
    如果(i!= 0并且i%500 == 0):
       打印“ Nr of images:”,i,“ Loss:”
  print“损失:“,”(运行损失= / float(mr.size())),“ =” j
  mr.reset()
  打印'Wait ..计算标签的预测=',mr.getLabels()
  Arrays.fill(正确的预测0)
  适用于范围(mrTest.size())中i的
  Arrays.fill(numberDistribution,0):
            db.addImageData(mrTest.readNextImage(),mr.getMaxvalue())
            net.forward(db,False)
            正确= mrTest.readNextLabel( )
            预测= net.getPrediction()
            if(正确==预测):correctPredictions [正确] + = 1 numberDistribution [正确]
            + = 1
  mrTest.reset()
  打印“->测试时间:”,int(0.001 *(系统.currentTimeMillis()-start)),“ s”
  打印“->当前运行:”,j
  打印net.getPredictions(correctPredictions,numberDistribution,mrTest.size(),mrTest.numOfClasses())
  打印“->保存当前状态到“,modelName
  net.saveModel(MODELNAME)
打印“读取训练从网络”,MODELNAME “并作出最后的测试”
CNN = net.loadModel(MODELNAME)
Arrays.fill(correctPredictions,0)
Arrays.fill(numberDistribution,0)
对于i在范围(mrTest.size()):
            db.addImageData(mrTest.readNextImage(),mr.getMaxvalue())
            net.forward(db,False)
            正确= mrTest.readNextLabel()
            预测= net.getPrediction()
            if(正确==预测):correctPredictions [正确] + = 1个
            numberDistribution [正确] + = 1个
打印“最终测试:”
打印net.getPredictions(correctPredictions,numberDistribution,mrTest.size(),mrTest.numOfClasses())
50次迭代通常需要几个小时。识别带有人脸图像的最终可能性将接近85%。考虑到此任务的复杂性,这是相当不错的性能。
1
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群