利用预先训练好的深度学习网络识别现实中的图片

参考文献:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

文献地址:https://arxiv.org/pdf/1502.03167.pdf

数据下载地址:http://data.mxnet.io/mxnet/data/Inception.zip

#加载所需的包

#下载后,假设我们把数据是放在D盘下,那么工作路径就设置为

>setwd("D:\\Inception\\Inception")

> require(mxnet)

> require(imager)

#接下来读入模型,注意到解压后的文件夹里面有Inception_BN-0039.params,Inception_BN-symbol.json,mean_224.nd,synset.txt这四个文件

> model = mx.model.load("Inception_BN", iteration=39)

#然后载入图像均值,后面的图像预处理过程会用到

> mean.img = as.array(mx.nd.load("mean_224.nd")[["mean_img"]])

#读入待分类的图片,其实是一对鹦鹉

> im <- load.image(system.file("extdata/parrots.png", package="imager"))

#我们可以用R里面的plot命令画出来被读入的图片

> plot(im)

#定义预处理函数

> preproc.image <- function(im, mean.image) {
+ #得到图片的基本信息
+ shape <- dim(im)

   #得到图片的最小边缘像素数量
+ short.edge <- min(shape[1:2])

   #得到图片高度与最小边缘差距的一半,作为裁剪的依据
+ xx <- floor((shape[1] - short.edge) / 2)

   #得到图片长度与最小边缘差距的一半,作为裁剪的依据
+ yy <- floor((shape[2] - short.edge) / 2)

   #进行裁剪,裁剪为xx或者yy的最大值,即裁剪后的图片的长和高都是原图最小边的像素数量
+ cropped <- crop.borders(im, xx, yy)

+ #把裁剪后的图片变成一个 224 x 224,这是因为模型输入的规格决定的
+ resized <- resize(cropped, 224, 224)

+ #转化为数组array (x, y, channel)
+ arr <- as.array(resized) * 255

   #改变数组的结构
+ dim(arr) <- c(224, 224, 3)

+ #提取平均值
+ normed <- arr - mean.img

+ #进行变形,变成mxnet模型需要的输入结构形式,即mxnet (width, height, channel, num)
+ dim(normed) <- c(224, 224, 3, 1)

   #返回结果
+ return(normed)
+ }

#调用自定义的函数

> normed <- preproc.image(im, mean.img)

#估算相似概率

> prob <- predict(model, X=normed)

#打印相似度结果
> dim(prob)
[1] 1000 1

#找到相似度最大的物品位置
> max.idx <- max.col(t(prob))

#载入备选物品名称库
> synsets <- readLines("synset.txt")

#打印相似度最大的物品
> print(paste0("Predicted Top-class: ", synsets [[max.idx]]))
[1] "Predicted Top-class: n01818515 macaw"

 

我们发现,待分类的是一对鹦鹉,经过预先训练好的深度学习模型判断,依然还是鹦鹉!!!

 

posted on 2017-05-03 16:06  大师坐镇  阅读(440)  评论(0)    收藏  举报

导航