1. 程式人生 > >基於 TensorFlow 的影象識別(R實現)

基於 TensorFlow 的影象識別(R實現)

提到機器學習,深度學習這些,大家都會立馬想起Python。但R的實力也不容小覷。今天就用R來演示一個基於TensorFlow的影象識別的例子。如果你想執行這些程式碼,就必須先安裝配置好TensorFlow,我是在Linux系統上面執行的。如何配置TensorFlow儘量看看官方文件,雖然是英文的,但是最新的,也是最準確的。

廢話不說,直接來看程式碼,在程式碼中我也做了詳細的註釋,看起來應該不是很困難。

library(tensorflow) #載入TensorFlow包

library(magrittr) #資料處理包,可以使用管道函式

slim= tf$contrib$slim #slim是一個使構建,訓練,評估神經網路變得簡單的庫。

# slim提供了很多計算機視覺方面的著名模型(VGG, AlexNet等),我們不僅可以直接使用,甚至能以各種方式進行擴充套件。

tf$reset_default_graph() #在每次執行中清除當前圖形,以避免變數重複#Session會話 張量的具體值和操作,會話關閉時,張量的任何具體值都會丟失

images = tf$placeholder(tf$float32, shape(NULL, NULL, NULL, 3))# 建立佔位符

imgs_scaled = tf$image$resize_images(images, shape(224,224)) #設定圖片大小# slim$conv2d自帶卷積功能+激勵函式 

fc8 = slim$conv2d(imgs_scaled, 64, shape(3,3), scope='vgg_16/conv1/conv1_1') %>% 
  slim$conv2d(64, shape(3,3), scope='vgg_16/conv1/conv1_2')  %>%
  slim$max_pool2d( shape(2, 2), scope='vgg_16/pool1')  %>% #池化操作

  slim$conv2d(128, shape(3,3), scope='vgg_16/conv2/conv2_1')  %>%
  slim$conv2d(128, shape(3,3), scope='vgg_16/conv2/conv2_2')  %>%
  slim$max_pool2d( shape(2, 2), scope='vgg_16/pool2')  %>%

  slim$conv2d(256, shape(3,3), scope='vgg_16/conv3/conv3_1')  %>%
  slim$conv2d(256, shape(3,3), scope='vgg_16/conv3/conv3_2')  %>%
  slim$conv2d(256, shape(3,3), scope='vgg_16/conv3/conv3_3')  %>%
  slim$max_pool2d(shape(2, 2), scope='vgg_16/pool3')  %>%

  slim$conv2d(512, shape(3,3), scope='vgg_16/conv4/conv4_1')  %>%
  slim$conv2d(512, shape(3,3), scope='vgg_16/conv4/conv4_2')  %>%
  slim$conv2d(512, shape(3,3), scope='vgg_16/conv4/conv4_3')  %>%
  slim$max_pool2d(shape(2, 2), scope='vgg_16/pool4')  %>%

  slim$conv2d(512, shape(3,3), scope='vgg_16/conv5/conv5_1')  %>%
  slim$conv2d(512, shape(3,3), scope='vgg_16/conv5/conv5_2')  %>%
  slim$conv2d(512, shape(3,3), scope='vgg_16/conv5/conv5_3')  %>%
  slim$max_pool2d(shape(2, 2), scope='vgg_16/pool5')  %>%

  slim$conv2d(4096, shape(7, 7), padding='VALID', scope='vgg_16/fc6')  %>%
  slim$conv2d(4096, shape(1, 1), scope='vgg_16/fc7') %>% 

  # Setting the activation_fn=NULL does not work, so we get a ReLU
  slim$conv2d(1000, shape(1, 1), scope='vgg_16/fc8')  %>%
  tf$squeeze(shape(1, 2), name='vgg_16/fc8/squeezed')

tf$summary$FileWriter('/tmp/dumm/vgg16', tf$get_default_graph())$close() #儲存在/tmp/dumm/vgg16目錄下

restorer = tf$train$Saver() #建立一個Saver 來管理模型中的所有變數。

sess = tf$Session()
restorer$restore(sess, 'vgg_16.ckpt') #復原模型

library(jpeg)
img1<-readJPEG('caomei.jpg') #img1的值在0-1之間。

d=dim(img1)  #獲取img1的維度
imgs =array(255*img1,dim = c(1,d[1],d[2],d[3]))
#因為數值需要在0到225之間,所以需要乘225.形成一個四維陣列#我們可以通過與儲存在陣列imgs中的影象的張量來對影象做預測

fc8_vals=sess$run(fc8,dict(images=imgs))#將fc8的張量儲存在fc8_vals中。
fc8_vals[1:5]

probs=exp(fc8_vals)/sum(exp(fc8_vals))

