# #作者:韦访 #

1、概述

上一讲,我们使用了slim训练了自己的数据,主要用于分类任务。这一讲,我们还是继续学习slim库,用它来对图像进行识别和检测。

2、下载Inception_ResNet_v2模型

第十六讲中,我们有使用别人训练好的模型来训练我们自己的数据集,这里,我们也使用别人在ImageNet上训练好的模型来识别图片内容。打开以下网页,

https://github.com/tensorflow/models/tree/master/research/slim

图像识别的矫正算法 图像识别检测_图像识别的矫正算法

 

下载Inception-ResNet-v2模型。

3、导入模块

#encoding:utf-8
import tensorflow as tf

from matplotlib import pyplot as plt
from nets import inception
from preprocessing import inception_preprocessing
import numpy as np
from datasets import imagenet

4、获取Inception-ResNet-v2参数

#获取inception_resnet_v2默认图片尺寸,这里为299
image_size = inception.inception_resnet_v2.default_image_size
#获取imagenet所有分类的名字,这里有1000个分类
names = imagenet.create_readable_names_for_imagenet_labels()

想知道ImageNet具体有哪些分类,可以下载下面的文件,

https://raw.githubusercontent.com/tensorflow/models/master/research/inception/inception/data/imagenet_metadata.txt

 

5、图片预处理

slim = tf.contrib.slim

#待测试图片路径
sample_image = 'bus.png'

#打开原图
image = tf.image.decode_jpeg(tf.read_file(sample_image), channels=3)
#对原图进行裁剪、缩放、归一化等处理,将图片大小缩放至299×299
processed_image = inception_preprocessing.preprocess_image(image,
                                                           image_size,
                                                           image_size,
                                                           is_training=False)
#增加一个维度
processed_images = tf.expand_dims(processed_image, 0)

其中,tf.expand_dims的作用是增加一个维度。例如,

import tensorflow as tf
processed_image = [[1, 4], [5, 3]]

with tf.Session() as sess:
    print(sess.run(tf.expand_dims(processed_image, 0)))

运行结果,

[[[1 4]

  [5 3]]]

6、创建模型

#创建模型
arg_scope = inception.inception_resnet_v2_arg_scope()
with slim.arg_scope(arg_scope):
    logits, end_points = inception.inception_resnet_v2(processed_images, is_training=False)

7、加载模型

with tf.Session() as sess:
    # 这里是我们下载下来的模型的路径
    checkpoint_file = 'checkpoint/inception_resnet_v2_2016_08_30.ckpt'
    #加载已训练好的模型
    saver = tf.train.Saver()
    saver.restore(sess, checkpoint_file)

8、run

#通过softmax获取分类
probabilities = tf.nn.softmax(logits)

srcimage, predict_values, logit_values = sess.run([image, processed_images, probabilities])
print(np.max(logit_values))
print(np.argmax(logit_values), names[np.argmax(logit_values)])

9、显示原始图片和预处理后的图片

 

plt.figure()
p1 = plt.subplot(121)
p2 = plt.subplot(122)

# 显示原始图片
p1.imshow(srcimage)
p1.axis('off')
p1.set_title('source image')

# 显示预处理后的图片
p2.imshow(predict_values[0, :, :, :])
p2.axis('off')
p2.set_title('image')

plt.show()

10、运行结果

$ python demo4.py

0.67273223

(579, 'gown')

图像识别的矫正算法 图像识别检测_slim_02

 

识别出了莫老师的裙子。

 

再换一张图片试试,

$ python demo4.py 

0.79414374

(966, 'burrito')

图像识别的矫正算法 图像识别检测_图像识别的矫正算法_03

 

百度看一下这个'burrito'是什么?

图像识别的矫正算法 图像识别检测_tensorflow_04

图像识别的矫正算法 图像识别检测_slim_05

吐血哦,此处奔跑着一万只草泥马~~

那我就下一张'burrito'来试试!

$ python demo4.py

0.9288399

(966, 'burrito')

图像识别的矫正算法 图像识别检测_sed_06

 

服了!还真识别出来了,看来只能说吃货长得像吃的了~~难道是识别了手里的黄瓜?这个悬念留着下一节课再揭晓。

再试一张图片看看,

$ python demo4.py 

0.9551897

(780, 'school bus')

图像识别的矫正算法 图像识别检测_sed_07

 

 

 

这次识别的还是准确的。

 

11、完整代码

#encoding:utf-8
import tensorflow as tf
from matplotlib import pyplot as plt
from nets import inception
from preprocessing import inception_preprocessing
import numpy as np
from datasets import imagenet

