对于已经训练完成的caffemodel,对于单个的图片预测,用python接口来调用是一件非常方便的事情,下面就来讲述如何用python调用已经训练完成的caffemodel,以及prototxt,网上关于这一方面的教程已经是比较多的了,但是我想针对我做的过程发现的一些问题做一个总结

,先给出几个用python调用caffemodel的链接,链接1链接2链接3,主要是参考链接1的内容,整体代码如下,

  1. #coding=utf-8
  2. import sys
  3. import numpy as np
  4. import cv2
  5. from glob import glob
  6. from tqdm import tqdm
  7. caffe_root = '/usr/local/caffe/'
  8. sys.path.insert(0, caffe_root + 'python')
  9. import caffe
  10. import multiprocessing
  11.  
  12. model_file = '/home/ying/data2/shiyongjie/mpc/res50/acc/resnet_50_deploy.prototxt' # deploy文件
  13. pretrained = '/home/ying/data2/shiyongjie/mpc/res50/acc/model_iter_280000.caffemodel' # 训练的caffemodel
  14. image_file = '/home/ying/data2/shiyongjie/mpc/coal_data/0/output/0_ffff4083-a13a-4e62-9870-59cd70709f7c.JPEG'
  15. mean_file = '/home/ying/data2/shiyongjie/mpc/coal_data/mean_train.npy'
  16. net = caffe.Net(model_file, pretrained, caffe.TEST) #加载model和network
  17.  
  18. #图片预处理设置
  19. transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape}) #设定图片的shape格式(1,3,28,28)
  20. transformer.set_transpose('data', (2,0,1)) #改变维度的顺序,由原始图片(28,28,3)变为(3,28,28)
  21. transformer.set_mean('data', np.load(mean_file).mean(1).mean(1)) #减去均值,前面训练模型时没有减均值,这儿就不用
  22. transformer.set_raw_scale('data', 255) # 缩放到【0,255】之间
  23. transformer.set_channel_swap('data', (2,1,0)) #交换通道,将图片由RGB变为BGR
  24.  
  25. print('#$%^&#@*!')
  26. image_file_list = glob('/home/ying/data2/shiyongjie/mpc/coal_data/0/output/*JPEG') # 列出目录下的所有jpeg图片
  27. image_file_list.sort()
  28. image_file_list = image_file_list[:len(image_file_list)/2] # 速度预测非常慢,将list拆分
  29. # pool = multiprocessing.Pool(processes = 4)
  30. results = []
  31. for image_file in tqdm(image_file_list): # tqdm显示进度条
  32. im = caffe.io.load_image(image_file)
  33. net.blobs['data'].data[...] = transformer.preprocess('data', im) #执行上面设置的图片预处理操作,并将图片载入到blob中
  34. out = net.forward()
  35. top_k = net.blobs['prob'].data[0].flatten().argsort()[-1:-6:-1]
  36. results.append(top_k[0]) # 将预测的结果保存到results中
  37. # print(top_k[0])
  38. # for i in np.arange(top_k.size):
  39. # print top_k[i]
  40. acc0 = float(results.count(0))/float(len(image_file_list)) # 计算预测四类结果的概率
  41. acc1 = float(results.count(1))/float(len(image_file_list))
  42. acc2 = float(results.count(2))/float(len(image_file_list))
  43. acc3 = float(results.count(3))/float(len(image_file_list))
  44. print(acc0, acc1, acc2, acc3)

这里其实有很多细节的问题,先给自己挖个坑,主要有,deploy文件与一般的train_val.prototxt文件有些许不同,看上面第三个链接,他们加载prototxt的是lenet.prototxt,去caffe/example/mnist/lenet.prototxt查看这个文件,如下

实际上左边是deploy的,右边是train_val的,可以看出左右的区别就是地一层,右边train和test都是data层,左边是input层,其余全都一样,所以deploy也是很有讲究的,mnist是在训练的时候就没有减去均值,测试的时候加载均值文件在python内部写,见上述代码

实际上,我测试用的deploy与mnist又有些许不同,如下

同时修改最后一行

我用的resnet基本上lr以及权重初始化的参数都已经取消了,最后一个name用prob,测试的时候输出的是预测为每一类的概率,在python最后的输出net.blobs['prob']也能够看出,感觉是个字典,给自己挖个坑

可以看出,deploy文件与train_val文件是有很大的不同的,这种不同可能与平台无关,在python是这样,在c++也可能是这样

