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

相关文章

SysMain服务可以关吗? 解决SysMain服务导致的高CPU使用率问题

《SysMain服务可以关吗?解决SysMain服务导致的高CPU使用率问题》SysMain服务是超级预读取,该服务会记录您打开应用程序的模式,并预先将它们加载到内存中以节省时间,但它可能占用大量... 在使用电脑的过程中,CPU使用率居高不下是许多用户都遇到过的问题,其中名为SysMain的服务往往是罪魁

MySQL中优化CPU使用的详细指南

《MySQL中优化CPU使用的详细指南》优化MySQL的CPU使用可以显著提高数据库的性能和响应时间,本文为大家整理了一些优化CPU使用的方法,大家可以根据需要进行选择... 目录一、优化查询和索引1.1 优化查询语句1.2 创建和优化索引1.3 避免全表扫描二、调整mysql配置参数2.1 调整线程数2.

C语言自定义类型之联合和枚举解读

《C语言自定义类型之联合和枚举解读》联合体共享内存,大小由最大成员决定,遵循对齐规则;枚举类型列举可能值,提升可读性和类型安全性,两者在C语言中用于优化内存和程序效率... 目录一、联合体1.1 联合体类型的声明1.2 联合体的特点1.2.1 特点11.2.2 特点21.2.3 特点31.3 联合体的大小1

Python标准库datetime模块日期和时间数据类型解读

《Python标准库datetime模块日期和时间数据类型解读》文章介绍Python中datetime模块的date、time、datetime类,用于处理日期、时间及日期时间结合体,通过属性获取时间... 目录Datetime常用类日期date类型使用时间 time 类型使用日期和时间的结合体–日期时间(

C语言中%zu的用法解读

《C语言中%zu的用法解读》size_t是无符号整数类型,用于表示对象大小或内存操作结果,%zu是C99标准中专为size_t设计的printf占位符,避免因类型不匹配导致错误,使用%u或%d可能引发... 目录size_t 类型与 %zu 占位符%zu 的用途替代占位符的风险兼容性说明其他相关占位符验证示

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

解读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、统一