#获取inception_resnet_v2默认图片尺寸,这里为299
image_size = inception.inception_resnet_v2.default_image_size
#获取imagenet所有分类的名字,这里有1000个分类
names = imagenet.create_readable_names_for_imagenet_labels()

slim = tf.contrib.slim

#待测试图片路径
sample_image = 'bus.png'

#打开原图
image = tf.image.decode_jpeg(tf.read_file(sample_image), channels=3)
#对原图进行裁剪、缩放、归一化等处理,将图片大小缩放至299×299
processed_image = inception_preprocessing.preprocess_image(image, image_size, image_size, is_training=False)
#增加一个维度
processed_images = tf.expand_dims(processed_image, 0)

#创建模型
arg_scope = inception.inception_resnet_v2_arg_scope()
with slim.arg_scope(arg_scope):
    logits, end_points = inception.inception_resnet_v2(processed_images, is_training=False)



with tf.Session() as sess:
    # 这里是我们下载下来的模型的路径
    checkpoint_file = 'checkpoint/inception_resnet_v2_2016_08_30.ckpt'
    #加载已训练好的模型
    saver = tf.train.Saver()
    saver.restore(sess, checkpoint_file)

    #通过softmax获取分类
    probabilities = tf.nn.softmax(logits)

    srcimage, predict_values, logit_values = sess.run([image, processed_images, probabilities])

    print(np.max(logit_values))
    print(np.argmax(logit_values), names[np.argmax(logit_values)])


    plt.figure()
    p1 = plt.subplot(121)
    p2 = plt.subplot(122)

    # 显示原始图片
    p1.imshow(srcimage)
    p1.axis('off')
    p1.set_title('source image')

    # 显示预处理后的图片
    p2.imshow(predict_values[0, :, :, :])
    p2.axis('off')
    p2.set_title('image')

    plt.show()

12、自己处理图片

上面的例子使用了自带的inception_preprocessing.preprocess_image方法处理图片,现在我们用自己写个处理的方法看看效果如何?因为跟上面的例子差不多,这里就直接给出代码了,

#encoding:utf-8
import tensorflow as tf
from matplotlib import pyplot as plt
from nets import inception
from preprocessing import inception_preprocessing
import numpy as np
from datasets import imagenet

#获取inception_resnet_v2默认图片尺寸,这里为299
image_size = inception.inception_resnet_v2.default_image_size
#获取imagenet所有分类的名字,这里有1000个分类
names = imagenet.create_readable_names_for_imagenet_labels()

slim = tf.contrib.slim

#待测试图片路径
sample_image = 'bus.png'

#打开原图
image = tf.image.decode_jpeg(tf.read_file(sample_image), channels=3)
#对原图进行裁剪、缩放、归一化等处理,将图片大小缩放至299×299
processed_image = inception_preprocessing.preprocess_image(image, image_size, image_size, is_training=False)
#增加一个维度
processed_images = tf.expand_dims(processed_image, 0)

#创建模型
arg_scope = inception.inception_resnet_v2_arg_scope()
with slim.arg_scope(arg_scope):
    logits, end_points = inception.inception_resnet_v2(processed_images, is_training=False)

with tf.Session() as sess:
    # 这里是我们下载下来的模型的路径
    checkpoint_file = 'checkpoint/inception_resnet_v2_2016_08_30.ckpt'
    #加载已训练好的模型
    saver = tf.train.Saver()
    saver.restore(sess, checkpoint_file)

    #通过softmax获取分类
    probabilities = tf.nn.softmax(logits)
    srcimage, predict_values, logit_values = sess.run([image, processed_images, probabilities])

    print(np.max(logit_values))
    print(np.argmax(logit_values), names[np.argmax(logit_values)])

    plt.figure()
    p1 = plt.subplot(121)
    p2 = plt.subplot(122)

    # 显示原始图片
    p1.imshow(srcimage)
    p1.axis('off')
    p1.set_title('source image')

    # 显示预处理后的图片
    p2.imshow(predict_values[0, :, :, :])
    p2.axis('off')
    p2.set_title('image')

    plt.show()

运行结果,

8.191614

(448, 'binoculars, field glasses, opera glasses')

8.673139

(966, 'burrito')

10.063082

(780, 'school bus')

图像识别的矫正算法 图像识别检测_图像识别的矫正算法_08

图像识别的矫正算法 图像识别检测_tensorflow_09

图像识别的矫正算法 图像识别检测_sed_10

 

除了第一张识别的是莫老师的眼镜以外,另外两张图片的识别结果是一样的,这也说明了,在图片预处理这块,处理方法不一样,识别到的物体也有可能不同。

那有没有什么方法,尽可能的将图片中的物体识别出来呢?这就是我们下一节要讲的了。