自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(111)
  • 资源 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 opencv图片去畸变相关方法总结

opencv中共提供三种去畸变方法,分别为:cv2.undistortcv2.omnidir.undistortImagecv2.fisheye.undistortImage第一种方法是opencv-python中自带的方法,后两种是opencv-contrib-python中的方法,因此还需要安装opencv-contrib-python包。第一种方法适用于普通相机,第二种方法适用于全向摄像机,第三种方法适用于鱼眼相机。cv2.undistort方法使用的基本流程如下:1)调用c

2022-02-12 17:43:59 8611

原创 torch.device(‘cuda‘) 与 torch.device(‘cuda:0‘) 的区别简析

torch.device('cuda') 与 torch.device('cuda:0')在进行计算时,对于单卡计算机而言,没有任何区别,都是唯一的那一张GPU。示例如下:>>> a = torch.device('cuda')>>> b = torch.device('cuda:0')>>> tensor_a = torch.ones(1, device=a)>>> tensor_atensor([1.], devi

2021-05-11 07:36:00 46953

原创 pytorch 梯度计算相关内容总结

一、梯度计算准备工作调用backward()函数前,叶子/非叶子节点的grad属性均为none,无论是否设置了requires_grad=True(叶子节点),或者调用了retain_grad()(非叶子节点),非叶子节点不能设置requires_grad=True,否则会报错:“RuntimeError: you can only change requires_grad flags of leaf variables.”)。叶子/非叶子节点定义:1.叶子节点:所有requires_gra

2021-04-24 13:26:18 1710

原创 Faster RCNN AnchorTargetLayer ProposalLayer ProposalTargetLayer详细对比

Faster RCNN中三个比较重要的层,其作用位置、功能详细对比如下。三种层的出现顺序依次为AnchorTargetLayer、ProposalLayer、ProposalTargetLayer: Alt trainging End2End trainging 输入框个数 输出框个数 AnchorTargetLayer train train ...

2020-03-08 17:45:25 488

原创 Faster RCNN近似端到端法详解

有了交替训练法的基础,近似端到端的训练方法就非常好理解了。相比于交替训练法,端到端训练主要有两点不一样:1)网络结构:RPN的输出个数:此处的输出个数不是指损失函数,而是指RPN的输出不仅送入AnchorTargetLayer层计算损失,还送入ProposalLayer生成RoI。在交替训练法中,RPN的训练网络到损失函数部分就已经结束了。但在端到端训练中,RPN的输出还送入Propo...

2020-03-08 12:47:39 1481

原创 keras.utils.Sequence使用注意事项

1)在实现自己的DataLoader过程中一般都是继承自keras.utils.Sequence,继承该类必须要实现__len__与__getitem__两个函数。2)在调用fit_generator进行训练时,如果设置了step_per_epoch参数,则每个epoch训练step_per_epoch个step,每个step有batch_size数据,因此每个epoch共训练step_per...

2020-03-07 12:14:57 1715

原创 Faster RCNN交替训练法详解

对Faster RCNN的详解类文章实在是数都数不过来,这些详解类的文章大多是从网络结构角度出发,对于Faster RCNN的训练流程介绍的比较少。从我个人的经历来看,感觉单纯的理解网络结构对Faster RCNN理解的还不够透彻,尤其是生成有效anchor这一块。因此本文从Faster RCNN的训练流程这个角度出发,对Faster RCNN进行详解,重点对anchor相关的操作进行细致分支。...

2020-03-01 19:22:33 2260

原创 opencv 图片旋转截断问题解决方法

在使用opencv对图片进行旋转缩放的过程中会出现原图截断的问题,这个问题其实可以直接通过设置参数解决。一般使用opencv对图片进行旋转缩放的流程是首先调用“getRotationMatrix2D”获得仿射变换矩阵,然后调用“warpAffine”对图片进行变换。其中“warpAffine”有一个参数可以用来控制变换后的图片大小,但变换后的图片大小如何获得呢?一个可行的方法是我们知道图片...

2020-03-01 13:07:51 1885

原创 TypeError: Layout of the output array image is incompatible 问题解决

本周在使用findContours的过程中遇到了以下问题:TypeError: Layout of the output array image is incompatible with cv::Mat (step[ndims-1] != elemsize or step[1] != elemsize*nchannels)感谢这篇文章:https://www.jianshu.com/p/c...