#按概率從高排序,並取前五個。
idx=sort.int(fc8_vals,index.return = TRUE,decreasing = TRUE)$ix[1:5]

#讀取影象分類檔案
library(readr)
names = read_delim("imagenet_classes.txt", "\t", escape_double = FALSE, trim_ws = TRUE,col_names = FALSE)
library(grid) #圖片處理的一個包,主要控制輸出圖形的大的外觀和一些細節東西的排列

g = rasterGrob(img1, interpolate=TRUE)  #圖形進行柵格化

text = ""for (id in idx) {
  text = paste0(text, names[id,][[1]], " ", round(probs[id],5), "\n") 
}

#annotate 新增文字註釋
#annotation_custom 可以新增各種圖形元素到ggplot圖中

library(ggplot2)
ggplot(data.frame(d=1:3)) + annotation_custom(g) + 
  annotate('text',x=0.05,y=0.05,label=text, size=7, hjust = 0, vjust=0, color='blue') + xlim(0,1) + ylim(0,1)

主要程式碼轉自:

https://randomthoughtsonr.blogspot.com/2016/11/image-classification-in-r-using-trained.html

我在網上找的了一張草莓的圖片,使用該模型進行識別。


識別結果如下圖,不過結果還挺準的。是草莓的概率是0.99999。不過有的情況下識別結果還是不太準的,畢竟這個模型也是有限的。


再來一張二哈(英文名:Siberian husky,取自百度百科)的照片,我專門在百度百科上面找了一張二哈比較霸氣的照片。在百度百科上面找的主要原因就是保證這張照片就是二哈。


圖片來自百度百科 詞條“西伯利亞雪橇犬”

分析結果表明是二哈的可能性是0.592.基本上還是挺準的。


也許就有人說Siberian husky和husky,有什麼區別,百度百科上面他們好像就是一個。在維基百科查閱發現,Siberian husky是husky的一個品種,husky還包括了其他品種比如拉布拉多犬哈士奇,我相信一些愛狗人士可能會董。於是我在維基百科上面的husky詞條找到了下面這張照片。


圖片來源 維基百科 詞條“Husky”


結果顯示是husky的概率是0.46234.還是挺準的,畢竟這只是一張側臉照。把這兩張照片放在一塊,我覺得一般人都分不清楚。


補充:

由於TensorFlow發展比較快,如果看一些比較舊的資料,比如兩年前的資料,在用最新的TensorFlow時,輸入有的API就會報錯,我在這跟大家分享幾個API更新後的名字,希望在用的時候能幫到大家。

舊版本新版本
tf.multf.multiply
tf.subtf.subtract
tf.negtf.negative
tf.train.SummaryWritertf.summary.FileWriter

程式中用到的vgg16模型以及imagenet_classes.txt我已經通過百度網盤分享給大家了,在我的公眾號《跟著菜鳥一起學R語言》後臺回覆vgg16即可獲取下載連結。

注:

作者:王亨

公眾號:跟著菜鳥一起學R語言

相關推薦

基於 TensorFlow影象識別R實現

提到機器學習,深度學習這些,大家都會立馬想起Python。但R的實力也不容小覷。今天就用R來演示一個基於TensorFlow的影象識別的例子。如果你想執行這些程式碼,就必須先安裝配置好TensorFlow,我是在Linux系統上面執行的。如何配置TensorFlow儘量看看官

TensorFlow影象識別物體分類入門教程

本文主要介紹瞭如何使用TensorFlow環境執行一個最基本的影象分類器(Win10系統)。原始碼地址https://github.com/sourcedexter/tfClassifier/tree/master/image_classification (這個大神好像改名

實戰 | 基於深度學習模型VGG的影象識別附程式碼

def train():    data_dim = 3 * 32 * 32    class_dim = 10    image = paddle.layer.data(        name="image", type=paddle.data_type.dense_vector(data_dim))  

手把手的操作——用java呼叫科大訊飛的離線語音識別dll實現離線識別JNA實現

#用java呼叫科大訊飛的離線語音識別dll實現離線識別(JNA實現)(一) 本人接的任務,做離線語音識別,用的是科大訊飛的離線識別,java不支援離線了,所以下載了windows的離線包,用JNA進行呼叫。之前用的是jni,但是一直沒有測試通過,本人又不會C++,研究了一個星期終究

手把手的操作——用java呼叫科大訊飛的離線語音識別dll實現離線識別JNA實現

上一篇講到了最難的地方,引數的轉換,這裡單獨寫出來 ** 三、引數的轉換(難點) ** 注:本文是以訊飛提供的C語言例子作為模板改寫,語音來源於檔案 1、先分析提供的例子 本人使用的是VS2010 下載連結連結:https://pan.baidu.com/s/

