- 博客(30)
- 资源 (26)
- 收藏
- 关注

原创 用opencv的dnn模块做yolov5目标检测
最近在微信公众号里看到多篇讲解yolov5在openvino部署做目标检测文章,但是没看到过用opencv的dnn模块做yolov5目标检测的。于是,我就想着编写一套用opencv的dnn模块做yolov5目标检测的程序。在编写这套程序时,遇到的bug和解决办法,在这篇文章里讲述一下。在yolov5之前的yolov3和yolov4的官方代码都是基于darknet框架的实现的,因此opencv的dnn模块做目标检测时,读取的是.cfg和.weight文件,那时候编写程序很顺畅,没有遇到bug。但是yolo
2021-01-17 13:23:29
79435
300

原创 一种适合工业级应用的基于深度学习的实时人脸检测与识别算法的C++实现
在此之前我写过一篇文章比较了最近一年内的基于深度学习的人脸检测算法的精度和速度,在稀疏人脸场景里,libfacedetect是最佳选择。于是我就用C++编写了一套人脸检测与识别的程序,在这套程序中,人脸检测模块使用的是libfacedetect,这个模块了还包含了人脸对齐的功能,人脸特征向量提取模块使用的是arcface,此外我还提供了人脸关键点检测模块PFLD,它能输出98个人脸关键点。程序设计采用了面向对象的思想,把每个模块都用一个类包装起来。整个程序的运行只依赖opencv库,使用dnn模块做深度学习
2020-11-02 11:13:01
1540
3

原创 4种YOLO目标检测的C++和Python两种版本实现
2020年,新出了几个新版本的YOLO目标检测,在微信朋友圈里转发的最多的有YOLOv4,Yolo-Fastest,YOLObile以及百度提出的PP-YOLO。在此之前,我在github是哪个已经发布过YOLOv4,Yolo-Fastest,YOLObile这三种YOLO基于OpenCV做目标检测的程序,但是这些程序是用Python编写的。接下来,我就使用C++编写一套基于OpenCV的YOLO目标检测,这个程序里包含了经典的YOLOv3,YOLOv4,Yolo-Fastest和YOLObile这4种YO
2020-09-28 15:49:52
13034
58

