- 博客(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 9133
原创 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 49746
原创 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 1888
原创 Faster RCNN AnchorTargetLayer ProposalLayer ProposalTargetLayer详细对比
Faster RCNN中三个比较重要的层,其作用位置、功能详细对比如下。三种层的出现顺序依次为AnchorTargetLayer、ProposalLayer、ProposalTargetLayer: Alt trainging End2End trainging 输入框个数 输出框个数 AnchorTargetLayer train train ...
2020-03-08 17:45:25 508
原创 Faster RCNN近似端到端法详解
有了交替训练法的基础,近似端到端的训练方法就非常好理解了。相比于交替训练法,端到端训练主要有两点不一样:1)网络结构:RPN的输出个数:此处的输出个数不是指损失函数,而是指RPN的输出不仅送入AnchorTargetLayer层计算损失,还送入ProposalLayer生成RoI。在交替训练法中,RPN的训练网络到损失函数部分就已经结束了。但在端到端训练中,RPN的输出还送入Propo...
2020-03-08 12:47:39 1530
原创 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 1750
原创 Faster RCNN交替训练法详解
对Faster RCNN的详解类文章实在是数都数不过来,这些详解类的文章大多是从网络结构角度出发,对于Faster RCNN的训练流程介绍的比较少。从我个人的经历来看,感觉单纯的理解网络结构对Faster RCNN理解的还不够透彻,尤其是生成有效anchor这一块。因此本文从Faster RCNN的训练流程这个角度出发,对Faster RCNN进行详解,重点对anchor相关的操作进行细致分支。...
2020-03-01 19:22:33 2432
原创 opencv 图片旋转截断问题解决方法
在使用opencv对图片进行旋转缩放的过程中会出现原图截断的问题,这个问题其实可以直接通过设置参数解决。一般使用opencv对图片进行旋转缩放的流程是首先调用“getRotationMatrix2D”获得仿射变换矩阵,然后调用“warpAffine”对图片进行变换。其中“warpAffine”有一个参数可以用来控制变换后的图片大小,但变换后的图片大小如何获得呢?一个可行的方法是我们知道图片...
2020-03-01 13:07:51 2089
原创 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 1995
原创 对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 357
原创 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 3645
原创 图片仿射变换原理与实现
图像仿射变换共有“旋转”、“平移”、“错切(shear)”、“缩放”、“翻转”5种。本文结合keras-retinanet的实现进行分析。之所以采用keras-retinanet进行分析,是因为该实现较为典型,比较容易理解。keras-retinanet官方地址:https://github.com/fizyr/keras-retinanet.git以上五种仿射变换位于utils/tran...
2019-10-14 22:31:47 1600
原创 卷积神经网络相关内容总结
1)ResNet(1)Deeper Bottleneck Architecturesbottleneck架构设计的目的就在于减少参数数量,进而缩短训练时间。注意bottleneck只在resnet50、resnet101、resnet152中使用,resnet18与resnet34仍使用两层3*3卷积堆叠的设计。(2)对于channel不同的卷积层之间,使用步长为2的卷积操作。反之直接...
2019-02-16 22:17:11 671
原创 对于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 8171 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 642
原创 记一次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 441
原创 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 300
原创 exit系统调用源码剖析
之前简单分析过库函数exit的源码,在分析库函数exit的过程中发现exit在最后一句调用了"_exit(status)",而这个"_exit(status)"正是本文的主角系统调用exit。先来定位系统调用exit的位置,由于已经知道是系统调用,并且只有一个参数,所以可以在understand中直接搜索“SYSCALL_DEFINE1(exit”,得到源码的位置:linux-source-3...
2019-02-06 16:18:55 1822
原创 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 1147
原创 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 2481
原创 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 3789 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 3585
原创 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 1335 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 3903 3
原创 linux codeblocks darknet Debug极简教程
之前写过一篇linux codeblocks darknet Debug的教程,当时对Debug的使用方式还不太熟悉,经过一段时间的使用、配置后,对codeblocks的使用方式又有了新的认识,现给出一份极简的教程。1)新建项目。2)添加源代码,这一次我更加直接,将darknet中的代码全部拷贝到了项目目录下。然后回到图形界面中右击“add file recursively”,选择好源文件...
2019-01-08 13:46:59 696 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 796
原创 caffe ssd 训练过程中出现nan问题解决
在训练ssd过程中出现nan的,解决方法:将学习率调低即可。但需要注意一点,需要删除models/VGGNet/路径下的临时文件,不然会从中断点继续执行。
2018-12-20 17:49:10 1852 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 560
原创 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 389
原创 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 879 2
原创 Linux codeblocks darknet调试方法
使用GDB对darknet进行调试过于复杂,考虑使用codeblocks以图形化界面对darknet进行调试。现给出编译配置方法。1)编译*.cu文件由于codeblocks无法使用多种编译器进行编译(或许可以,但本人不会),因此需要先对*.cu文件进行编译,生成*.o文件。这里编译*.cu的方法是使用darknet代码中给出的makefile中的命令。我使用的方法更为直接,直接执行dar...
2018-11-09 15:32:40 1223
原创 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 1496
原创 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 1239 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 861
原创 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 713 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 1899 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 903 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 3041
原创 Android studio虚拟器从入坑到无法脱坑
安装好Android studio好后,想着直接运行起来,感受一下,结果上来就报了个错,说是没有安装intelhaxm(万恶之源啊),无法启动虚拟机。还好安装包里自带intelhaxm,ide没经过我的允许自己就开始安装,安装好后弹出来了一个windows无法验证数字签名,由于第一次用win10,不知道一旦报了这个错就意味着安装失败(另一个原因是当前电脑也没有联网,也许联网了就能自动更新数字签
2017-07-14 22:47:21 950
数据集中模糊的目标应该如何标注
2018-11-15
TA创建的收藏夹 TA关注的收藏夹
TA关注的人