Julia 小白 Day 15 :本地實(shí)現(xiàn)基于深度學(xué)習(xí)的圖片內(nèi)容識(shí)別

前情提要:

之前給大家介紹過(guò)《幾行代碼識(shí)別圖片內(nèi)容》车胡,這個(gè)內(nèi)容是基于在線的juliabox.com的。

這期給大家的內(nèi)容是在本地的機(jī)器上實(shí)現(xiàn)圖片內(nèi)容識(shí)別照瘾。

先來(lái)個(gè)實(shí)現(xiàn)效果圖:


首先匈棘,介紹一下本期的主角:Mocha,是Julia上的一個(gè)實(shí)現(xiàn):摩卡(咖啡)

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

(國(guó)外的人都喜歡把相關(guān)的名字起一起析命,只要之前沒(méi)有人在這個(gè)領(lǐng)域使用過(guò)這個(gè)名字即可羹饰。)

這個(gè)程序包是做什么的?

我們來(lái)看看里面的一個(gè)案例碳却,也就是今天要復(fù)刻到本地實(shí)現(xiàn)的基于深度學(xué)習(xí)的圖片內(nèi)容識(shí)別队秩。

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

大概意思是用一個(gè)預(yù)先訓(xùn)練好的CNN模型(這個(gè)模型之前在Caffe上實(shí)現(xiàn),現(xiàn)在明白主角為什么叫摩卡了吧)來(lái)移植到Julia上實(shí)現(xiàn)昼浦。

(之前已經(jīng)說(shuō)過(guò)Julia有吸星大法馍资,Python、R的很多程序包可以拿來(lái)用)

直接說(shuō)實(shí)現(xiàn)步驟关噪,(在 Mac上實(shí)現(xiàn))

  • 安裝好 JuliaPro鸟蟹。(參考之前課程)

  • 安裝好Ananconda。(參考之前課程)

  • 安裝好Graphviz

    • brew install Graphviz

在Anaconda上打開(kāi)Jupyter Notebook


然后你會(huì)看到和之前在線環(huán)境(juliabox.com)一樣的界面(實(shí)際上已經(jīng)在本地上實(shí)現(xiàn)了Jupyter):

選擇新建Julia 0.6.4使兔,這個(gè)是剛才安裝了JuliaPro的版本建钥。(Julia 0.7.0是筆者之前自己安裝的版本)

好了,參考這個(gè)

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

上面寫(xiě)的虐沥,一步一步進(jìn)行代碼編寫(xiě)(復(fù)制熊经、運(yùn)行泽艘、排雷)。

過(guò)程中你會(huì)發(fā)現(xiàn)需要的模型和文件都沒(méi)有镐依,這里給出來(lái)地址:

梯子參考

這里附上筆者的本地實(shí)現(xiàn)代碼:

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  # 可以設(shè)置更大的數(shù)字,用于批量識(shí)別圖片

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")

# 讀取預(yù)先訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)參數(shù)

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")

# 識(shí)別圖片
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)

需要注意的是代碼里設(shè)置了圖片的大小是 256 x 256槐壳,圖片大小不符合的就會(huì)報(bào)錯(cuò)然低。

有需要的可以在代碼里面改,或者把圖片改成合適的尺寸即可务唐。

識(shí)別速度還是挺快的雳攘。無(wú)圖無(wú)真相:

KevinZhang
Sep 3, 2018

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市枫笛,隨后出現(xiàn)的幾起案子来农,更是在濱河造成了極大的恐慌,老刑警劉巖崇堰,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異涩咖,居然都是意外死亡海诲,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)檩互,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)特幔,“玉大人,你說(shuō)我怎么就攤上這事闸昨◎撬梗” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵饵较,是天一觀的道長(zhǎng)拍嵌。 經(jīng)常有香客問(wèn)我,道長(zhǎng)循诉,這世上最難降的妖魔是什么横辆? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮茄猫,結(jié)果婚禮上狈蚤,老公的妹妹穿的比我還像新娘。我一直安慰自己划纽,他們只是感情好脆侮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著勇劣,像睡著了一般靖避。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,198評(píng)論 1 299
  • 那天筋蓖,我揣著相機(jī)與錄音卸耘,去河邊找鬼。 笑死粘咖,一個(gè)胖子當(dāng)著我的面吹牛蚣抗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瓮下,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼翰铡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了讽坏?” 一聲冷哼從身側(cè)響起锭魔,我...
    開(kāi)封第一講書(shū)人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎路呜,沒(méi)想到半個(gè)月后迷捧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胀葱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年漠秋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抵屿。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡庆锦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出轧葛,到底是詐尸還是另有隱情搂抒,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布尿扯,位于F島的核電站求晶,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏衷笋。R本人自食惡果不足惜誉帅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望右莱。 院中可真熱鬧蚜锨,春花似錦、人聲如沸慢蜓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)晨抡。三九已至氛悬,卻和暖如春则剃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背如捅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工棍现, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人镜遣。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓己肮,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親悲关。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谎僻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 原文 機(jī)器學(xué)習(xí)(Machine Learning, ML)是一門(mén)多領(lǐng)域交叉學(xué)科,涉及概率論寓辱、統(tǒng)計(jì)學(xué)艘绍、逼近論、凸分析...
    readilen閱讀 3,894評(píng)論 0 41
  • 給初學(xué)者的 Jupyter Notebook 教程 Jupyter Notebook 是一個(gè)非常強(qiáng)大的工具秫筏,常用于...
    Jancd閱讀 26,049評(píng)論 2 30
  • 1诱鞠、通過(guò)CocoaPods安裝項(xiàng)目名稱(chēng)項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明先生_X自主閱讀 15,979評(píng)論 3 119
  • 冬日的暖陽(yáng)像一張網(wǎng)罩著瘦削的河流裸露的河床上龜裂的河灘皺紋般支離破碎它深深的裂紋里仍然藏著河流的愿景而永不停下的河...
    失業(yè)獵手閱讀 304評(píng)論 1 4
  • 作為一個(gè)在家失業(yè)的無(wú)業(yè)游民一枚。我沒(méi)有任何的不適或者不知所措这敬。因?yàn)樵谖肄o職的那一刻航夺,我就已經(jīng)想好了今天會(huì)發(fā)生什么,...
    曾曾的麻麻閱讀 161評(píng)論 0 0