利用预先训练好的深度学习网络识别现实中的图片
参考文献: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"
我们发现,待分类的是一对鹦鹉,经过预先训练好的深度学习模型判断,依然还是鹦鹉!!!
浙公网安备 33010602011771号