点击上方蓝字关注我们
微信公众号:OpenCV学堂
关注获取更多计算机视觉与深度学习知识
mean.binaryproto文件生成
用Caffe框架训练图像相关的视觉任务时候,在预处理的时候会先求图像的均值,这个均值其实是整个数据集的图像均值,Caffe中提供了一个工具来计算数据集的均值,该工具就是compute_image_mean,只要调用一下,就会生成一个mean.binaryproto文件。
compute_image_mean工具
这个文件是一个二进制文件,可以通过python读取的。但是读取出来的值并不是真正的均值,而且一张图像,很多人使用第三方框架调用Caffe训练好的模型时候就不知道如何找到预处理时候的均值了。这个要从mean.binaryproto文件的生成说起,它是通过compute_image_mean工具转换的,这个工具的实现代码如下:
https://github.com/BVLC/caffe/blob/master/tools/compute_image_mean.cpp
其中有两个部分值得关注,我分别框出来了。最终得到mean.binaryproto里面是均值图像,在第一部中计算完成。得到均值打印到LOG里面去了,并没有保存下来。但是我们从这部分代码知道了如何从均值图像计算得到各个通道的均值了。
读取与解析
搞清楚这件事情之后,就可以通过python读取mean.binaryproto文件,然后直接得到均值图像,记得它的存储顺序是NCHW,所以要矩阵转换为HWC,因为N为1可以去掉的。最终得到输出的通道值,OpenCV有个cv.means函数调用一下即可打印出来,知道减去的means是多少了。实现代码如下:
mean_blob = caffe.proto.caffe_pb2.BlobProto()
mean_blob.ParseFromString(open(MEAN_FILE, 'rb').read())
# 将均值blob转为numpy.array
data = caffe.io.blobproto_to_array(mean_blob)
data = data.reshape(3, 32, 32)
data = data.transpose((1, 2, 0))
print(data.shape)
m = cv.mean(data)
print(m)
cv.imshow("means", np.uint8(data))
cv.waitKey(0)
cv.destroyAllWindows()
使用上述代码即可查看均值图像,而且得到图像数据集各个通道均值,前提是有caffe python支持。
PS:这个问题其实上个周末的时候别人问我的!我就记录分享一下!
推荐阅读
OpenCV4系统化学习路线图-视频版本!
五分钟搞定OpenCV4 + QT5集成与代码测试
OpenCV4.2 + OpenVINO2020安装配置与应用演示
OpenVINO深度学习推理框架 开发技术系列文章汇总
单应性矩阵应用-基于特征的图像拼接
OpenCV图像拼接改进算法之完美拼接
干货 | 基于特征的图像配准用于缺陷检测
OpenCV | 二值图像分析的技巧都在这里
OpenCV二值图像分析之形态学应用技巧
图像色彩空间与应用转换
五分钟学会C++高效图表绘制神器调用
没想到图像直方图有这么多应用场景
基于灰度共生矩阵(GLCM)的图像纹理分析与提取
OpenCV中一个最容易搞错的形态学操作
OpenCV+OpenVINO实现人脸Landmarks实时检测
OpenCV4+OpenVINO实现图像的超分辨
利用单应性矩阵实现文档对齐显示