windows下caffe-ssd中resize的坑

本文探讨了在Windows平台使用Caffe框架进行SSD模型训练及测试时遇到的问题,特别是针对caffe.io.Transformer中resize函数处理速度缓慢的情况,尝试用OpenCV的resize函数替代,并分析了由此导致检测结果差异的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

在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方式对同一张图片处理后结果的差异,发现两种方式存在不同,虽然说差异很小,但是也会严重影响检测结果,原因可能如下:

  1. 模型不够鲁棒
  2. caffe中的resize和opencv中的resize的默认插值方式可能不同,这点需要看源码进行确认
  3. 在ubuntu上不存在这个问题,猜想可能是在windows下的caffe不是官方提供的,可能处理方式存在差异

最终,全部采用caffe.io.Transformer的方式进行图片的预处理,检测结果恢复正常。

此外,测试了opencv2和opencv3,发现用opencv2处理图片,检测的效果更好,原因未知!

### 如何下载并配置 MobileNet-SSD 模型 要成功下载并配置 MobileNet-SSD 模型,可以按照以下方法操作: #### 下载 Caffe-SSD 和 MobileNet-SSD Caffe 是一种流行的深度学习框架,而 SSD(Single Shot MultiBox Detector)是一种高效的目标检测算法。MobileNet-SSD 结合了轻量级的 MobileNet 架构和高效的 SSD 算法[^2]。 可以通过克隆 caffe-ssd 的 GitHub 仓库来获取源码: ```bash git clone https://github.com/weiliu89/caffe.git caffe-ssd cd caffe-ssd ``` 接着,需要下载 MobileNet-SSD 的具体实现代码及其预训练模型。可以从 chuanqi305 提供的资源中找到 prototxt 文件及相关说明文档[^1]。 #### 安装依赖项 为了使 Caffe 能够正常工作,需先安装必要的依赖库。以下是部分常见依赖列表: - Boost 库 - OpenCV - Python 开发包 - BLAS (Basic Linear Algebra Subprograms) 在 Ubuntu 上可通过 apt-get 工具快速完成这些依赖的安装: ```bash sudo apt-get update && sudo apt-get install -y libprotobuf-dev libleveldb-dev libsnappy-dev \ libhdf5-serial-dev protobuf-compiler python-numpy git cmake curl checkinstall gfortran \ libboost-all-dev libatlas-base-dev libopenblas-dev libopencv-dev ``` #### 编译 Caffe-SSD 进入 `caffe-ssd` 目录后执行编译命令。如果系统支持 GPU 加速,则可以在 Makefile.config 中启用 CUDA 支持。 ```bash cp Makefile.config.example Makefile.config nano Makefile.config # 修改文件以适应本地环境设置 make all -j$(nproc) make pycaffe # 如果计划通过 Python 接口调用 Caffe make test # 可选:验证构建是否正确无误 make runtest # 可选:运行单元测试案例集 ``` #### 获取预训练模型 对于已经发布的 MobileNet-SSD 预训练权重文件,可以直接从官方或其他可信来源处下载。例如,在上述提到的项目页面上提供了链接用于下载 `.caffemodel` 格式的权重数据[^4]。 假设已获得名为 `mobilenet_iter_73000.caffemodel` 的文件,将其放置于适当位置并与对应的 deploy.prototxt 文件关联起来即可加载整个网络结构及参数。 #### 测试模型功能 最后一步是对新搭建好的 MobileNet-SSD 进行简单的推理实验确认其可用性。准备一张图片作为输入样本,并利用下面脚本片段展示预测结果: ```python import numpy as np import cv2 net = cv2.dnn.readNetFromCaffe('deploy.prototxt', 'mobilenet_iter_73000.caffemodel') image = cv2.imread('example.jpg') (h, w) = image.shape[:2] blob = cv2.dnn.blobFromImage(cv2.resize(image, (300, 300)), 0.007843, (300, 300), 127.5) net.setInput(blob) detections = net.forward() for i in range(detections.shape[2]): confidence = detections[0, 0, i, 2] if confidence > 0.5: idx = int(detections[0, 0, i, 1]) box = detections[0, 0, i, 3:7] * np.array([w, h, w, h]) (startX, startY, endX, endY) = box.astype("int") label = f"{CLASSES[idx]}: {confidence*100:.2f}%" cv2.rectangle(image, (startX, startY), (endX, endY), COLORS[idx], 2) y = startY - 15 if startY - 15 > 15 else startY + 15 cv2.putText(image, label, (startX, y), cv2.FONT_HERSHEY_SIMPLEX, 0.5, COLORS[idx], 2) cv2.imshow("Output", image) cv2.waitKey(0) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值