classfication中使用图像金字塔和sliding windows提高准确率
之前对imagenet的预训模型进行finetune,找出了很多样本选择时的注意事项,当时在测试如下这张照片时,效果不好,我认为是物体过小造成的,因此尝试使用图像金字塔的方法:
当时结果如下:
一开始我准备使用 net_full_conv.blobs['data'].reshape(1,3,scale_img.shape[1],scale_img.shape[0]) 这条语句,但一直出现“check failed: K_ == newK_ (9216 vs .20736) Input size incompatible with inner product parameters”,在网上搜了半天大概是因为:K_是输神经元的数目,它的值是channels*H*W,而在inner_product_layer.cpp中有if check( K_ != new_K) ,cout<<"Input size incompatible with inner product parameters";K_是初始的值,我训练模型时长和高都是227,传播到全连接层时为H和W,但我如果使用 net_full_conv.blobs['data'].reshape(1,3,scale_img.shape[1],scale_img.shape[0]) 这条语句则会使初始的inner product和新的inner product不一致从而出错;(人脸框识别时使用这条语句时没有错是因为其网络结构中没有全连接层,卷积层后直接接softmax层,卷积层输出为2,这样一来没有inner product这一参数就不会出现这种错误,在github上找到类似地问题,别人说他将全连接层中的inner product都去掉就可以了,但我未实践成功,链接:https://github.com/jacobandreas/nmn2/issues/17,大家有类似问题的可以看一下)
我的做法是先对原图进行图像金字塔,再使用sliding windows,stride为50,窗口大小为227,这样就不会出现check的错误了
def jinzita(imgfile): term_1 = []
term_2 = [] transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape}) #设定图像的shape格式
transformer.set_mean('data', np.load(caffe_root +
'/python/caffe/imagenet/ilsvrc_2012_mean.npy').mean(1).mean(1)) #减去均值操作
transformer.set_transpose('data', (2,0,1)) #move image channels to outermost dimension
transformer.set_channel_swap('data', (2,1,0)) #swap channels from RGB to BGR
transformer.set_raw_scale('data', 255.0) #rescale from [0,1] to [0,] randNum = random.randint(1 , 10000)
scales = [] #设置几个scale,组成图像金字塔
factor = 0.793700526 #图像放大或者缩小的一个因子(经验值) image = cv2.imread(imgfile) #读入测试图像 largest = min(2, 4000/max(image.shape[0:2])) #设定做scale变幻时最大的scale
scale = largest
minD = largest*min(image.shape[0:2]) #设定最小的scale
while minD >= 227: #只要最小的边做完最大的scale变换后大于227,之前得到的largest就可以作为最大的scale来用,并依此乘上factor,加入到scale列表中
scales.append(scale)
scale *= factor
minD *= factor
#scales = [2 ,3 ,4]
for scale in scales:
print scale
x1 = 0
y1 = 0
scale_img = cv2.resize(image , (int(image.shape[1] * scale) , int(image.shape[0] *scale))) #调整图像的长和高,shape[0]是高,注意这里还存在一个转置,所以是先shape[1],再是shape[0]
cv2.imwrite('/media/zhaofan/Myfile/caffe/data/finetune_1/scale/scale.jpg' , scale_img)
while ((y1 + 227) <= scale_img.shape[0]): while ((x1 + 227) <= scale_img.shape[1]): img = scale_img[y1 : y1 + 227 , x1 : x1 + 227]
cv2.imwrite('/media/zhaofan/Myfile/caffe/data/finetune_1/scale/crop_img.jpg' , img)
im = caffe.io.load_image('/media/zhaofan/Myfile/caffe/data/finetune_1/scale/crop_img.jpg') #得到的特征值是0到1之间的小数 output = net.forward(data=np.asarray([transformer.preprocess('data', im)]))
output_prob = output['prob'][0] #output_prob存储属于每类的概率,['prob'][0],它是一个一维数组
top_inds = output_prob.argsort()[: : -1][: 5]
term_1.append(output_prob[top_inds[0]])
term_2.append(labels[top_inds[0]]) x1 += 50
x1 = 0
y1 += 50 inds = term_1.index(max(term_1)) print term_1[inds] , term_2[inds]
最后结果为:
0.99585 2 bird
相比于之前已改善很很多!
(这里还有一点要注意的地方,在对图像进行操作比如裁剪,保存等操作时,要使用相同的库,比如全部用PIL库或者全部用cv库或其他库,否则会出错)
源码链接: https://pan.baidu.com/s/1jHThUcA 密码: pkra
classfication中使用图像金字塔和sliding windows提高准确率的更多相关文章
- 在离线环境中发布.NET Core至Windows Server 2008
在离线环境中发布.NET Core至Windows Server 2008 0x00 写在开始 之前一篇博客中写了在离线环境中使用.NET Core,之后一边学习一边写了一些页面作为测试,现在打算发布 ...
- c#中如何跨线程调用windows窗体控件
c#中如何跨线程调用windows窗体控件? 我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍.首 ...
- WebStorm中配置node.js(Windows)
WebStorm中配置node.js(Windows) 一.node 1.下载安装包 32 位 : https://nodejs.org/dist/v4.4.3/node-v4.4.3-x86.msi ...
- [LeetCode] 643. Maximum Average Subarray I_Easy tag: Dynamic Programming(Sliding windows)
Given an array consisting of n integers, find the contiguous subarray of given length k that has the ...
- UWP中String类型如何转换为Windows.UI.Color
原文:UWP中String类型如何转换为Windows.UI.Color 我在学习过程中遇到的,我保存主题色为string,但在我想让StatusBar随着主题色变化时发现没法使用. ThemeCol ...
- 1、如何在列表,字典,集合种根据条件筛选数据?2、如何为元组中的每个元素命名,提高程序的可读性3、如何统计出序列中元素出现的频度4、如何根据字典中value的大小,对字典的key进行排序
一.数据筛选: 处理方式: 1.filter函数在py3,返回的是个生成式. from random import randint data = [randint(-100,100) for i in ...
- 在Windows7中打开照片,提示“Windows 照片查看器无法显示此图片,因为计算机上的可用内存可能不足。....”
在Windows7中打开照片,提示"Windows 照片查看器无法显示此图片,因为计算机上的可用内存可能不足.请关闭一些目前没有使用的程序或者释放部分硬盘空间(如果硬盘几乎已满),然后重试. ...
- (ETW) Event Trace for Windows 提高 (含pdf下载)
内容提纲 • 托管代码与非托管代码介绍 • 不安全代码介绍 • 用户模式与内核模式 • ETW执行流程分析 • 日志分析工具介绍:PerfView.exe ETW与非托管代码 • ETW依赖的So ...
- 在Excel中制作金字塔条形图
使用场景:一项市场调查研究中,男性和女性.赞同和反对.满意和不满意的两方面的消费者,他们在某些项目上的指标分布特性一项产品组合决策中,乐观场景和悲观场景下各产品的获利情况一个产品试销活动中,不同门店渠 ...
随机推荐
- 从TensorFlow到PyTorch:九大深度学习框架哪款最适合你?
开源的深度学习神经网络正步入成熟,而现在有许多框架具备为个性化方案提供先进的机器学习和人工智能的能力.那么如何决定哪个开源框架最适合你呢?本文试图通过对比深度学习各大框架的优缺点,从而为各位读者提供一 ...
- 07 zabbix之map拓扑标签中macro应用
zabbix之map拓扑标签中macro应用 请先预习网地图map : 请点击 macro官方文档介绍 : 请点击 1. Map labels(拓扑图标签)主要注意以下Macros(宏): MAC ...
- 自学Zabbix3.12.4-动作Action-Operation配置
点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 3.12.4 自学Zabbix3.12.4-动作Action-Operation配置 1. 概述 ...
- centos7安装redis的正确姿势
目前redis5已经发布,Redis 5 是 Redis 引入流数据类型(Stream data type)的第一个版本.按照官方的说法,不使用该特性的用户在生产环境中使用 Redis 5 会有更好的 ...
- Angularjs中的$q详解
先说说什么是Promise,什么是$q吧.Promise是一种异步处理模式,有很多的实现方式,比如著名的Kris Kwal's Q还有JQuery的Deffered. 什么是Promise 以前了解过 ...
- 【bzoj3680】平衡点 模拟退火
模拟退火是一种求函数最值问题的随机算法. 给定一个函数的某一初始坐标,可以拟定一个"温度"(这里主要是借用退火的物理意义),这里的温度可以理解成自变量可以取值的范围.之后在当前最优 ...
- C#反射类中所有字段,属性,方法
可能大家都知道在C#中如何创建一个类,但对于类的结构可能大家不一定了解的很清楚,对于我来说,我之前也搞的不是很明白,今天,当我没事研究反射的时候突然发现了着一点.我们来看类的结构到底是什么 publi ...
- sys模块(二十一)
用于提供对Python解释器相关的操作: sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Pyt ...
- go 练习
1.判断 101-200 之间有多少个素数,并输出所有素数 定义:为在大于1的自然数中,除了1和它本身以外不再有其他因数的数称为质数. package main import ( "fmt& ...
- 盖得化工--selenium翻页测试
Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...