經典數字影象處理matlab 實現

Multi-Scale EPLL Linearized Kernel Dictionary Learning Trainlets: Dictionary Learning in High Dim

簡單驗證碼的識別matlab實現

驗證碼採集地址:http://www.quanjing.com/createImg.aspx 識別思路:這個驗證碼比較規則,數字都是顯示在固定的區域,數字也無粘連,實現步驟如下 1.對影象進

CNN人臉識別python實現

本文主要講解將CNN應用於人臉識別的流程,程式基於Python+numpy+theano+PIL開發,採用類似LeNet5的CNN模型,應用於olivettifaces人臉資料庫,實現人臉識別的功能,模型的誤差降到了5%以下。本程式只是個人學習過程的一個toy impl

KNN演算法——實現手寫數字識別Sklearn實現

KNN專案實戰——手寫數字識別 1、資料集介紹 需要識別的數字已經使用圖形處理軟體,處理成具有相同的色彩和大小:寬高是32畫素x32畫素的黑白影象。儘管採用本文格式儲存影象不能有效地利用記憶體空間,但是為了方便理解,我們將圖片轉換為文字格式。 數字的文字格式如下:

Python使用tensorflow實現影象識別貓狗大戰-01

Python使用tensorflow實現影象識別(貓狗大戰)-01 import_data.py import tensorflow as tf import numpy as np import os #引入tensorflow、numpy、os 三個第三方模組 img_widt

Python使用tensorflow實現影象識別貓狗大戰-02

import tensorflow as tf def inference(images, batch_size, n_classes): # cov1, shape = [kernel size, kernel size, channels, ke

用101000張食物圖片實現影象識別資料的獲取與處理-python-tensorflow框架

    前段時間,日劇《輪到你了》大火,作為程式設計師的我,看到了另外一個程式設計師—二階堂,他的生活作息,以及飲食規律,讓我感同身受,最讓我感觸的是他做的AI聊天機器人,AI菜品分析機器人,AI罪犯分析。      這讓作為程式設計師的我突然萌生了一股攀比和一種激情,我也得做一個出來(小聲bb,都得嘗試下)

opencv3實現簡單的數字影象識別KNN

正在用opencv3做一個數字影象識別的小專案,要用到KNN,但是不熟悉它的介面,因此,借鑑了大佬的部落格,基本照搬了程式碼,程式碼如下: 大佬的連結如下:http://www.cnblogs.com/denny402/p/5033898.html // knnrecognizenum

從0到1:神經網路實現影象識別

”. . .  we may have knowledge of the past and cannot control it; we may control the future but have no knowledge of it.” — Claude Shannon 1959

從0到1:神經網路實現影象識別

紙上得來終覺淺,絕知此事要躬行。 “神經網路”是“機器學習”的利器之一,常用演算法在TensorFlow、MXNet計算框架上,有很好的支援。 為了更好的理解與使用這件利器,我們可以不借助計算框架,從零開始,一步步構建模型,實現學習演算法,並在一個影象識別資料集上,訓練這個模型,再驗證模型預

基於OpenCV3實現人臉識別原理篇---PCAPrincipal Component Analysis

實踐總結:   1首先了解做人臉識別的步驟   2各個演算法後面的原理   3原理背後的相關知識的瞭解   4人臉識別專案總遇到的問題                                                                  

基於Retinex的影象去霧演算法MATLAB實現

在【影象處理中的數學原理】專欄(該專欄中的文章已經結集出版,書名為《影象處理中的數學修煉》)之前的一些文章中,我們已經討論了諸多非常有用的影象增強演算法,例如直方圖均衡演算法以及更加強大的CLAHE。通常影象增強演算法或多或少都有一定的去霧效果,只是這個效果有強

基於畫素清晰度的影象融合演算法Python實現

# -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt import cv2 from math import log from PIL import Image import d

利用python、tensorflow、opencv實現人臉識別包會

一,前言 本人是機械專業在讀碩士,在完成暑假實踐的時候接觸到了人臉識別,對這一實現很感興趣,所以花了大概十天時間做出了自己的人臉識別。這篇文章應該是很詳細的了所以幫你實現人臉識別應該沒什麼問題。 先說本博文的最終要達到的效果:通過一系列操作,在攝像頭的視訊流中識別特定

影象處理例項--基於Hough變化的答題卡識別未完成

影象二值化 在答題卡自動識別實驗中,為了方便地進行目標答案的檢測和識別,我們需要對灰度影象進行二值化處理,而在這個過程中,閾值的選取是關鍵,直接影響到目標答案是否能被正確識別。 閾值選取方法 閾值選取方法可以分為區域性和全域性兩種。因為每個學生填塗答題