原创 10种轻量级人脸检测算法的比拼
最近在微信公众号里看到轻量级人脸检测算法大盘点的文章,里面还提供了github源码地址,我就把它们逐个下载到本地win10-cpu机器上,调试通过运行。去年在github下载过一个包含6种人脸检测的程序(地址是 https://github.com/cs-giung/face-detection-pytorch),分别是pyramidbox,dsfd,s3fd,tinyface,facebox,mtcnn,但是这些算法大多是重量级的网络模型,它在一幅图片上的人脸检测结果和运行耗时统计直方图如下可
2020-09-25 16:57:41
18498
39

原创 极简主义OCR
用opencv的dnn模块做OCR,实现对图片中的文本检测与识别,其中文本检测用的是EAST,文本识别用的是CRNN。程序的运行不依赖任何深度学习框架pytorch,tensorflow等等的,只依赖opencv,numpy,math和argparse这4个python库,做到极简主义OCR。下载源码的地址是https://github.com/hpc203/ocr-dnn在运行程序前,按照README.md里的提供的模型文件地址下载模型文件后,就可以运行程序了。在编写这个程序时,我一直有个疑惑,.
2020-09-23 16:30:11
1437
3

原创 用opencv的dnn模块实现Yolo-Fastest的目标检测
最近在微信朋友圈里疯传的Yolo-Fastest(github代码地址是https://github.com/dog-qiuqiu/Yolo-Fastest),据说模型非常小,且运行速度快,而且,这个YOLO-Fastest算法满足所有平台的需要。不论是PyTorch,还是Tensorflow,又或者是Keras和Caffe,可以说是全平台通用。但是我没有看到用opencv的dnn模块做前向推理的,于是我就想编写一个程序用opencv的dnn模块做Yolo-Fastest的前向推理。而在此之前,就已经有用o
2020-09-18 18:36:05
7792
13
原创 pytorch和numpy在meshgrid函数的一些差异
这说明在numpy库里的meshgrid函数,y不是在x前面的。交换一下x,y的顺序,也就是把上面的make_anchors_numpy函数注释的那一行 sx, sy = np.meshgrid(x, y) 打开,重新运行程序,这时候打印的差异值是0。在YOLO系列的目标检测模型的后处理,有一个生成meshgrid网格的操作,这时是调用torch.meshgrid函数实现的,不过在numpy里也有meshgrid函数。运行这个程序,最后打印的差异值是26.6625。
2023-05-13 22:33:20
297
原创 pytorch计算余弦相似度需要注意的一个问题
最近在知乎上看到一篇文章,里面讲到在pytorch里自带有计算余弦相似度的函数F.cosine_similarity(或者torch.cosine_similarity函数)。而在此之前,我计算两个张量的余弦相似度的做法是把张量转换到numpy,然后用scipy库(或者sklearn库)里提供的计算余弦相似度函数来做计算的。不过,在今天我发现使用F.cosine_similarity函数计算两个张量的余弦相似度的输出值与把张量转换到numpy然后用scipy库计算的输出值不一样。示例代码如下:impo
2021-05-26 10:57:38
10020
6
原创 模型部署翻车记:pytorch转onnx踩坑实录
本文原创首发于极市平台公众号,如需转载请私信作者在深度学习模型部署时,从pytorch转换onnx的过程中,踩了一些坑。本文总结了这些踩坑记录,希望可以帮助其他人。首先,简单说明一下pytorch转onnx的意义。在pytorch训练出一个深度学习模型后,需要在TensorRT或者openvino部署,这时需要先把Pytorch模型转换到onnx模型之后再做其它转换。因此,在使用pytorch训练深度学习模型完成后,在TensorRT或者openvino或者opencv和onnxruntime部署时
2021-04-08 09:29:50
5180
11
原创 使用opencv部署yolact实例分割
本文原创首发于极市平台公众号,如需转载请私信作者YOLACT,全称为:You Only Look At CoefficienTs,从标题可以看出这个模型的名称有些致敬YOLO的意思。YOLACT是2019年ICCV会议论文,它是在现有的一阶段(one-stage)目标检测模型里添加掩模分支。而经典的mask-rcnn是两阶段实例分割模型是在faster-rcnn(两阶段目标检测模型)添加掩模分支,但是在YOLACT里没有feature roi pooling这个步骤。因而,YOLACT是一个单阶段实例分
2021-03-07 10:04:34
2485
25
原创 用opencv部署nanodet目标检测
本文原创首发于极市平台公众号,如需转载请私信作者2020年,在深度学习目标检测领域诞生了yolov4,yolov5和nanodet这些优秀的检测模型,有许多的微信公众号报道这些算法模型。深度学习目标检测方法可划分为 Anchor-base 和 Anchor-free 两大类,nanodet是一个速度超快和轻量级的移动端 Anchor-free 目标检测模型,并且它的精度不亚于yolo系列的。nanodet通过一些论文里的trick组合起来得到了一个兼顾精度、速度和体积的检测模型。作者用到的一些tri
2021-02-18 19:12:21
5286
24
原创 opencv的Mat结构里需要注意的细节
在使用opencv的dnn模块做深度学习时,经常会遇到一个疑惑。疑惑是这样的:当执行完outs = net.forward()之后,如果outs里有Mat的维数大于2,那么设断点调试的时候,可以看到rows和cols都等于-1,以目标检测为例,输出outs里包含box和score,断点调试查看out_score的信息如下:但是最后看程序运行的可视化结果,是没问题的。这个疑惑,在opencv源码里可以找到解释,在mat.hpp文件,第2559行至2561行,中间的注释里说:当矩阵的维数大于2时,row
2021-02-18 17:31:44
966
1
原创 python录制全屏和选择区域录屏
最近给客户演示程序运行结果,我就想到用Python写一个录屏程序,在网上能找到现成的源码,但是它的录屏是录制整个屏幕的。但是在屏幕桌面下方的任务栏工具栏里有些东西,不希望被录制到视频里,因此需要实现一个选择区域录屏,就像qq截图那样的。我编写的程序如下,在主函数的输入参数里有一个选项控制是全屏录制还是选择区域录制import cv2from PIL import ImageGrabimport numpy as npimport argparseimport timeglobal img
2021-02-04 18:39:16
1376
7
原创 yolov5.yaml文件转换到.py文件
在ultralytics官方的yolov5代码里,模型的构建都是定义在yaml文件里的,在yaml文件里,有两个重要参数:depth_multiple和width_multiple。其中depth_multiple控制网络的深度,width_multiple控制网络的宽度。这样做的好处是可以通过这两个参数控制网络的宽度和深度,实现不同大小不同复杂度的模型设计,但是这种写法缺点是不再能直接采用第三方工具例如netron进行网络模型可视化了,并且yaml文件不利于学习网络结构特性和网络里的层与层之间的连接关系。
2020-11-19 17:13:52
1875
4
原创 CenterFace人脸检测程序中的一个不为人知的bug
程序是用opencv的dnn模块加载CenterFace的onnx文件做人脸检测的,程序源码在github地址是https://github.com/hpc203/CenterFace-opencv-dnn-problem文件夹里有2幅图片,运行 python problem.py,其中problem.py的源码如下import cv2from centerface import CenterFaceif __name__ == '__main__': frame = cv2.im.
2020-09-24 17:22:47
590
3
原创 opencv和PIL读取图片的一个细节
在做深度学习目标检测和语义分割的训练时,会有读取图片这个模块流程,在读取图片时,有些人习惯使用opencv,有些人习惯使用PIL。在做语义分割时,需要读取图片和标签mask,而标签mask也是一幅图片,而在读取了标签mask后,会把它转成灰度图,图片中的像素值表示类别索引。然而用opencv和PIL读取图片时,是有差别的。看如下代码示例:import numpy as npfrom PIL import Imageimport cv2if __name__ == "__main__":
2020-07-25 16:32:55
632
1
原创 opencv图像翻转与数据增强的细节
在opencv中有多个图像翻转函数应用到SSD和yolov3中的数据增强模块里,例如左右翻转,上下翻转,水平垂直翻转。在opencv里最常用的图像翻转函数是cv2.flip,其中有一个参数flipCode=1表示水平翻转,flipCode=0表示垂直翻转,flipCode=-1表示水平垂直翻转,而在yolov3中的数据增强模块里(参见https://github.com/ultralytics/yolov3/blob/master/utils/datasets.py里的LoadImagesAndLabels
2020-05-27 11:48:22
1270
原创 opencv中的resize插值方式比较
在做深度学习yolov3目标检测训练时,通常需要对原始图片做resize,把图片的尺寸缩放416x416。然而,opencv提供的resize函数里有多种插值方式,最常见使用的是INTER_LINEAR(双线性插值)和INTER_NEAREST(最近邻插值)。在github上pytorch版本的yolov3的star数量最多的的是https://github.com/ultralytics/yol...
2020-02-27 11:25:42
2420
原创 github上的yolov3不同版本的区别
目前yolov3在工业界目标检测领域获得了广泛的应用,在github上有很多yolov3源码的资源。现在做深度学习使用pytorch最为方便,在github上pytorch版本的yolov3的star数量最多的的是https://github.com/ultralytics/yolov3和https://github.com/eriklindernoren/PyTorch-YOLOv3这两个。然而...
2019-12-27 18:14:18
4157
原创 Python中的字符串究竟是什么样的数据结构?
首先定义字符串 s = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'然后把字符串转换成列表,有两种方法,list(s)和[s],可是打印出转换后列表的结果并不一样,如下代码:s = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'print(s, type(s))a = list(s)print(a, type(a))a = [s]print(a, type...
2019-10-24 10:22:20
469
原创 python中使用enumerate遍历列表时需要注意的一个细节
在Python中,使用enumerate遍历列表是非常好的一种方式,它既能获得列表中的每个元素的索引,又能获得元素值,可谓一举两得,然而,在使用enumerate遍历列表,有时候会出现一些想不到的错误,举个例子,代码如下:f = [[i,i+1,i+2,i+3]for i in range(0,16,4)]print('初始化的:',f)for i,data in enumerate(f...
2019-06-20 10:46:38
1893
原创 在Python里的字符串、列表、元组、集合之间转换的一个不为人知的细节和bug
首先看如下代码:a = ['0234','abcd']seta = set(a)b = ['0234']setb = set(b)c = ('0234','abcd')setc = set(c)d = ('0234')setd = set(d)e= tuple(b)sete = set(e)print(type(a), ' , ', a,' , ',seta)...
2019-06-19 18:16:04
596
1
原创 pytorch中的nn.Bilinear的计算原理详解
我们都知道在pytorch中的nn.Linear表示线性变换,官方文档给出的数学计算公式是 y = xA^T + b,其中x是输入,A是权值,b是偏置,y是输出,卷积神经网络中的全连接层需要调用nn.Linear就可以实现。而在看pytorch的源码linear.py文件时可以看到里面有Bilinear的定义,起初看到这个名字,大家会以为它是实现对图像做放大的上采样插值,可是在pytorch中有n...
2019-05-23 15:27:39
19196
4
原创 pycharm中同时运行多个.py文件
pycharm是一个非常好用的python集成开发环境(简称IDE),在pycharm上调用pytorch做深度学习,有时候需要同时运行多个脚本程序,或者是在执行一个深度学习训练任务时,在一个训练的脚本.py文件运行之后,修改训练脚本文件里的某些参数再运行这个脚本,而之前的运行的程序又不会被覆盖,这时需要设置pycahrm里的一个选项就可以满足这个需求在Allow running in p...
2018-12-21 16:41:17
49736
4
原创 python在列表中插入元素
给定列表a,要在第k个位置插入元素b,通常有两种方法:a.inset(k,b)和a[k:k]=b,然而这两种方法是有区别的,并不是在所有情况下得到的结果都相同。下面的程序就是一个例子运行结果可以看出,当插入的元素b是一个字符串时,a.inset(k,b)方法就会在列表a的第k个位置插入这个字符串,而a[k:k]=b方法则在列表a的第k个位置插入时把字符串拆分成若干个字符。当插入...
2018-12-18 18:44:43
16195
原创 C语言中for循环遍历给数组元素赋值需注意的问题
在C语言中,我们通常是用malloc函数分配内存得到一个数组a,然后使用for循环遍历给数组赋值,赋值的方式有很多种,比如a[i]=i,*(a++)=i,建议使用第一种方法,第二种方法一不小心就容易出错,看下面的一个编程例子我们使用*(data_col++) = output_rows;的方式给数组赋值,编译运行结果是如果用*(p++) = output_rows;,代码如下...
2018-09-21 11:43:39
13362
2
原创 pytorch中tensor数据和numpy数据转换中注意的一个问题
在pytorch中,把numpy.array数据转换到张量tensor数据的常用函数是torch.from_numpy(array)或者torch.Tensor(array),第一种函数更常用,然而在pytorch0.4中已经舍弃了这种函数,下面一个简单的编程实验说明这两种方法的区别,实验在pytorch0.4框架下进行运行程序之后,结果是可以看出修改数组a的元素值,张量b的元素值...
2018-09-20 18:02:30
14458
2
原创 使用cvCanny函数时注意的问题
canny算子有两个阈值,上限和下限,构造函数定义为:void cvCanny(const CvArr* img,CvArr* edges,double lowthreshold,double highthreshold,int apertureSize=3);需要注意的是canny需要输入的是灰度图像,所以我们在使用canny之前要使用cvCvtColor将之转换为灰度图像。例如
2013-11-26 09:45:17
1106
翻译 int main(int argc,char* argv[])详解
argc是命令行总的参数个数 argv[]为保存命令行参数的字符串指针,其中第0个参数是程序的全名,以后的参数为命令行后面跟的用户输入的参数,argv参数是字符串指针数组,其各元素值为命令行中各字符串(参数均按字符串处理)的首地址。 指针数组的长度即为参数个数argc。数组元素初值由系统自动赋予。比如: int main(int argc, char* argv[]
2013-11-06 18:59:26
1111
Python优雅编程
2018-09-25
YOLO3D End-to-end real-time
2018-08-29
Object detection at 200 Frames Per Second
2018-08-27
基于深度学习目标检测算法综述
2018-08-27
干货2:基于深度学习的目标检测算法综述
2018-08-24
干货:基于深度学习的目标检测算法综述
2018-08-24
基于深度学习的目标检测算法综述
2018-08-24
深度学习中的归一化方法比较
2018-08-23
鲜为人知的python语法
2018-08-20
Python技巧:这17个骚操作
2018-08-20
SPLATNet: Sparse Lattice Networks for Point Cloud Processing
2018-08-17
python一些不为人知的小技巧
2018-08-02
Nonlinear Programming
2016-06-01
Cannon乘法的MPI实现
2014-07-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人