美文网首页Julia语言小白大数据,机器学习,人工智能机器学习与数据挖掘
Julia 小白 Day 15 :本地实现基于深度学习的图片内容

Julia 小白 Day 15 :本地实现基于深度学习的图片内容

作者: _KevinZhang_ | 来源:发表于2018-09-03 08:17 被阅读31次

前情提要:

之前给大家介绍过《几行代码识别图片内容》,这个内容是基于在线的juliabox.com的。

这期给大家的内容是在本地的机器上实现图片内容识别。

先来个实现效果图:


首先,介绍一下本期的主角:Mocha,是Julia上的一个实现:摩卡(咖啡)

https://github.com/pluskid/Mocha.jl

(国外的人都喜欢把相关的名字起一起,只要之前没有人在这个领域使用过这个名字即可。)

这个程序包是做什么的?

我们来看看里面的一个案例,也就是今天要复刻到本地实现的基于深度学习的图片内容识别。

http://nbviewer.jupyter.org/github/pluskid/Mocha.jl/blob/master/examples/ijulia/ilsvrc12/imagenet-classifier.ipynb

大概意思是用一个预先训练好的CNN模型(这个模型之前在Caffe上实现,现在明白主角为什么叫摩卡了吧)来移植到Julia上实现。

(之前已经说过Julia有吸星大法,Python、R的很多程序包可以拿来用)

直接说实现步骤,(在 Mac上实现)

  • 安装好 JuliaPro。(参考之前课程)

  • 安装好Ananconda。(参考之前课程)

  • 安装好Graphviz

    • brew install Graphviz

在Anaconda上打开Jupyter Notebook


然后你会看到和之前在线环境(juliabox.com)一样的界面(实际上已经在本地上实现了Jupyter):

选择新建Julia 0.6.4,这个是刚才安装了JuliaPro的版本。(Julia 0.7.0是笔者之前自己安装的版本)

好了,参考这个

http://nbviewer.jupyter.org/github/pluskid/Mocha.jl/blob/master/examples/ijulia/ilsvrc12/imagenet-classifier.ipynb

上面写的,一步一步进行代码编写(复制、运行、排雷)。

过程中你会发现需要的模型和文件都没有,这里给出来地址:

梯子参考

这里附上笔者的本地实现代码:

Pkg.add("hdf5")

Pkg.build("hdf5")

Pkg.add("Mocha")

using Mocha

backend = CPUBackend()
init(backend)

img_width, img_height, img_channels = (256, 256, 3)
crop_size = (227, 227)
batch_size = 1  # 可以设置更大的数字,用于批量识别图片

layers = [
  MemoryDataLayer(name="data", tops=[:data], batch_size=batch_size,
      transformers=[(:data, DataTransformers.Scale(scale=255)),
                    (:data, DataTransformers.SubMean(mean_file="model/ilsvrc12_mean.hdf5"))],
      data = Array[zeros(img_width, img_height, img_channels, batch_size)])
  CropLayer(name="crop", tops=[:cropped], bottoms=[:data], crop_size=crop_size)
  ConvolutionLayer(name="conv1", tops=[:conv1], bottoms=[:cropped],
      kernel=(11,11), stride=(4,4), n_filter=96, neuron=Neurons.ReLU())
  PoolingLayer(name="pool1", tops=[:pool1], bottoms=[:conv1],
      kernel=(3,3), stride=(2,2), pooling=Pooling.Max())
  LRNLayer(name="norm1", tops=[:norm1], bottoms=[:pool1],
      kernel=5, scale=0.0001, power=0.75)
  ConvolutionLayer(name="conv2", tops=[:conv2], bottoms=[:norm1],
      kernel=(5,5), pad=(2,2), n_filter=256, n_group=2, neuron=Neurons.ReLU())
  PoolingLayer(name="pool2", tops=[:pool2], bottoms=[:conv2],
      kernel=(3,3), stride=(2,2), pooling=Pooling.Max())
  LRNLayer(name="norm2", tops=[:norm2], bottoms=[:pool2],
      kernel=5, scale=0.0001, power=0.75)
  ConvolutionLayer(name="conv3", tops=[:conv3], bottoms=[:norm2],
      kernel=(3,3), pad=(1,1), n_filter=384, neuron=Neurons.ReLU())
  ConvolutionLayer(name="conv4", tops=[:conv4], bottoms=[:conv3],
      kernel=(3,3), pad=(1,1), n_filter=384, n_group=2, neuron=Neurons.ReLU())
  ConvolutionLayer(name="conv5", tops=[:conv5], bottoms=[:conv4],
      kernel=(3,3), pad=(1,1), n_filter=256, n_group=2, neuron=Neurons.ReLU())
  PoolingLayer(name="pool5", tops=[:pool5], bottoms=[:conv5],
      kernel=(3,3), stride=(2,2), pooling=Pooling.Max())
  InnerProductLayer(name="fc6", tops=[:fc6], bottoms=[:pool5],
      output_dim=4096, neuron=Neurons.ReLU())
  InnerProductLayer(name="fc7", tops=[:fc7], bottoms=[:fc6],
      output_dim=4096, neuron=Neurons.ReLU())
  InnerProductLayer(name="fc8", tops=[:fc8], bottoms=[:fc7],
      output_dim=1000)
  SoftmaxLayer(name="prob", tops=[:prob], bottoms=[:fc8])
]

net = Net("imagenet", backend, layers)
println(net)

open("net.dot", "w") do out net2dot(out, net) end
run(pipeline(`dot -Tpng net.dot`, "net.png"))

using Images
using FileIO
load("net.png")

# 读取预先训练好的神经网络参数

using HDF5
h5open("model/bvlc_reference_caffenet.hdf5", "r") do h5
  load_network(h5, net)
end
init(net)

classes = open("synset_words.txt") do s map(x -> replace(strip(x), r"^n[0-9]+ ", ""), readlines(s)) end

#include(joinpath(Pkg.dir("Mocha"), "tools/image-classifier.jl"))
include("tools/image-classifier.jl")
classifier = ImageClassifier(net, :prob, channel_order=(3,2,1), classes=classes)
println("Classifier constructed")

# 读取图片
img = FileIO.load("images/cat256.jpg")

# 识别图片
prob, class = classify(classifier, img)
println(class)
# 虎斑猫

using Gadfly

n_plot = 5
n_best = sortperm(vec(prob), rev=true)[1:n_plot]
best_probs = prob[n_best]
best_labels = classes[n_best]

plot(x=1:length(best_probs), y=best_probs, color=best_labels, Geom.bar, Guide.ylabel("probability"))

img2 = FileIO.load("images/bird.jpg")

prob, class = classify(classifier, img2)
println(class)

需要注意的是代码里设置了图片的大小是 256 x 256,图片大小不符合的就会报错。

有需要的可以在代码里面改,或者把图片改成合适的尺寸即可。

识别速度还是挺快的。无图无真相:

KevinZhang
Sep 3, 2018

相关文章

网友评论

    本文标题:Julia 小白 Day 15 :本地实现基于深度学习的图片内容

    本文链接:https://www.haomeiwen.com/subject/twbvwftx.html