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中制作金字塔条形图
使用场景:一项市场调查研究中,男性和女性.赞同和反对.满意和不满意的两方面的消费者,他们在某些项目上的指标分布特性一项产品组合决策中,乐观场景和悲观场景下各产品的获利情况一个产品试销活动中,不同门店渠 ...
随机推荐
- 洛谷 P2466 Sue的小球 解题报告
P2466 [SDOI2008]Sue的小球 题目描述 Sue和Sandy最近迷上了一个电脑游戏,这个游戏的故事发在美丽神秘并且充满刺激的大海上,Sue有一支轻便小巧的小船.然而,Sue的目标并不是当 ...
- 修复Mysql主从不同步shell
使用第三方工具MySQL Enterprise Monitor,MySQL企业版监控工具.MONyog – MySQL Monior and Advisor,MONyog大家都不陌生,windows下 ...
- DataFrame 数据去重
df.head() >>> Price Seqno Symbol time 0 1623.0 0.0 APPL 1473411962 1 1623.0 0.0 APPL 147341 ...
- CF1114F Please, another Queries on Array?(线段树,数论,欧拉函数,状态压缩)
这题我在考场上也是想出了正解的……但是没调出来. 题目链接:CF原网 题目大意:给一个长度为 $n$ 的序列 $a$,$q$ 个操作:区间乘 $x$,求区间乘积的欧拉函数模 $10^9+7$ 的值. ...
- win32: 查询滚动条相关信息的注意事项
今天打算判断一个窗口是否出现垂直滚动条,我的代码: SCROLLINFO si; //滚动条信息结构体 si.cbSize = sizeof(SCROLLINFO ...
- xor定理证明
xor 证明: 0 xor 0=0 0 xor 1=1 1 xor 0=1 1 xor 1=0 0 xor 其它数,数值不会改变1 xor 其它数,数值会反转 所以x个数0和y个数1进行xor运算(0 ...
- DOJO常用的函数
DOJO常用的: 1,通过dojo.require以类似C编程中#include或者Java中import的方式加载所需的部件如dojo.require("dojo.parser" ...
- nginx upstream的配置
upstream backend { server 13.4.2.14:8080 max_fails=2 fail_timeout=30s ; server 13.4.2.15:8080 max_fa ...
- 在 .NET Framework 4.0 的程序中使用 .NET Framework 2.0 的程序集
场景 在 目标框架 为 .NET Framework 4 的程序中,引用 目标框架 为 .NET Framework 2.0 的程序集,并使用 .NET Framework 2.0 程序集中的类型或者 ...
- JAVA记录-Spring两大特性
1.IOC控制反转 Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象 ...