zoukankan      html  css  js  c++  java
  • Caffe SSD的resize过程解析

    问题描述
    在windows平台上,本地训练SSD_512得到了对应的权值参数文件,加载模型进行前向测试的时候,发现调用caffe.io.Transformer中的resize处理函数速度太慢,打算用opencv的resize做替换,因此更改了输入图片到模型中的预处理过程,使用caffe.io.Transformer进行预处理的过程如下:

    import numpy as np 
    import sys,os 
    # 设置当前的工作环境在caffe下 
    caffe_root = '/home/xxx/caffe/' 
    # 我们也把caffe/python也添加到当前环境 
    sys.path.insert(0, caffe_root + 'python') 
    import caffe 
    os.chdir(caffe_root)#更换工作目录
    
    # 设置网络结构 
    net_file=caffe_root + 'models/bvlc_reference_caffenet/deploy.prototxt' 
    # 添加训练之后的参数 
    caffe_model=caffe_root + 'models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel' 
    # 均值文件 
    mean_file=caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy'
    
    # 这里对任何一个程序都是通用的,就是处理图片 
    # 把上面添加的两个变量都作为参数构造一个Net 
    net = caffe.Net(net_file,caffe_model,caffe.TEST) 
    # 得到data的形状,这里的图片是默认matplotlib底层加载的 
    transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape}) 
    # matplotlib加载的image是像素[0-1],图片的数据格式[weight,high,channels],RGB 
    # caffe加载的图片需要的是[0-255]像素,数据格式[channels,weight,high],BGR,那么就需要转换
    
    # channel 放到前面 
    transformer.set_transpose('data', (2,0,1)) 
    transformer.set_mean('data', np.load(mean_file).mean(1).mean(1)) 
    # 图片像素放大到[0-255] 
    transformer.set_raw_scale('data', 255) 
    # RGB-->BGR 转换 
    transformer.set_channel_swap('data', (2,1,0))
    
    # 这里才是加载图片 
    im=caffe.io.load_image(caffe_root+'examples/images/cat.jpg') 
    # 用上面的transformer.preprocess来处理刚刚加载图片 
    net.blobs['data'].data[...] = transformer.preprocess('data',im) 
    #注意,网络开始向前传播啦 
    out = net.forward() 
    # 最终的结果: 当前这个图片的属于哪个物体的概率(列表表示) 
    output_prob = output['prob'][0] 
    # 找出最大的那个概率 
    print 'predicted class is:', output_prob.argmax() 
    

      


    用opencv2中的resize函数替换之后,检测的结果很差,最终通过比较两种resize方式对同一张图片处理后结果的差异,发现两种方式存在不同,虽然说差异很小,但是也会严重影响检测结果,原因可能如下:

    模型不够鲁棒
    caffe中的resize和opencv中的resize的默认插值方式可能不同,这点需要看源码进行确认
    在ubuntu上不存在这个问题,猜想可能是在windows下的caffe不是官方提供的,可能处理方式存在差异
    最终,全部采用caffe.io.Transformer的方式进行图片的预处理,检测结果恢复正常。

    此外,测试了opencv2和opencv3,发现用opencv2处理图片,检测的效果更好,原因未知!
    ---------------------
    作者:tsq292978891
    来源:CSDN
    原文:https://blog.csdn.net/tsq292978891/article/details/78918413
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    罗辑思维 140 认钱不认人(刚需是扯淡,一切都是稀缺,人生全是选择)——理性永远都是最珍贵的
    程序最多能new多少内存(2G内存里要放程序的5大区,HeapAlloc比new要快多了,而且超过2G的时候会告诉你)
    Qt中使用ActiveX(3篇)
    windows下的socket网络编程(入门级)
    网络数据包发送工具PacketSender中文源码
    avalon.js实现一个简易日历
    avalonJS入门(一)
    JS中的模块规范(CommonJS,AMD,CMD)
    程序员必看的书
    简单的语音聊天室
  • 原文地址:https://www.cnblogs.com/sddai/p/10224954.html
Copyright © 2011-2022 走看看