其实对于神经网络当前的应用场景而言,识别手写数字已经不足为奇。早些时候,Google公开了一个云API,让用户能够检测一幅图像里面的内容。本节提供一个例子,让读者能够自制一个图像识别的在线应用。
【例9.4】搭建一个Shiny应用,实现物体识别。
(1)加载依赖的包和数据
install.packages("shiny",repos="https://cran.rstudio.com")
install.packages("imager",repos="https://cran.rstudio.com")
现在已经配置好了mxnet、shiny和imager三个R包,下一步则是让Shiny直接下载并运行准备好的代码。
shiny::runGitHub("thirdwing/mxnet_shiny")
第一次运行这个命令会花上几分钟时间下载预先训练好的模型。训练的模型叫Inception-BatchNorm Network,如果读者对它感兴趣,可以阅读相关文献。准备就绪之后,浏览器中会出现一个网页应用,就能用本地或在线图片来测试。
(2)导入预训练过的模型文件
>model<-mx.model.load("Inception/Inception_BN",iteration=39)
>synsets<-readLines("Inception/synset.txt")
>mean.img<-as.array(mx.nd.load("Inception/mean_224.nd")[["mean_img"]])
(3)图像预处理
使用一个自定义函数对图像进行预处理,这个步骤对于神经网络模型而言至关重要。
preproc.image<-function(im,mean.image){
#crop the image
shape<-dim(im)
short.edge<-min(shape[1:2])
yy<-floor((shape[1]-short.edge)/2)+1
yend<-yy+short.edge-1
xx<-floor((shape[2]-short.edge)/2)+1(www.xing528.com)
xend<-xx+short.edge-1
croped<-im[yy:yend,xx:xend,,]
#resize to 224 x 224,needed by input of the model.
resized<-resize(croped,224,224)
#convert to array(x,y,channel)
arr<-as.array(resized)
dim(arr)=c(224,224,3)
#substract the mean
normed<-arr-mean.img
#Reshape to format needed bymxnet(width,height,channel,num)
dim(normed)<-c(224,224,3,1)
return(normed)
}
(4)模型部署
读入图像,预处理与预测代码如下:
im<-load.image(src)
normed<-preproc.image(im,mean.img)
prob<-predict(model,X=normed)
max.idx<-order(prob[,1],decreasing=TRUE)[1:5]
result<-synsets[max.idx]
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。