【开发手记】泛化MindSpore的HwcToChw算子,使其支持多通道输入
HWC与CHW
先说一些基础知识
H 高度
W 宽度
C 通道数
HWC就是第一个维度是H的存储方法。以一个高2,宽3,有4个通道的数据为例,就是下面这种感觉:
img_hwc = np.array([[[1, 11, 21, 31],[2, 12, 22, 32],[3, 13, 23, 33]],[[4, 14, 24, 34],[5, 15, 25, 35],[6, 16, 26, 36]]], dtype=np.float64)
而CHW就是第一个维度是C的存储方法。以一个高2,宽3,有4个通道的数据为例,就是下面这种感觉:
img_chw = np.array([[[1, 2, 3],[4, 5, 6]],[[11, 12, 13],[14, 15, 16]],[[21, 22, 23],[24, 25, 26]],[[31, 32, 33],[34, 35, 36]]], dtype=np.float64)
对于普通彩色图像而言,机器学习中最常见的应该是RGB或BGR格式,它们的C都是3。所以在最初设计算子的时候,通常认为维度为3的图像数据(HWC或CHW都是3维)的C维度要么是1(灰度数据),要么是3(彩色数据)。
而随着机器学习被广泛的应用,一些场景中,有的时候通道数可能很多。比如,医疗图像中每一个层可以看成是一个切片,整张图片包含很多的切片。为了使这样的数据也可以被很好的处理,本次修改应运而生。
开发环境搭建
主要参考官网的安装指南中,通过代码安装的部分。
https://www.mindspore.cn/install
MindSpore的minddata中HwcToChw算子如何实现
本次要修改的算子实现在下面的C++文件中:
mindspore/ccsrc/minddata/dataset/kernels/image/image_utils.cc
具体是这样的一个函数:
Status HwcToChw(std::shared_ptr<Tensor> input, std::shared_ptr<Tensor> *output) {...
}
首先对输入数据进行检查,
然后利用OpenCV库中的cv::extractChannel
方法,按照通道数,对每一个通道数据进行提取并另外保存。
最后生成新维度的数据并输出。
泛化
首先是输入数据检查的部分。
原来的实现是,当通道数为3的时候,如果C的值不是1或3,则判断为无效的数据。具体实现如下:
if (input_cv->shape().Size() < MIN_IMAGE_DIMENSION || input_cv->shape().Size() > DEFAULT_IMAGE_CHANNELS ||(input_cv->shape().Size() == DEFAULT_IMAGE_CHANNELS && num_channels != DEFAULT_IMAGE_CHANNELS &&num_channels != MIN_IMAGE_CHANNELS)) {
泛化方法,修改对无效数据的判断条件为,只要维度数正确,都判断为有效。也就是不再对通道数进行限制。具体实现如下:
if (input_cv->shape().Size() != DEFAULT_IMAGE_RANK) {
单体测试
测试用例
单体测试代码在这里:
tests/ut/python/dataset/test_HWC2CHW.py
用例一,简单判断C为5的时候,算子是不是可以顺利执行,执行结果的维度是不是符合预期。
# test one tensor with 5 channelsimg = np.zeros([50, 50, 5])assert img.shape == (50, 50, 5)img1 = c_vision.HWC2CHW()(img)assert img1.shape == (5, 50, 50)
用例二,pipeline模式,对shape为4,2,5的数据进行转换,并检查转换后的维度与具体数值是不是符合预期。
# create numpy array in HWC format with shape (4, 2, 5) like a fake image with 5 channelsraw_data = np.random.rand(4, 2, 5).astype(np.float32)expect_output = np.transpose(raw_data, (2, 0, 1))# NumpySliceDataset support accept data stored in list, tuple etc, here only one row data in list.input_data = np.array([raw_data])dataset = ds.NumpySlicesDataset(input_data, column_names=["col1"], shuffle=False)hwc2chw = c_vision.HWC2CHW()dataset = dataset.map(hwc2chw, input_columns=["col1"])for item in dataset.create_tuple_iterator(output_numpy=True):assert np.allclose(item[0], expect_output)
执行测试
代码修改好后,进行编译。
因为需要支持测试功能,所以编译的时候要加上 -t on
编译选项。
第一次编译的话,时间比较长。
编译完成之后运行下面命令执行测试。
cd tests/ut/python
bash runtest_opensrc.sh dataset/test_HWC2CHW.py
提交
测试没有问题之后,执行下面命令进行提交。
git add mindspore/ccsrc/minddata/dataset/kernels/image/image_utils.cc
git add tests/ut/python/dataset/test_HWC2CHW.py
git commit -m "Improved HwcToChw support multi-channel input."
git push --set-upstream origin mindcon_coding_hwc2chw
推送到自己的仓库后,可以点PR按钮,按照提示输入相关信息,申请把自己的修改合入主仓库。
(完)
【开发手记】泛化MindSpore的HwcToChw算子,使其支持多通道输入相关推荐
- MindSpore GPU异构算子全流程开发指导
Tips ① 此文档详细介绍了MindSpore GPU异构算子开发流程,与官方文档相比本文档更加侧重于开发文件的解读以及常用开发方法的讲解.同时本文档用词相对简单,主要帮助大家了解GPU算子开发需要 ...
- MindSpore框架TBE算子开发全流程
本文为MindSpore框架TBE算子开发全流程的图文案例. 视频案例请移步MindsSpore框架TBE算子开发全流程 MindSpore框架TBE算子开发全流程 一.工具介绍 1. ...
- MindSpore框架AICPU算子开发全流程
视频案例,可以查看哔哩哔哩MindSpore框架AICPU算子演示视频 一.MindSpore AI算子介绍 1.1 MindSpore框架介绍 MindSpore是华为公司推出的新一代深度学习框架, ...
- HoloLens开发手记-全息Hologram
全息 Hologram HoloLens使我们可以通过周边世界的光线和声音来创建全息场景和物体,使得它们像真实物体那样.全息场景能够响应你的凝视.手势和语音指令,同时还会和你周边世界的表面交互.借助全 ...
- 交通银行香港分行实施 Linux 前端系统的开发手记
交通银行香港分行实施 Linux 前端系统的开发手记 2004 年被称为是 Linux 应用推广的开端之年.剖开历史巨大的横断面,诸多的 Linux 应用项目如繁星,开始隐隐出现在巨大的苍穹下.它们中 ...
- 我的日记本开发手记(2)——配色
我们的这个社会绝大部分人都是外贸主义者,选择看起来更加美好的事物是人的天性,"好看的皮囊"显得十分重要.所以呢,我也不会违反人类的天性,首先要为软件设计一个好看的皮囊.虽然我的美工 ...
- 我的日记本开发手记(3)—— 布局
配色已搞定,现在进行页面布局.那什么是布局呢?布局就是将文字.图形.图片等版面构成元素合理.有秩序地安放在限定的空间内,使页面兼具易读性和美观性,让读者产生一种舒适愉悦感,从而产生继续读下去的念头,而 ...
- HoloLens开发手记 - HoloLens shell概述 HoloLens shell overview
使用HoloLens时,shell是由你周围的世界和来自系统的全息图像构成.我们将这种空间成为混合世界(mixed world). shell包含了一个可以让你将全息图像和应用放置在世界中的开始菜单( ...
- HoloLens开发手记-硬件细节 Hardware Detail
微软HoloLens是世界第一款完全无线缆的全息计算机.通过在新方式上赋予用户的全息体验,HoloLens重新定义了个人计算(Personal Computing).为了将3D全息图形固定到你周围的真 ...
最新文章
- 把共享库(SO)加载到指定的内存地址
- Springmvc整合mybatis
- 机器学习笔记(part1)--Frobenius范数与迹运算
- dev用不了_跟风喊AMD YES?很多生产力项目,你必须用IU
- 【BZOJ3616】War,KD树+bitset压位
- Scala基础之变量和数据类型
- 怎么解决tomcat端口占用问题?
- 实验4	C++程序的结构(4学时)
- c#执行cmd命令并获取返回结果字符串
- 笔记本使用Nsight注意事项
- SOLIDWORKS软件二十四年来的进化发展史
- iPhone5s的App Store不能下载应用的解决方案
- 计算机里什么是目录,c盘perflogs是什么文件夹_电脑中perflogs文件夹能删除吗-win7之家...
- Python+matplotlib绘制极坐标柱状图(南丁格尔玫瑰图)
- 傲梅轻松克隆系统盘备份
- 淘宝店铺如何装修呢?
- 浅谈大数据服务平台架构与实践
- 计算机的基本键盘知识,知识:计算机键盘上每个键的功能_计算机的基本知识_IT /计算机_信息...
- 鸿蒙系统 github,鸿蒙2.0系统github源码版
- 从后台得到webshell