2020-02-29 19:10:44 1937

原创 对numpy axis(轴)的理解

之前对numpy函数中axis参数所指向的数据一直无法完全理解,但是接触过跨度的概念之后,对axis参数所指向的数据才有所理解。以numpy.sum函数为例,初始化一个维度为2*3*4维的全一矩阵,代码如下:arr = np.ones((2, 3, 4))结果如下:array([[[1., 1., 1., 1.], [1., 1., 1., 1.], ...

2019-12-17 00:15:10 342

原创 sourcetree本地分支无法显示问题解决方法

在sourcetree使用过程中出现推送对话框里面本地、远程分支什么都不显示的问题。https://community.atlassian.com/t5/Sourcetree-questions/Sourcetree-Push-dialog-does-not-show-any-branches/qaq-p/1172273图片请参考上述链接中的描述,解决方法也是参考以上链接中的解决方法。升级...

2019-11-24 22:08:03 3577

原创 图片仿射变换原理与实现

图像仿射变换共有“旋转”、“平移”、“错切(shear)”、“缩放”、“翻转”5种。本文结合keras-retinanet的实现进行分析。之所以采用keras-retinanet进行分析,是因为该实现较为典型,比较容易理解。keras-retinanet官方地址:https://github.com/fizyr/keras-retinanet.git以上五种仿射变换位于utils/tran...

2019-10-14 22:31:47 1535

原创 卷积神经网络相关内容总结

1)ResNet(1)Deeper Bottleneck Architecturesbottleneck架构设计的目的就在于减少参数数量,进而缩短训练时间。注意bottleneck只在resnet50、resnet101、resnet152中使用,resnet18与resnet34仍使用两层3*3卷积堆叠的设计。(2)对于channel不同的卷积层之间,使用步长为2的卷积操作。反之直接...

2019-02-16 22:17:11 658

原创 对于ssd对小目标检测效果的思考

对于ssd模型对于小目标检测效果不好的问题,我认为可以结合.prototxt文件进行分析,以conv4_3_norm_mbox_priorbox为例: prior_box_param { min_size: 30.0 max_size: 60.0 aspect_ratio: 2 flip: true clip: false variance:...

2019-02-16 10:05:23 8107 2

原创 darknet源码剖析(六) 模型训练初探

终于到了最核心的部分了,模型训练的过程由两个部分组成,分别是正向传播与反向传播的过程。首先来看模型的正向传播过程,还是根据函数的调用过程。(1)train_network(network.c) int batch = net->batch; int n = d.X.rows / batch;根据yolov1的配置,batch的值为8,d.X.rows的值为64...

2019-02-11 19:22:31 625

原创 记一次git排故过程

1)今天在git clone过程中首先遇到如下问题:RPC failed; curl 56 SSL read: error:00000000:lib(0):func(0):reason(0), errno 10054核心内容就是errno 10054,参考这个链接给出的解决方法。使用如下命令解决:git config --add core.compression -1结果又...

2019-02-10 21:42:54 409

原创 pytorch学习

1)pytorch tensor初始化方法:(1)使用empty构造空tensorx = torch.empty(5,3)(2)使用rand构造均匀分布的tensor,使用randn构造标准分布的tensorx = torch.rand(5,3)(3)使用zeros构造全0 tensor,ones构造全1 tensorx = torch.zeros((5, 3), d...

2019-02-10 09:39:38 256

原创 exit系统调用源码剖析

之前简单分析过库函数exit的源码,在分析库函数exit的过程中发现exit在最后一句调用了"_exit(status)",而这个"_exit(status)"正是本文的主角系统调用exit。先来定位系统调用exit的位置,由于已经知道是系统调用,并且只有一个参数,所以可以在understand中直接搜索“SYSCALL_DEFINE1(exit”,得到源码的位置:linux-source-3...

2019-02-06 16:18:55 1719

原创 Focal loss分析

1)Class imbalance问题的提出Focal loss的提出就是问了解决Class imbalance问题,在两阶段目标检测算法中,这一问题是通过两阶段级联与启发式采样策略解决的(Class imbalance is addressed in R-CNN-like detectors by a two-stage cascade and sampling heuristics)。在p...

2019-02-06 15:24:02 1116

原创 darknet源码剖析(五)box_iou详细分析

在darknet中iou的计算是调用box_iou函数(box.c文件)float box_iou(box a, box b){ return box_intersection(a, b)/box_union(a, b);}iou的计算公式比较简单,交集面积/并集面积。先来看并集面积计算方式:float box_union(box a, box b){ f...

2019-02-05 16:25:49 2334

原创 darknet源码剖析(四)do_nms_sort详解

在yolo模型inference执行完成后,会产生很多的冗余结果,此时就需要调用nms对冗余结果进行去重。nms函数在darknet框架中是do_nms_sort函数,位于box.c文件中,现对do_nms_sort过程做详细分析: for(i = 0; i <= k; ++i){ if(dets[i].objectness == 0){ ...

2019-02-05 11:46:24 3766 1

原创 darknet源码剖析(三) load_data_detection详细分析

load_data_detection是数据加载过程的最后一步。下面就来对他进行详细分析。首先是空间分配过程: d.X.rows = n; d.X.vals = calloc(d.X.rows, sizeof(float*)); d.X.cols = h*w*3; d.y = make_matrix(n, 5*boxes);d是data类型数据, da...

2019-01-21 19:12:50 3538

原创 darknet源码剖析(二) 数据加载

在上一篇文章中,我们分析了darknet的网络结构与初始化过程,在源码中是load_network函数。接下来继续分析数据加载过程。数据加载过程中涉及的函数有load_data、load_threads、load_data_in_thread、load_thread。数据加载过程如下图所示。(1)load_data中首先启动一个线程调用load_threads,load_threads...

2019-01-19 18:31:30 1293 6

原创 darknet源码剖析(一) network初始化

network是darknet的核心组件,本文以yolov1为例对network的结构进行分析,并对network相关操作函数进行分析。darknet的网络结构使用network结构体进行保存,network的构建过程主要包括以下几个函数:load_network(src/networks.c)->parse_network_cfg(src/parser.c)->make_ne...

2019-01-18 21:04:31 3845 3

原创 linux codeblocks darknet Debug极简教程

之前写过一篇linux codeblocks darknet Debug的教程,当时对Debug的使用方式还不太熟悉,经过一段时间的使用、配置后,对codeblocks的使用方式又有了新的认识,现给出一份极简的教程。1)新建项目。2)添加源代码,这一次我更加直接,将darknet中的代码全部拷贝到了项目目录下。然后回到图形界面中右击“add file recursively”,选择好源文件...

2019-01-08 13:46:59 672 3

原创 wxGLCanvas error: invalid use of incomplete type 'class wxGLCanvas'问题解决

今天在使用wxWidgets过程中遇到了这一奇怪的问题,明明包含了头文件,同时头文件也包括该class的声明,为什么报了这一错误,通过内容分析基本可以确定wxGLCanvas声明不正确,但是头文件的内容会声明不正确?仔细分析了一下头文件发现,确实是wxGLCanvas没有包含,细节就在:glcanvas.h中。#if wxUSE_GLCANVAS这一句看似没有功能,其实才是核心所在。...

2018-12-29 14:47:59 755

原创 caffe ssd 训练过程中出现nan问题解决

在训练ssd过程中出现nan的,解决方法:将学习率调低即可。但需要注意一点,需要删除models/VGGNet/路径下的临时文件,不然会从中断点继续执行。

2018-12-20 17:49:10 1810 5

原创 caffe 训练自己的数据集

修改ssd_pascal.py即可。82行:train_data路径; 84行:test_data路径; 86行:resize_width,输入网络的图片宽度87行:resize_height,输入网络的图片高度232行:base_lr,设置基础学习率,实际值是base_lr×25237-246行:model_name、save_dir、snapshot_dir、job_dir、o...

2018-12-20 17:39:59 544

原创 caffe ssd制作数据集方法(2)

通过上一篇文章的分析,我们已经基本了解了VOC lmdb文件的格式,现在可以尝试将不同的标注格式,转为VOC格式。此处安利一个我自己写的小工具,支持yolo格式转化为voc格式,同时支持lmdb文件的可视化。此处需要注意的是voc格式的标注一定不能超过图片大小。否则在运行create_data.sh时会报错。https://github.com/Wang-zipeng/Deep_learn...

2018-12-20 13:50:54 376

原创 caffe ssd制作数据集方法(1)

ssd的官网中给出的数据集制作方法过于简单,没有细节,因此对这一制作方法进行研究。官网VOC数据集制作教程第一步:# Create the trainval.txt, test.txt, and test_name_size.txt in data/VOC0712/./data/VOC0712/create_list.sh通过注释可以了解这一步的功能是获取训练集、测试集的图片存放地...

2018-12-17 20:01:58 856 2

原创 Linux codeblocks darknet调试方法

使用GDB对darknet进行调试过于复杂,考虑使用codeblocks以图形化界面对darknet进行调试。现给出编译配置方法。1)编译*.cu文件由于codeblocks无法使用多种编译器进行编译(或许可以,但本人不会),因此需要先对*.cu文件进行编译,生成*.o文件。这里编译*.cu的方法是使用darknet代码中给出的makefile中的命令。我使用的方法更为直接,直接执行dar...

2018-11-09 15:32:40 1204

原创 darknet源码剖析(七)

至此load_data_detection的所有功能就都分析完了,总结一下就是获取16幅图片的地址,进行随机变换,并读取对应图片的标注。再次回到load_threads函数中,load_threads共创建64个进程,每个进程加载16幅图像数据。 for(i = 0; i < args.threads; ++i){ pthread_join(threads[i...

2018-11-01 15:58:18 1473

原创 darknet源码剖析(六)

继续分析load_data_detection,进入fill_truth_detection函数。fill_truth_detection的作用是读取图片对应的标注信息。首先进入find_replace函数。void find_replace(char *str, char *orig, char *rep, char *output){ char buffer[4096] =...

2018-10-31 20:05:17 1222 1

原创 darknet源码剖析(五)

继续分析load_data_detection int i; data d = {0}; d.shallow = 0; d.X.rows = n; d.X.vals = calloc(d.X.rows, sizeof(float*)); d.X.cols = h*w*3; d.y = make_matrix(n, 5*boxes);...

2018-10-31 17:59:06 844

原创 darknet源码剖析(四)

pthread_t load_thread = load_data(args);load_data位于src/data.c中pthread_t load_data(load_args args){ pthread_t thread; struct load_args *ptr = calloc(1, sizeof(struct load_args)); *pt...

2018-10-30 19:50:53 693 1

原创 darknet源码剖析(三)

进入train_detector函数。list *options = read_data_cfg(datacfg);list的定义位于darknet.h,为链表。read_data_cfg位于option_list.c中。read_data_cfg的作用在于将数据集配置转化为链表。 char *train_images = option_find_str(options,...

2018-10-30 17:38:38 1884 1

原创 darknet源码剖析(二)

进入run_detector函数:char *prefix = find_char_arg(argc, argv, "-prefix", 0);其中find_char_arg位于src/utils.c文件中,char *find_char_arg(int argc, char **argv, char *arg, char *def){ int i; for(i ...

2018-10-30 14:17:22 883 2

原创 darknet源码剖析(一)

darknet编译较为简单,在github上下载代码后直接make即可。注意更改makefile文件中的相关选项。GPU=1CUDNN=1OPENCV=0OPENMP=0DEBUG=1编译完成后即可开始使用。根据yolov3的训练与测试过程,对darknet进行解析。darknet使用c语言编写,main函数位于examples/darknet.c文件中。训练yolov3...

2018-10-30 13:38:09 2991

原创 Android studio虚拟器从入坑到无法脱坑

安装好Android studio好后,想着直接运行起来,感受一下,结果上来就报了个错,说是没有安装intelhaxm(万恶之源啊),无法启动虚拟机。还好安装包里自带intelhaxm,ide没经过我的允许自己就开始安装,安装好后弹出来了一个windows无法验证数字签名,由于第一次用win10,不知道一旦报了这个错就意味着安装失败(另一个原因是当前电脑也没有联网,也许联网了就能自动更新数字签

2017-07-14 22:47:21 915

原创 Java构造函数调用顺序问题

java构造代码调用顺序研究。

2017-06-07 19:18:15 2993

共享库装载时重定位相关资料

针对共享库装载时重定位的详细分析,与《程序员自我修养》有关章节相比,本文的分析更加详细,更便于理解。

2016-03-01

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除