但是用python调用速度非常慢,这样说吧,5w张图片要6个小时,速度相当慢,我一个同学,用c++调用同样的caffemodel200张图片,0.4s,5w张图片100s就搞定

python调用caffe实现预测的更多相关文章

  1. python调用caffe环境配置

    背景是这样的,项目需要,必须将训练的模型通过C++进行调用,所以必须使用caffe或者mxnet,而caffe是用C++实现,所以有时候简单的加载一张图片然后再进行预测十分不方便 用caffe写pro ...

  2. torch7 调用caffe model 作为pretrain

    torch7 调用caffe model 作为pretrain torch7 caffe preTrain model zoo torch7 通过 loadcaffe 包,可以调用caffe训练得到的 ...

  3. python调用.so

    python调用动态链接库的基本过程 动态链接库在Windows中为.dll文件,在linux中为.so文件.以linux平台为例说明python调用.so文件的使用方法. 本例中默认读者已经掌握动态 ...

  4. 【转】Python调用C语言动态链接库

    转自:https://www.cnblogs.com/fariver/p/6573112.html 动态链接库在Windows中为.dll文件,在linux中为.so文件.以linux平台为例说明py ...

  5. Python调用Prometheus监控数据并计算

    Prometheus是什么 Prometheus是一套开源监控系统和告警为一体,由go语言(golang)开发,是监控+报警+时间序列数 据库的组合.适合监控docker容器.因为kubernetes ...

  6. 【初学python】使用python调用monkey测试

    目前公司主要开发安卓平台的APP,平时测试经常需要使用monkey测试,所以尝试了下用python调用monkey,代码如下: import os apk = {'j': 'com.***.test1 ...

  7. python调用py中rar的路径问题。

    1.python调用py,在py中的os.getcwd()获取的不是py的路径,可以通过os.path.split(os.path.realpath(__file__))[0]来获取py的路径. 2. ...

  8. python调用其他程序或脚本方法(转)

    python运行(调用)其他程序或脚本 在Python中可以方便地使用os模块运行其他的脚本或者程序,这样就可以在脚本中直接使用其他脚本,或者程序提供的功能,而不必再次编写实现该功能的代码.为了更好地 ...

  9. python调用c\c++

    前言 python 这门语言,凭借着其极高的易学易用易读性和丰富的扩展带来的学习友好性和项目友好性,近年来迅速成为了越来越多的人们的首选.然而一旦拿python与传统的编程语言(C/C++)如来比较的 ...

随机推荐

  1. git报错fatal: I don't handle protocol '​https'处理

    一.背景说明 今天使用在Cygwin中git clone时报fatal: I don't handle protocol '​https',如下: 以为是Cygwin实现的git有点问题没太在意,换去 ...

  2. 使用Postman在Chrome下进行rest请求测试

    1.首先下载postman,我已经下载好,放在云盘里了. http://pan.baidu.com/s/1c1YoGKS 密码 dgfw 2.打开Chrome,点击更多工具->扩展程序~打开. ...

  3. Oracle的创建表和创建约束的Sql语句

    Oracle的创建表和创建约束的Sql语法 1.创建表的语句 ---1.创建模拟的数据表 --- --1.1.创建学生表Student create table Student( StuId NUMB ...

  4. Theano笔记

    scan函数 theano.scan(fn, sequences=None, outputs_info=None,non_sequences=None, n_steps=None, truncate_ ...

  5. 逆袭之旅DAY09.东软实训.接口

    2018年7月5日 package day0705.teacher.test1usb; /** * 测试类 * @author Administrator * */ public class UsbI ...

  6. shell 通配符

    Bash中的通配符 '?' 匹配一个任意字符 '*' 匹配0个或任意多个字符,也就是可以匹配任何内容 '[]' 匹配括号中任意一个字符.例如[abc]代表一定匹配一个字符,或者是a,或者是b,或者是c ...

  7. Java中数据类型相互转化

    1 将String 转换成int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([String], ...

  8. Animation和Animator 的区别

    此文章转载于极视学堂!!!! ①Animation和Animator 虽然都是控制动画的播放,但是它们的用法和相关语法都是大有不同的. Animation 控制一个动画的播放,而Animator是多个 ...

  9. Player Settings 导出设置

    Player Settings is where you define various parameters (platform specific) for the final game that y ...

  10. LeetCode刷题 Flood Fill 洪水填充问题

    An  image is represented by a 2-D array of integers,each integers,each integer respresenting the sta ...