
深度学习
文章平均质量分 74
Arnold-FY-Chen
On the way of AI spiritual practice...
展开
-
解决DCNv2不能使用高版本pytorch编译的问题
由于pytorch自1.11版开始发生了很大变化,原来基于C实现的THC封装实现的调用cuda、cudnn和cublas的API(只能用NVIDIA的GPU)被基于C++实现的ATen和c10里的API代替(ATen通过vulkan实现支持NVIDIA以外的GPU, ATen代码在https://github.com/pytorch/pytorch/tree/main/aten/src/ATen),THC下的文件基本被删掉了,所以编译DCNv2时会遇到很多错误。原创 2023-09-03 13:43:33 · 1644 阅读 · 3 评论 -
如何制作自己的TuSimple格式的车道线标注文件
所有车道线上对应位置的横坐标都为-2的显然是作为负样本,对于部分车道线的横坐标不是-2其他车道线对应位置的横坐标为-2的情况,上面说了,可以想象在标记数据时在图像上画了一条条的横线,横线和车道线的交叉点为标注点,这些交叉点的位置实际上没有车道线轨迹(例如白色或黄色涂料)的,横坐标记为-2,有车道线轨迹的则记实际横坐标值。所以上面四条车道线中第一条车道线的第一个实际上存在车道线轨迹的点是(632, 280),第四条车道线的第一个实际上存在车道线轨迹的点是(781,270)。就是基于打点标记的,参见。原创 2023-07-14 15:33:13 · 858 阅读 · 0 评论 -
LSTR环境安装
出来虽然两年了但依然是一个非常优秀的车道线检测模型,可以同来拓展检测其他线形,而且占用资源较少推理速度非常快。后来发现使用更高版本的python3.7或3.8 + torch1.12.1 导出onnx时可以使用参数do_constant_folding=True,并且导出的onnx用TensorRT8.4.1.5可以成功解析出engine。和导出onnx(github上源码里是没有提供导出onnx的脚本的,需要自己参考test.py以及通常导出onnx的写法自己写一个脚本)原创 2023-07-13 14:40:37 · 1595 阅读 · 9 评论 -
CUDA-PointPillars有时崩溃的原因
CUDA-PointPillars有时崩溃的原因原创 2022-12-24 20:13:16 · 573 阅读 · 0 评论 -
大数组需要循环单个赋值时适合在GPU上还是CPU上运算?
大数组需要循环单个赋值时适合在GPU上还是CPU上运算?就上面的循环赋值运算的性能来说,我实验得到的结果是: python list > numpy.ndarray > torch.tensor。原创 2022-10-23 19:49:48 · 1291 阅读 · 2 评论 -
3D目标检测(一)
做3D目标检测,首先要了解雷达坐标系和相机坐标系这两个坐标系和数据标注等方面的基础,下面结合kitti3D数据集来讲解。kitti数据集在3D目标检测领域有点类似PASCAL VOC和COCO在2D目标检测和分割领域的经典地位,数据量不算很大,各类别数量很不均衡,但是很多模型要刷榜和发论文都用这个数据集,它里面同时提供了2d和3d目标标注,还有分割和跟踪等数据挺全的,所以用于模型实验和验证以及准备发论文还是挺不错的原创 2022-10-03 23:46:56 · 3466 阅读 · 1 评论 -
ModuleNotFoundError: No module named ‘_bz2‘
记录一个可能会再次遇到又容易忘记的灯下黑的问题备查,以免以后再遇到浪费时间。安装模型的支持环境时可能有时会遇到ModuleNotFoundError: No module named '_bz2'这样问题,比如说yolov5第六版的export脚本所需的pandas包就需要bzip2的支持,可能会报下面这样的错误:这时去安装bzip2,却发现bzip2已经安装了: 查对应的so文件也确实存在:/usr/lib/python3.6/lib-dynload/_bz2.cpython-36m-x86_64-原创 2022-07-06 20:17:46 · 6228 阅读 · 3 评论 -
树莓派4B上ncnn转换出来的模型调用时总是崩溃(Segment Fault)的原因
最近拿到一个树莓派$B的板子做实验,在上面编译出ncnn后,将模型转换出bin和param文件后调用时总是因为Segment Fault崩溃,编译了个debug版的ncnn后用gdb查一下,发现总是崩溃在convolution_3x3.h里:崩溃处的代码是:r0是当前layer的输入特征数据,k0是卷积核数据,表面看不出有何问题,后来从头检查了一下,发现板子烧写的是32位的系统(armv7l),不是64位(aarch64)的,所以编译ncnn时注意加上 -DCMAKE_TOOLCHAIN原创 2022-06-25 22:11:20 · 1067 阅读 · 0 评论 -
如何写CUDA核函数高效实现将视频连续多帧图片转换成3D动作或行为识别模型所需的输入数据格式
3D动作或行为识别模型需要完成一个动作或者行为的相关的一定数量的连续画面作为输入来进行推理,从视频中抽取的帧一般转换后都是RGB格式的,连续多帧数据的顺序排列从通道看就是RGBRGBRGB...这样的排列顺序,但是3D动作或行为识别模型要求输入的数据格式是RRR...GGG...BBB...这样的通道顺序,那怎么把前面的格式转换成后面的格式呢?这里举例是基于把模型优化转换成TensorRT engine从而使用TensorRT来调用模型,TensorRT调用模型时存放模型输入数据的input buffe原创 2022-02-20 23:24:48 · 653 阅读 · 0 评论 -
如何调用一个具有动态维度的tensorrt engine
调用具体动态维度的模型engine时如果没有指定维度,会导致报类似这样的错误:[TRT] Parameter check failed at: engine.cpp::resolveslots::1227, condition: allInputDimensionsSpecified(routine)在python代码里,在调用engine推理前做这样的设置即可:context.set_binding_shape(0, (BATCH, 3, INPUT_H, INPUT_W))在C++代码里原创 2022-02-18 20:19:31 · 10800 阅读 · 5 评论 -
如何解决TensorRT samples的BufferManager不支持有动态维度的engine的问题
TensorRT samples里common的代码是写得不错的用于简化调用TensorRT engine的套路的封装代码,使用这些封装类可以节省些代码,也使得代码更优雅点,但是里面有点问题,例如,有dynamic batch_size或者height/width维度的模型engine,在调用时会发生崩溃: terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc...原创 2022-02-17 20:08:56 · 3282 阅读 · 2 评论 -
什么是TAO以及如何安装和使用TAO
NVIDIA的TAO(Train, Adapt, Optimize)Toolkit以前叫TLT(Tranfer Learning Toolkit),即迁移学习工具,关于什么是迁移学习,网上资料大把,这里只说TAO,故不多说迁移学习。只要是干过模型的,看看NVIDIA官网上给出的这张关于TAO的架构图,也能大概明白了七八分:近来琢磨熟悉TAO的使用并写PPT给组内培训,所以对TAO的相关文档仔细过了一遍,也在不连贯的文档说明指导下琢磨了从TAO的环境安装到训练数据及预训练模型的准备和模型训练再到模型的原创 2022-01-28 22:53:52 · 10658 阅读 · 2 评论 -
安装好Tensorflow后执行import tensorflow时出现Illegal instruction (core dumped) 的原因和解决办法
安装好Tensorflow2.x后执行import tensorflow时报错并崩溃:Illegal instruction (core dumped),原因一般是安装Tensorflow的机器的CPU不支持或者不完全支持AVX指令造成的,Tensorflow从1.6版开始加入了针对CPU指令的优化,使用pip命令安装的官方编译的whl安装包估计是在支持AVX指令的服务器上编译出来的,是默认需要CPU支持AVX指令的,当CPU没有AVX指令时就会崩溃。具体参考:Illegal instruct...原创 2022-01-16 22:00:55 · 3930 阅读 · 0 评论 -
基于TensorRT API实现模型网络时用到CUDA核函数时需要注意的一个问题
TensorRT提供了一些常用的基本API,例如2d和3d卷积、池化、上采样、反卷积(转置卷积)、ReLU和全连接等等,但是更新比较慢,对于新的算子和激活函数没有及时提供实现,至于类似不同输出层多种维度特征数据融合这些复杂一点的组合功能是不可能提供现成的API的,所以这些在自己基于TensorRT API实现某个比较新的模型的网络时是需要自己去实现的。对于这种需要自己定制的部分,TensorRT提供了Plugin机制,也就是提供了几个Plugin接口和超级类分别用于支持输入数据维度是静态的或者动态的,我原创 2022-01-09 00:18:42 · 1867 阅读 · 0 评论 -
如何dump出基于Deepstream开发出的app的pipeline结构图
Dump出app的pipeline的全部结构有助于快速了解一个陌生app的组成,也有助于分析和查找问题或者进行展示说明。在Deepstream开发的app里按要求增加一些代码将pipeline结构图导出成DOT语言脚本文件 *.dot,并且安装AT&T实验室的用于绘制DOT语言脚本描述的图形的开源工具包graphviz,使用这个工具将*.dot文件转换输出成图片文件即可。 1) 首先,安装graphviz sudo apt-get installgra...原创 2022-01-02 22:37:44 · 1326 阅读 · 0 评论 -
Jetson Nano上如何自己编译deepstream-app
Deepstream安装后除了提供了编译好的二进制版的deepstream-app(安装在/usr/bin/下)外还在在samples下提供了deepstream-app等sample app的源码,平时如果只需直接使用deepstream-app跑跑做实验的话(例如查看Deepstream的版本,执行deepstream-app --version),直接执行deepstream-app -c <config-file>即可把deepstream-app跑起来,但是如果需要在dee...原创 2022-01-02 22:11:21 · 1117 阅读 · 2 评论 -
Deepstream里如何调用多个模型
Deepstream提供了nvinfer plugin供封装调用模型使用, Deepstream的sample代码deepstream app里实现调用多个模型时是针对一主多从的使用方案,也就是一个主模型(primary inference engine),一个或者多个次要从属模型(secondary inference engine),因为模型使用前都转换成了TensorRT的engine文件,所以一般叫engine。Deepstream app里使用了四个模型,一个主模型,三个次要模型,主模型用来识原创 2022-01-02 00:00:10 · 5589 阅读 · 10 评论 -
DeepSORT的改进
很多人解说DeepSORT时都是按照论文的思路说,陷入了细节,还贴上公式,让初次接触的人看完还是感觉很懵,我力求说得简单易懂点。 DeepSORT相对于SORT增加了个抽取特征数据的深度学习模型,这个模型可以是目标检测的卷积提取特征部分,也可以reid模型,早期的python版提供了两种简单实现,C++版使用的yolov3,后来有人拿去改成其他比较新的模型,例如yolov5,反正不论使用什么模型,本质都是为了提取跟踪目标的特征数据。 SORT和DeepSORT的核心思路...原创 2021-12-26 23:27:40 · 9834 阅读 · 1 评论 -
cv::HOGDescriptor compute()错误的参数设置导致free(): corrupted unsorted chunks错误
最近在调优DeepSORT代码时是遇到一个奇怪的错误,将tracker里特征数据改成由opencv HOG数据类型后,代码总是崩溃,使用GDB调试发现崩溃发生在一句看似根本不可能崩溃的语句上:free(): corrupted unsorted chunks[Thread debugging using libthread_db enabled]Using host libthread_db library "/lib/aarch64-linux-gnu/libthread_db.so.1".Co原创 2021-11-07 22:23:27 · 5932 阅读 · 0 评论 -
Jetson上VideoCapture打开视频出错及重装opencv-python时出错ModuleNotFoundError: No module named skbuild
最近在Jetson Nano上遇到个怪事,考虑到懒得自己编译安装arm64平台上的pytorch,直接拉取NVIDIA的用于JetPack4.5的镜像l4t-pytorch来使用:docker pull nvcr.io/nvidia/l4t-pytorch:r32.5.0-pth1.7-py3sudo docker run -it -d --runtime nvidia --network host --ipc host -e DISPLAY=$DISPLAY -v /home/ubuntu:/wo原创 2021-10-23 12:36:35 · 5033 阅读 · 2 评论 -
编译支持使用GPU的NCNN
我个人的使用经验感觉,NCNN最大的优势在于运行模型推理时使用内存非常少,一个超轻量级的模型只需几十M的内存,而TensorRT下同一模型则需要几百个M的内存!NCNN这个优点是NVIDIA的TensorRT不能比的,TensorRT的优势就是模型推理时速度基本稳定,当然也比较快,FP32和FP16模式下占用内存和推理速度都有差异,NCNN下轻量级模型的FP32和FP16模式感觉推理速度和占用内存差异不明显,使用NCNN进行模型推理的速度有时波动有点大,但是比较占用的总内存很小,速度有时也不比...原创 2021-10-01 10:03:51 · 5380 阅读 · 0 评论 -
NVIDIA vulkan driver的安装和Jetson平台上vulkan sdk的制作
vulkan是类似opengl这样的封装层,或者叫中间层,用于屏蔽不同类型GPU的差异,向上层应用程序提供统一的接口,用过Java SDK或者其他中间件做过开发的很好理解这个概念,所以vulkan也有自己的vulkan SDK,LunarXchange提供了Windows、Linux、Mac和Android等版本的SDK,不过Linux版的SDK只有X86版本的,所以Jetson这种arm64版的得自己下载源码编译: 对于GPU的支持vulkan的driver, NV...原创 2021-09-30 17:26:43 · 5302 阅读 · 0 评论 -
PyTorch的gradcheck()报错问题RuntimeError: Jacobian mismatch for output 0 with respect to input 1的解决
有时遇到有的模型训练或测试脚本执行时遇到torch.autograd.gradcheck()抛出类似如下的错误:有时报的是Jacobian mismatch for output 0 with respect to input 0,这个出错的原因都是一个:torch.autograd.gradcheck()要求参数计算的PyTorch Tensor数据都是torch.DoubleTensor类型的(torch.float64),也就是双精度数据,而不是默认的torch.FloatTensor类.原创 2021-09-21 18:47:23 · 2191 阅读 · 0 评论 -
GPU内存分明没人占用但是分配不了内存的解决办法
服务器上多张GPU卡被不同人在不同的docker容器中使用,有时GPU分明没人使用了,使用nvidia-smi查看也是内存没占用:可是在容器内运行程序到分配GPU内存时总是报内存溢出的错误:可以看到,就是这么分配2M内存都分配不出来!尽管程序里开头的部分已经指定了要使用的是这些内存没被占用的GPU: os.environ['CUDA_VISIBLE_DEVICES']='6,7'使用pip install pynvml安装pynvml后查看内存也是有大量的可用内存:from ..原创 2021-09-20 11:05:54 · 4534 阅读 · 1 评论 -
如何解决DeepStream拉流时延时越来越长的问题
DeepStream是基于GStreamer框架开发的,像GStreamer这种pipeline架构它有个毛病就是pipeline里任何一个element里的基于pipeline这个context下的同步计算耗时过长导致超过源端视频帧的发送间隔的话会导致整个pipeline里的视频数据流动速度下降从而产生帧积累,如果没有主动丢弃的话,视频播放离实时视频时间上自然相差越来越来多,也就是延时越来越长。 但是我们有时在某些element里的同步计算是不可避免的,例如对帧调用模型进行推理,将推...原创 2021-09-19 10:58:54 · 4997 阅读 · 14 评论 -
模型集成到Deepstream里后为何识别效果变差以及如何从Deepstream Infer Plugin里导出预处理过的用于模型推理的图片数据并使用TensorRT进行推理测试
在将模型集成到Deepstream Infer Plugin过程中可能会碰到这样那样的问题,其中一个困扰人的问题就是一个模型集成到Deepstream Infer Plugin后,模型推理时的精度下降,比不使用Deepstream而是直接使用python或者C++调用原始模型或者使用TensorRT API实现的模型的精度要差,两种方式使用同样的视频或图片和同样的模型engine文件,模型在Deepstream Infer Plugin里的表现要差一些,经过很多次的调查和实验,可以确定这个问题和...原创 2021-09-04 14:07:03 · 1386 阅读 · 11 评论 -
我的AI之路(55)--如何获取kinetics数据集和如何制作自己的kinetics数据集
近来做行为动作识别,根据近两年的CVPR、ICCV、ECCV论文实验了一序列的动作识别方面的模型,很多都用到了kinetics数据集或者something-something数据集,但是后者的官网目前已经关闭了(可能是因为上月bn20被高通收购了的原因),所以只好依赖于kinetics数据集了,但是网上没有看到有人把kinetics数据集如何使用说清楚了,只好自己花了点时间看这个数据集的内容以及翻看了多个相关动作识别模型加载kinetics数据集的代码,看是如何做data loading的,做下...原创 2021-08-21 11:44:12 · 11836 阅读 · 46 评论 -
我的AI之路(54)--使用Pytorch内置的动作识别模型
Pytorch内集成有视频分类功能,提供了三个基于Kinectis400/600/700数据集(https://deepmind.com/research/open-source/kinetics)训练的网络模型(ResNet3D、Mixed Convoluation、R(2+1)D )可用来实现视频动作识别(Activity Recognition)。 相关论文链接https://arxiv.org/abs/1711.11248 模型的代码参见 https://...原创 2021-08-01 21:08:09 · 2223 阅读 · 0 评论 -
TensorRT的IPluginV2IOExt 和 IPluginV2Ext 的configurePlugin() 的virtual function override问题
有类似如下代码:namespace nvinfer1{ class YoloLayerPlugin : public IPluginV2IOExt { ... void configurePlugin(const PluginTensorDesc* in, int nbInput, const PluginTensorDesc* out, int nbOutput) override; ... } ...}在编译时总有如下原创 2021-05-21 17:26:52 · 1754 阅读 · 0 评论 -
如何解决caffe和video-caffe不能使用cudnn8编译的问题
因为caffe之类的代码很久不更新了,只支持到了使用cudnn7.x,在使用了cudnn8的环境下编译caffe或video-caffe时,会在src/caffe/layers/cudnn_conv_layer.cpp等文件里出错:error: identifier "CUDNN_CONVOLUTION_FWD_SPECIFY_WORKSPACE_LIMIT" is undefinederror: identifier "cudnnGetConvolutionForwardAlgorithm...原创 2021-01-20 20:30:43 · 4963 阅读 · 3 评论 -
如何解决pjreddie版darknet不能使用cudnn8编译的问题
近期使用同样的数据同样的yolov3 tiny网络配置文件实验对比了https://github.com/pjreddie/darknet和https://github.com/AlexeyAB/darknet,发现使用两者训练出来的weights文件拿到Jetson Nano上去嵌入到deepstream中使用(网络cfg文件是一样的),用来做视频识别,发现实际表现上,两者训练出来的weights导致模型的精度和召回率相差很大,Alexey版明显比pjreddie差很多,一下想不出准确原因在哪...原创 2021-01-18 20:07:15 · 9479 阅读 · 41 评论 -
我的AI之路(53)--超高清图像识别
首先这里说的超高清图像的识别问题不是超分辨率(super-resolution)问题,超分辨率这个领域问题是指使用插值等手段把相对模糊的小图放大成高清大图且保持细节基本真实自然的问题,超高清图像的识别问题是指对本身是高清大图的图片做目标分类、检测、分割(下面我说到识别默认只指分类或检测,不含分割)等处理这类问题。 顺带说一句,以便更好界定识别需求问题的范围:一般将分辨率为720p(1280x720像素)、1080p(1920×1080像素)叫高清(High Definition...原创 2021-01-01 20:01:10 · 1642 阅读 · 3 评论 -
onnxruntime调用AI模型的python和C++编程
python版的onnxruntime是比较容易使用的,先保证pip更新到最新再安装onnxruntime:pip install --upgrade pip#安装cpu版pip install onnxruntime#或者安装gpu版#pip install onnxruntime-gpu只是用来验证模型的话,用cpu版的就很好了,比较简单易用。注意两种版本不要同时安装,否则调用时怎么弄都出错,说参数不对:incompatible constructor arguments. .原创 2020-11-30 00:00:30 · 16399 阅读 · 25 评论 -
在Jetson Nano上编译onnxruntime
因为做模型精度损失的对比需要,上个月用过了MS家的onnxruntime (https://github.com/microsoft/onnxruntime),一如MS的产品风格,要求不高的小项目用还凑合,不要指望有多高的性能能用在大规模项目上,不过它有个好处就是支持了多种OS和CPU,支持多种语言,常用的python和C/C++版都能很快用起来,用来在多个不同硬件平台上做模型推理的快速验证和做对比还是不错的,比如一个模型用python调用精度很好,改用onnxruntime调用它精度也差不多很...原创 2020-11-29 13:34:57 · 4596 阅读 · 20 评论 -
我的AI之路(52)--如何制作自己的UCF101数据集
前面说过如何用自己的UCF101数据集训练3D识别模型video-caffe,那么怎么制作自己的UCF101数据集呢?这个稍微有点复杂。 UCF101数据集其实是按101个动作类别分类了的短视频的集合,每类动作对应一个目录,每个目录下有很多avi格式的视频文件,我们需要制作自己的项目应用领域的UCF101格式的数据集时,可以像这样把项目应用的视频数据按动作分类这样分目录存放,一个目录对应一个动作,实际项目中一般不会有101种动作,比如有三种或者四种动作,那么对应就按三个或四个目录存...原创 2020-11-28 21:32:26 · 4458 阅读 · 16 评论 -
我的AI之路(47)--使用自己的数据集训练EfficientDet
训练用的服务器的芯片一般都是X86架构的,所以可以直接从hub.docker.com上拉个安装了pytorch的镜像下来作为训练用的环境,省去了很多安装步骤,例如拉取pytorch/pytorch:1.3-cuda10.1-cudnn7-devel(注意一般不要使用runtime镜像,runtime镜像里面只安装了最小的支持环境,很多工具都没安装,devel镜像一般是比较全面的):...原创 2020-04-12 23:06:11 · 3120 阅读 · 21 评论 -
如何查看并准确找到占用GPU的程序
有时多人都在一段时间内同时使用公司共用的服务器上的GPU训练,有的网络的代码写得不好,虽然是按需获取GPU内存但停止训练了却仍然占用GPU没放,有的则采取的是预分配机制,一开始运行加载训练好了的模型时就占用大量内存(比如9-10G),没有进行识别推理也占用内存不放,多人共用的环境如果有人用完不及时停掉相关程序,很多GPU就被占了但空闲在那里,但又不好随便乱杀进程来释放,首先得确认一下...原创 2020-03-08 13:06:24 · 30987 阅读 · 0 评论 -
我的AI之路(45)--使用自己的数据集训练CenterNet
CenterNet是anchor-free类型网络,具有识别精度高且速度快的特点,根据作者的论文中列出的数据来看,指标综合考虑来看比较牛了: 最后那个CenterNet-HG,也就是backbone使用的Hourglass-104网络的AP值只比FSAF低一点了(但是FSAF目前貌似还没有源码放出来),比YOLO序列和RCNN序列都强很多,虽然FPS自有7.8,但是对一般实...原创 2020-03-14 11:46:31 · 3337 阅读 · 20 评论