从零开始学caffe(七):利用GoogleNet实现图像识别

一、准备模型

在这里,我们利用已经训练好的Googlenet进行物体图像的识别,进入Googlenet的GitHub地址,进入models文件夹,选择Googlenet
在这里插入图片描述
点击Googlenet的模型下载地址下载该模型到电脑中。

模型结构

在这里,我们利用之前讲到的网络模型绘制网站画出Googlenet的结构图如下:
在这里插入图片描述

  • 在这里,pad就是给图像补零,pad:2就是补两圈零的意思;

  • LRN就是局部相应归一化,利用LRN可以提高模型识别的准确率;

  • Inception结构中,不同大小的卷积核意味着不同大小的感受野,最后的合并意味着不同尺度特征的融合。采用1,3,5为卷积核的大小,是因为使用步长为1,pad=0,1,2的方式采样之后得到的特征平面大小相同;

  • concat层用来合并数据,在这里合并的条件是数据的后三个参数要相同,所以在前面的inception结构中,我们使用了不同的卷积核大小和pad。

准备图片

在这里,我们找几张任意图片,然后放入Googlenet的文件夹下,,作为待识别的图片。
在这里插入图片描述

准备synset_words.txt文件

synset_words.txt是用来将物体的类别序号进行对应的文件,在识别过程中,我们先是得到序号,然后根据这个序号找到对应的物体种类。

使用python接口调用GoogleNet实现图像识别

在这里,我们用jupyter打开Googlenet.图像识别.ipynb文件,这里部分代码如下:

import caffe
import numpy as np
import matplotlib.pyplot as plt
import os
import PIL
from PIL import Image
import sys

#定义Caffe根目录
caffe_root = 'E:/caffe-windows/'
#网络结构描述文件
deploy_file = caffe_root+'models/bvlc_googlenet/deploy.prototxt'
#训练好的模型
model_file = caffe_root+'models/bvlc_googlenet/bvlc_googlenet.caffemodel'

#cpu模式
caffe.set_mode_cpu()

#定义网络模型
net = caffe.Classifier(deploy_file, #调用deploy文件
                       model_file,  #调用模型文件
                       mean=np.load(caffe_root +'python/caffe/imagenet/ilsvrc_2012_mean.npy').mean(1).mean(1), #调用均值文件
                       channel_swap=(2,1,0),  #caffe中图片是BGR格式,而原始格式是RGB,所以要转化
                       raw_scale=255,         #python中将图片存储为[0, 1],而caffe中将图片存储为[0, 255],所以需要一个转换
                       image_dims=(224, 224)) #输入模型的图片要是224*224的图片

#分类标签文件
imagenet_labels_filename = caffe_root +'models/bvlc_googlenet/synset_words.txt'
#载入分类标签文件
labels = np.loadtxt(imagenet_labels_filename, str, delimiter='\t')

#对目标路径中的图像,遍历并分类
for root,dirs,files in os.walk(caffe_root+'models/bvlc_googlenet/image/'):
    for file in files:
        #加载要分类的图片
        image_file = os.path.join(root,file)
        input_image = caffe.io.load_image(image_file)

        #打印图片路径及名称
        image_path = os.path.join(root,file)
        print(image_path)
        
        #显示图片
        img=Image.open(image_path)
        plt.imshow(img)
        plt.axis('off')
        plt.show()
        
        #预测图片类别
        prediction = net.predict([input_image])
        print 'predicted class:',prediction[0].argmax()

        # 输出概率最大的前5个预测结果
        top_k = prediction[0].argsort()[-5:][::-1]
        for node_id in top_k:     
            #获取分类名称
            human_string = labels[node_id]
            #获取该分类的置信度
            score = prediction[0][node_id]
            print('%s (score = %.5f)' % (human_string, score))

执行上述代码即可输出对物体种类的预测概率
在这里插入图片描述
最终得到的预测结果是根据可能性大小列出五个种类

猜你喜欢

转载自blog.csdn.net/dagongsmallguy/article/details/83351025
今日推荐