darknet源码解读-im2col_cpu

2023-11-07 05:59
文章标签 源码 解读 cpu darknet im2col

本文主要是介绍darknet源码解读-im2col_cpu,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  关于im2col_cpu网上已经有不少优秀的解读博文,我不再复述,可以参考以下几篇文章:

https://blog.csdn.net/mrhiuser/article/details/52672824

https://blog.csdn.net/dwyane12138/article/details/78449898

我这里只是将这段代码单独摘出来做了一个小测试,给定一个输入,看看输出究竟是什么,以佐证自己的理解。代码主要参数如下:

输入:3通道3x3矩阵,使用一维数组表示,如图1。

卷积核尺寸:2x2

填充:0

步长:1

                                                                   图1:输入矩阵的一维数组表示

示例代码:

#include <stdio.h>
#include <stdlib.h>int conv_out_height(h, pad, size, stride) {return (h + 2*pad - size) / stride + 1;
}int conv_out_width(w, pad, size, stride) {return (w + 2*pad - size) / stride + 1;
}int im2col_get_pixel(int *im, int height, int width, int channels,int row, int col, int channel, int pad)
{row -= pad;col -= pad;if (row < 0 || col < 0 ||row >= height || col >= width) return 0;return im[col + width*(row + height*channel)];
}//From Berkeley Vision's Caffe!
//https://github.com/BVLC/caffe/blob/master/LICENSE
void im2col_cpu(int* data_im,int channels,  int height,  int width,int ksize,  int stride, int pad, int* data_col) 
{int c,h,w;int height_col = (height + 2*pad - ksize) / stride + 1;int width_col = (width + 2*pad - ksize) / stride + 1;int channels_col = channels * ksize * ksize;for (c = 0; c < channels_col; ++c) { //卷积核参数个数int w_offset = c % ksize;int h_offset = (c / ksize) % ksize;int c_im = c / ksize / ksize;for (h = 0; h < height_col; ++h) {for (w = 0; w < width_col; ++w) {int im_row = h_offset + h * stride;int im_col = w_offset + w * stride;int col_index = (c * height_col + h) * width_col + w;data_col[col_index] = im2col_get_pixel(data_im, height, width, channels,im_row, im_col, c_im, pad);}}}
}int main(int argc, char* argv[]) {int *data_im=NULL;int *data_col=NULL;int channels=3,height=3,width=3;int ksize=2,stride=1,pad=0;int out_w,out_h;int workspace_size;int inputs = height * width * channels;data_im = (int*)malloc(inputs * sizeof(int));if (!data_im) {printf("malloc error\n");exit(EXIT_FAILURE);}out_w = conv_out_width(width, pad, ksize, stride);out_h = conv_out_width(height, pad, ksize, stride);workspace_size = out_h * out_w * ksize * ksize * channels;data_col = (int*)malloc(workspace_size * sizeof(int));if (!data_col) {printf("malloc error\n");exit(EXIT_FAILURE);}//init imagefor (int i=0; i<inputs; i++) data_im[i] = i;im2col_cpu(data_im, channels, height, width, ksize, stride, pad, data_col);printf("data_im:\n");for (int i=0; i<inputs; i++) {printf("%-3d", data_im[i]);//if( (i+1) % 4 == 0) printf("\n");}printf("\ndata_col:\n");for (int i=0; i<workspace_size; i++) {printf("%-3d", data_col[i]);//if( (i+1) % 4 == 0) printf("\n");}printf("\n");free(data_im);free(data_col);exit(EXIT_SUCCESS);
}

运行程序,观察结果:

 

这篇关于darknet源码解读-im2col_cpu的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/361697

相关文章

解读GC日志中的各项指标用法

《解读GC日志中的各项指标用法》:本文主要介绍GC日志中的各项指标用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基础 GC 日志格式(以 G1 为例)1. Minor GC 日志2. Full GC 日志二、关键指标解析1. GC 类型与触发原因2. 堆

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

MySQL之InnoDB存储页的独立表空间解读

《MySQL之InnoDB存储页的独立表空间解读》:本文主要介绍MySQL之InnoDB存储页的独立表空间,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、独立表空间【1】表空间大小【2】区【3】组【4】段【5】区的类型【6】XDES Entry区结构【

MySQL主从复制与读写分离的用法解读

《MySQL主从复制与读写分离的用法解读》:本文主要介绍MySQL主从复制与读写分离的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、主从复制mysql主从复制原理实验案例二、读写分离实验案例安装并配置mycat 软件设置mycat读写分离验证mycat读

Python的端到端测试框架SeleniumBase使用解读

《Python的端到端测试框架SeleniumBase使用解读》:本文主要介绍Python的端到端测试框架SeleniumBase使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录SeleniumBase详细介绍及用法指南什么是 SeleniumBase?SeleniumBase

Nacos注册中心和配置中心的底层原理全面解读

《Nacos注册中心和配置中心的底层原理全面解读》:本文主要介绍Nacos注册中心和配置中心的底层原理的全面解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录临时实例和永久实例为什么 Nacos 要将服务实例分为临时实例和永久实例?1.x 版本和2.x版本的区别

Java进程CPU使用率过高排查步骤详细讲解

《Java进程CPU使用率过高排查步骤详细讲解》:本文主要介绍Java进程CPU使用率过高排查的相关资料,针对Java进程CPU使用率高的问题,我们可以遵循以下步骤进行排查和优化,文中通过代码介绍... 目录前言一、初步定位问题1.1 确认进程状态1.2 确定Java进程ID1.3 快速生成线程堆栈二、分析

C++类和对象之默认成员函数的使用解读

《C++类和对象之默认成员函数的使用解读》:本文主要介绍C++类和对象之默认成员函数的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、默认成员函数有哪些二、各默认成员函数详解默认构造函数析构函数拷贝构造函数拷贝赋值运算符三、默认成员函数的注意事项总结一

conda安装GPU版pytorch默认却是cpu版本

《conda安装GPU版pytorch默认却是cpu版本》本文主要介绍了遇到Conda安装PyTorchGPU版本却默认安装CPU的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、问题描述二、网上解决方案罗列【此节为反面方案罗列!!!】三、发现的根本原因[独家]3.1 p

MySQL的ALTER TABLE命令的使用解读

《MySQL的ALTERTABLE命令的使用解读》:本文主要介绍MySQL的ALTERTABLE命令的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、查看所建表的编China编程码格式2、修改表的编码格式3、修改列队数据类型4、添加列5、修改列的位置5.1、把列