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中制作金字塔条形图
使用场景:一项市场调查研究中,男性和女性.赞同和反对.满意和不满意的两方面的消费者,他们在某些项目上的指标分布特性一项产品组合决策中,乐观场景和悲观场景下各产品的获利情况一个产品试销活动中,不同门店渠 ...
随机推荐
- android 开启闪光灯小应用
该程序需要在AndroidManifest.xml添加权限,属性 android:screenOrientation="portrait" android.permission.C ...
- 变量[^_^][T_T]
变量[^_^][T_T]source .bashrcget_ps1(){if [ "$?" = "0" ]then#we're on the system co ...
- 【loj3054】【hnoi2019】鱼
题目 描述 难以描述.......慢慢看..: https://loj.ac/problem/3054 范围 $6 \le n \le 1000 , 1 \le |x| , |y| \ ...
- Segment 李超线段树
题目大意: 要求在平面直角坐标系下维护两个操作: 1.在平面上加入一条线段.记第 i 条被插入的线段的标号为 i 2.给定一个数 k,询问与直线 x = k 相交的线段中,交点最靠上的线段的编号. 若 ...
- asp 读cookie 下划线 丢失
昨天有一个用户反应,登录后还是会显示:请登录后再使用. 我一查,原来有一个cookie设置后,无法正常读取. 整个情况是这样: 登录的时候,设置2个 cookie: user_name logon_t ...
- arm裸机通过uboot运行hello world程序测试结果
开发板EasyARM i.MX280A CPU:arm926ejs helloworld程序使用的编译器 (1)arm-fsl-linux-gnueabi-gcc version gcc4.4.4 ...
- mac idea中的文件在finder中打开
设置工具扩展:
- 数据类型、位运算、sizeof()函数
数据精度,依次升高.(负数必须使用有符号类型) 不同精度的数据间运算,所得结果为高精度类型. 数据类型详细信息如下图: 整型数据的数制:十进制(32).八进制(032,以0开头).十六进制(0x32, ...
- 20145215《网络对抗》Exp7 网络欺诈技术防范
20145215<网络对抗>Exp7 网络欺诈技术防范 基础问题回答 通常在什么场景下容易受到DNS spoof攻击? 在同一局域网下比较容易受到DNS spoof攻击,攻击者可以冒充域名 ...
- echarts2 饼图处理标签文字过长使之达到指定字数换行的目的
在使用echarts2的过程中,有时会遇到标签文字过长导致显示不完整的问题.例如: 这时候就需要用到 标签里的formatter 回调函数来处理这种情况了. 方式一: formatter : ' { ...