【光电智造】如何在无人机上部署YOLOv4物体检测器

今日光电 2024-09-12 18:01

 今日光电 

有人说,20世纪是电的世纪,21世纪是光的世纪;知光解电,再小的个体都可以被赋能。追光逐电,光赢未来...欢迎来到今日光电!




----追光逐电 光赢未来----


1

代码编译

准备工作

  • 推荐使用Ubuntu 18.04

  • CMake >= 3.8https://cmake.org/download/

  • CUDA >= 10.0https://developer.nvidia.com/cuda-toolkit-archive

  • OpenCV >= 2.4https://opencv.org/releases.html

  • cuDNN >= 7.0 for CUDA >= 10.0https://developer.nvidia.com/rdp/cudnn-archive

  • GPU with CC >= 3.0https://en.wikipedia.org/wiki/CUDA#GPUs_supported

  • GCC

Linux上编译

下载YOLOv4源码,推荐使用Ubuntu 18.04

sudo apt-get install -y git

git clone https://github.com/AlexeyAB/darknet.git

配置Makefile文件中的参数,然后运行make -j8进行编译,具体参数解释如下:

  • GPU=1 使用CUDA和GPU(CUDA默认路径为/usr/local/cuda

  • CUDNN=1使用cuDNN v5-v7加速网络(cuDNN默认路径/usr/local/cudnn

  • CUDNN_HALF=1 使用Tensor Cores(可用GPU为Titan V / Tesla V100 / DGX-2或者更新的)检测速度3x,训练速度2x

  • OPENCV=1 使用OpenCV 4.x/3.x/2.4.x,运行检测视频和摄像机

  • DEBUG=1 编译调试版本

  • OPENMP=1 使用OpenMP利用多CPU加速

  • LIBSO=1 编译darknet.so

    • 使用uselib来运行YOLO,输入指令如下: LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./uselib test.mp4

    • 在自己的代码中嵌入YOLO,请参考例程: https://github.com/AlexeyAB/darknet/blob/master/src/yolo_console_dll.cpp

  • ZED_CAMERA=1 增加ZED-3D相机的支持(需要先安装好ZED SDK)

    • 运行LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./uselib data/coco.names cfg/yolov4.cfg yolov4.weights zed_camera

常见编译问题

/bin/sh: 1: nvcc: not found

首先确保CUDA正确安装,并且在路径/usr/local/cuda下,然后输入如下指令:

echo "PATH=/usr/local/cuda/bin:$PATH" >> ~/.bashrc

source ~/.bashrc

include/darknet.h:46:10: fatal error: cudnn.h: No such file or directory

首先下载cuDNNhttps://developer.nvidia.com/rdp/cudnn-archive,需要根据自己的CUDA版本选择,然后解压,输入指令:

sudo cp -r cudnn-10.1-linux-x64-v7.6.5.32/cuda /usr/local/cudnn
2

运行代码

预训练模型

所有模型都是在MS-COCO数据集上训练,模型包括两个文件(cfgweights

R表示在RTX 2070设备上的FPS,V表示在Tesla V100设备上的FPS

百度网盘打包下载,链接:https://pan.baidu.com/s/1QQPB27n18XeRDnhHA2Gxuw,提取码:uill

  • yolov4.cfg - 245 MB: yolov4.weights

    • width=608 height=60865.7 AP@0.5 | 43.5 AP@0.5:0.95 - 34(R) FPS / 62(V) FPS - 128.5 BFlops

    • width=512 height=51264.9 AP@0.5 | 43.0 AP@0.5:0.95 - 45(R) FPS / 83(V) FPS - 91.1 BFlops

    • width=416 height=41662.8 AP@0.5 | 41.2 AP@0.5:0.95 - 55(R) FPS / 96(V) FPS - 60.1 BFlops

    • width=320 height=32060.0 AP@0.5 | 38.0 AP@0.5:0.95 - 63(R) FPS / 123(V) FPS - 35.5 BFlops

  • yolov3-tiny-prn.cfg - 18.8 MB: yolov3-tiny-prn.weights

    • width=416 height=41633.1 AP@0.5 - 370(R) FPS - 3.5 BFlops

  • enet-coco.cfg (EfficientNetB0-Yolov3) - 18.3 MB: enetb0-coco_final.weights

    • width=416 height=41645.5 AP@0.5 - 55(R) FPS - 3.7 BFlops

  • csresnext50-panet-spp-original-optimal.cfg - 217 MB: csresnext50-panet-spp-original-optimal_final.weights

    • width=608 height=60865.4 AP@0.5 | 43.2 AP@0.5:0.95 - 32(R) FPS - 100.5 BFlops

  • yolov3-spp.cfg - 240 MB: yolov3-spp.weights

    • width=608 height=60860.6 AP@0.5 - 38(R) FPS - 141.5 BFlops

  • yolov3.cfg - 236 MB: yolov3.weights

    • width=416 height=41655.3 AP@0.5 - 66(R) FPS - 65.9 BFlops

  • yolov3-tiny.cfg - 33.7 MB: yolov3-tiny.weights

    • width=416 height=41633.1 AP@0.5 - 345(R) FPS - 5.6 BFlops

可以在如下路径找到所有的cfg文件: darknet/cfg/

运行指令介绍

需要将训练好的weights文件放到darknet根目录下,运行如下指令:

  • 检测单张图像

./darknet detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -thresh 0.25
  • 检测给定路径的单张图像(参数最后的路径需要写待检测图像的路径)

./darknet detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -ext_output /home/jario/Pictures/h1.jpg
  • 检测给定路径的单个视频

./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights -ext_output test.mp4
  • 检测给定路径的单个视频,并将检测结果保存为视频

./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights test.mp4 -out_filename res.avi
  • 利用摄像机实时检测(YOLOv4)

./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights -c 0
  • 利用摄像机实时检测(YOLOv3-Tiny)

./darknet detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights -c 0
  • 在GPU1上检测给定路径的单个视频

./darknet detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights -i 1 test.mp4
  • 检测列表data/train.txt中图像,并将结果保存在result.json

./darknet detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -ext_output -dont_show -out result.json < data/train.txt
  • 检测列表data/train.txt中图像,并将结果保存在result.txt

./darknet detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -dont_show -ext_output < data/train.txt > result.txt
3

如何训练

如何构建自己的训练数据

下载数据集标注工具,下载地址:(https://pan.baidu.com/s/1EE52cDStjIxsRgM_a9pWQQ) (password: 4b2q) 或者 Spire Web.

数据集管理软件github地址:https://github.com/jario-jin/spire-image-manager

打开标注软件 SpireImageTools_x.x.x.exe

首先点击Tools->Setting...,填写一个 save path (所有的标注文件都会存储在这个文件夹中)

如果采集的数据集是视频 (如果采集的是图像,则调过这一步骤),点击 Input->Video, 选择要标注的视频。

然后,点击Tools->Video to Image

点击OK 后,等待完成,结果会存储在

打开需要标注的图像

Input->Image Dir, 找到需要标注的图像所在文件夹 Ctrl+A,全选,打开

点击,Tools->Annotate Image->Instance Label,开始标注图像

在 label 中填写待标注目标名称,然后将对话框拖到一边在主窗口中开始标注,鼠标滚轮放大缩小图像,按住左键移动可视图像区域不断点击左键将目标框包围, 使用 Yolo 训练时,点击 2 个点即可

标注时,如果点错,按鼠标右键可以取消 标注完成后,如果不满意,可以点击绿色边框(边框会变红,如下图所示),按Delete 删除

将标注输出为 Yolo 格式,准备训练

在标注完成之后,按下 Ctrl+O

点击确定后

然后将下面 4 个文件取出用于 Yolo 训练

开始训练YOLO

使用YOLOv4和YOLOv3:

  1. 针对选择的模型,下载预训练权重:

    百度网盘打包下载,链接:https://pan.baidu.com/s/1CNVyyjoph7YVSXGT3vjbfQ,提取码:4usc

  • 对于 yolov4.cfgyolov4-custom.cfg (162 MB): yolov4.conv.137

  • 对于 csresnext50-panet-spp.cfg (133 MB): csresnext50-panet-spp.conv.112

  • 对于 yolov3.cfg, yolov3-spp.cfg (154 MB): darknet53.conv.74

  • 对于 yolov3-tiny-prn.cfg , yolov3-tiny.cfg (6 MB): yolov3-tiny.conv.11

  • 对于 enet-coco.cfg (EfficientNetB0-Yolov3) (14 MB): enetb0-coco.conv.132

  • cfg/yolov4-custom.cfg拷贝一份,重命名为yolov4-obj.cfgobj可以是自定义名称)

    • 修改batch为batch=64

    • 修改subdivisions为subdivisions=16

    • 修改max_batches为(类别数量*2000,但不要小于4000),如训练3个类别max_batches=6000

    • 修改steps为max_batches的0.8与0.9,如steps=4800,5400

    • 修改classes=80为自定义数据集的类别数量,主要需要修改3处(3个[yolo]层):

    • https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L610

    • https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L696

    • https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L783

    • 修改filters=255filters=(classes+5)x3,在3个[yolo]层的前一个[convolutional]层,分别为:

    • https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L603

    • https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L689

    • https://github.com/AlexeyAB/darknet/blob/0039fd26786ab5f71d5af725fc18b3f521e7acfd/cfg/yolov3.cfg#L776

    • 如果使用[Gaussian_yolo]层,修改filters=57filters=(classes+9)x3,在3个[Gaussian_yolo]层的前一个[convolutional]层,分别为:

      • https://github.com/AlexeyAB/darknet/blob/6e5bdf1282ad6b06ed0e962c3f5be67cf63d96dc/cfg/Gaussian_yolov3_BDD.cfg#L604

      • https://github.com/AlexeyAB/darknet/blob/6e5bdf1282ad6b06ed0e962c3f5be67cf63d96dc/cfg/Gaussian_yolov3_BDD.cfg#L696

      • https://github.com/AlexeyAB/darknet/blob/6e5bdf1282ad6b06ed0e962c3f5be67cf63d96dc/cfg/Gaussian_yolov3_BDD.cfg#L789

    • 例如,如果classes=1,则filters=18;如果classes=2,则filters=21。注意:不要cfg文件中直接写: filters=(classes+5)x3)

  • darknet/data路径下创建obj.names,其中每一行是一个目标类别名称

    • 将数据集标注得到的文件Yolo_categories.names重命名为obj.names,并放到darknet/data

  • darknet/data路径下创建obj.data

    教程 darknet 路径为 /home/user/darknet,本文以此为例,请根据自己的路径进行修改。在 /home/user/darknet/cfg/ 文件夹下新建一个文件,名字叫 obj.data 在里面写入:

  • classes = 1
    train = /home/user/darknet/data/coco/Yolo_20180908_234114.txt
    valid = /home/user/darknet/data/coco/Yolo_20180908_234114.txt
    names = data/obj.names
    backup = backup
    eval = coco

    注意:classes 为类别数量,对于单类检测问题,写 1

      5. 将图像文件(.jpg)与标注文件放入到如下路径darknet\data\coco\路径下

      • scaled_images里的图像拷贝到 /home/user/darknet/data/coco/images/train

      • Yolo_labels里的标注文件拷贝到/home/user/darknet/data/coco/images/train

      • Yolo_20180908_234114.txt拷贝到/home/user/darknet/data/coco

        6. 开始训练

        • 训练指令:./darknet detector train data/obj.data cfg/yolo-obj.cfg yolov4.conv.137

          (对于最新100次迭代的最新权重yolo-obj_last.weights会保存在darknet\backup\

          (对于每1000次迭代的权重yolo-obj_xxxx.weights会保存在darknet\backup\

          (关闭Loss的显示窗口./darknet detector train data/obj.data cfg/yolo-obj.cfg yolov4.conv.137 -dont_show

          (通过浏览器查看训练过程./darknet detector train data/obj.data yolo-obj.cfg yolov4.conv.137 -dont_show -mjpeg_port 8090 -map,然后打开Chrome浏览器,输入http://ip-address:8090

          (如果需要在训练中计算mAP,每4期计算一次,需要在obj.data文件中设置valid=valid.txt,运行:./darknet detector train data/obj.data yolo-obj.cfg yolov4.conv.137 -map

        7. 训练结束,结果保存在darknet\backup\yolo-obj_final.weights

          • 如果训练中断,可以选择一个保存的权重继续训练,使用./darknet detector train data/obj.data yolo-obj.cfg backup\yolo-obj_2000.weights

          注意:在训练中,如果avg(loss)出现nan,则训练出了问题,如果是其他字段出现nan,这种情况是正常的。注意:如果需要改变cfg文件中的width=height=,新的数字需要被32整除。注意:训练完成后,检测指令为:./darknet detector test data/obj.data yolo-obj.cfg yolo-obj_8000.weights。注意:如果出现Out of memory,需要修改cfg文件中的subdivisions=163264

          训练YOLOv3-Tiny

          训练YOLOv3-Tiny与选了YOLOv4、YOLOv3基本相同,主要有以下小区别:

          1. 下载yolov3-tiny预训练权重,运行命令./darknet partial cfg/yolov3-tiny.cfg yolov3-tiny.weights yolov3-tiny.conv.15 15

          2. 新建自定义cfg文件yolov3-tiny-obj.cfg(可以复制cfg/yolov3-tiny.cfgyolov3-tiny-obj.cfg

          3. 运行训练命令:./darknet detector train data/obj.data yolov3-tiny-obj.cfg yolov3-tiny.conv.15

          多GPU训练

          1. 首先在1块GPU上训练1000次./darknet detector train cfg/coco.data cfg/yolov4.cfg yolov4.conv.137

          2. 停止训练,使用权重darknet/backup/yolov4_1000.weights,在多块GPU上训练,运行./darknet detector train cfg/coco.data cfg/yolov4.cfg /backup/yolov4_1000.weights -gpus 0,1,2,3

          注意:如果出现nan,应该降低学习率,如4块GPUlearning_rate=0.00065(learning_rate=0.00261/GPUs),还应该增加cfg文件中的burn_in=为原先的4x,如burn_in=4000

          训练常见程序问题

          注意:如果出现如下错误

          需要修改源码/home/user/darknet/src/data.c 将如下代码

          list *get_paths(char *filename)

          {  

          char *path;  

          FILE *file = fopen(filename, "r");  
          if(!file)    
          file_error(filename);  
          list *lines = make_list();  
          while((path=fgetl(file))) {    
          list_insert(lines, path);  
          }  
          fclose(file);  
          return lines;
          }

          修改为:

          void ltrim(char *s)

          {  

          char *p; p = s;  

          while (*p == ' ' || *p == '\t' || *p == '\r') { p++; } strcpy(s,p);

          }

          void rtrim(char *s)

          {  

          int i;  

          i = strlen(s) - 1;  

          while ((s[i] == ' ' || s[i] == '\t' || s[i] == '\r') && i >= 0 ) { i--; } s[i+1] = '\0';

          }

          void _trim(char *s)


          {  

          ltrim(s);  

          rtrim(s);

          }

          list *get_paths(char *filename)

          {  

          char *path;  

          FILE *file = fopen(filename, "r"); if(!file) file_error(filename); list *lines = make_list(); while((path=fgetl(file))) {  

          _trim(path); list_insert(lines, path);  

          }  

          fclose(file); return lines;

          }

          保存,make -j8重新编译 下面为正常训练时画面

          何时应该停止训练

          通常情况下,为每个类别迭代2000次是足够的,且总的迭代次数不能低于4000次。但是如果想要更加精确的停止时间,可以参考以下说明:

          1. 在训练过程中,你会看到一系列训练误差,当0.XXXXXXX avg这个参数不再下降时,就该停止训练了

          Region Avg IOU: 0.798363, Class: 0.893232, Obj: 0.700808, No Obj: 0.004567, Avg Recall: 1.000000, count: 8 Region Avg IOU: 0.800677, Class: 0.892181, Obj: 0.701590, No Obj: 0.004574, Avg Recall: 1.000000, count: 8 9002: 0.211667, 0.60730 avg, 0.001000 rate, 3.868000 seconds, 576128 images Loaded: 0.000000 seconds

          • 9002 - 迭代数量(batch数量)

          • 0.60730 avg - 平均损失(误差),越低越好

          如果发现0.XXXXXXX avg在很多次迭代后都不再降低,则是时候该停止训练了。最终的平均损失从0.05(对于小模型和简单训练数据)到3.0(对于大模型和复杂训练数据)不等。

          1. 当训练停止之后,可以从darknet\backup中取出最新保存的训练权重.weights,并选择它们中检测效果最好的

          例如,当训练9000次停止后,效果最好的模型可能是之前保存权重中的一个(7000,8000,9000),这是因为过拟合(Overfiting)现象。过拟合的表现可以解释为,在训练图像上检测效果很好,但是在其他图像上效果不佳,这时候就该尽早停止训练(早停点)。

          2.1 首先,你需要在obj.data中指定验证数据集valid=valid.txt,如果你没有准备验证数据集,可以简单的复制data\train.txtdata\valid.txt

          2.2 如果你在迭代9000次之后停止训练,验证之前的模型权重可以使用如下命令:

          • ./darknet detector map data/obj.data cfg/yolo-obj.cfg backup\yolo-obj_7000.weights

          • ./darknet detector map data/obj.data cfg/yolo-obj.cfg backup\yolo-obj_8000.weights

          • ./darknet detector map data/obj.data cfg/yolo-obj.cfg backup\yolo-obj_9000.weights

          然后对比每个权重(7000,8000,9000)最后一行输出,选择mAP(mean average precision)最高权重,或者对比IoU(intersect over union)进行选择。

          例如,yolo-obj_8000.weights的mAP最高,则使用这个权重。或者在训练时加上-map参数:

          ./darknet detector train data/obj.data cfg/yolo-obj.cfg yolov4.conv.137 -map

          结果如下图所示,mAP每4期(Epoch)通过obj.data中设置的验证集valid=valid.txt上计算一次(1期=train_txt中图像数量 / batch 次迭代)。

          运行训练好的模型,进行目标检测,执行:

          ./darknet detector test data/obj.data cfg/yolo-obj.cfg yolo-obj_8000.weights

          如何提升检测效果

          训练之前提升检测效果的技巧

          • 设置.cfg文件中random=1,可以使用多分辨率输入增加检测效果:link

          • .cfg文件中增加网络的输入分辨率(设置任意可以被32整除的数字,如,height=608width=608),可以增加精度

          • 检查图像每个目标是否都被标记,图像中的所有目标都必须被正确标记,推荐使用数据管理工具检查:spire-image-manager

          • Loss很大,mAP很低,是不是训练错了?在训练中使用-show_imgs参数,能够可视化目标框真值,检查数据集是否出了问题。

          • 对于每一个你要检测的物体,在训练数据集中至少需要有一个实例与之相似,包括:形状、物体侧面、相对大小、旋转角度、倾斜方位角、光照等。因此,你的训练数据集需要包含具有不同对象属性的图像:比例、旋转、光照、不同侧面、不同背景等。建议对每一类物体收集2000张不同图像,并迭代训练2000*类别数量次。

          • 推荐在训练数据集中包含带有不希望检测的非标记目标的图像。负样本图像不需要方框标记(空.txt文件),越多越好。

          • 标注目标的最佳方式是:仅标注物体的可见部分,或标注物体的可见和重叠部分,或标注比整个物体稍多一点的部分(有一点间隙),标注你想让检测器检测的部分。

          • 如果单幅图像中的物体很多,需要在[yolo]层或[region]层中修改参数max=200或者更高(全局最大目标检测数量为0,0615234375*(width*height))。

          如果想要检测小目标(图像被缩放到416*416后,小于16*16的目标)

          • https://github.com/AlexeyAB/darknet/blob/6f718c257815a984253346bba8fb7aa756c55090/cfg/yolov4.cfg#L895修改`layers = 23`

          • https://github.com/AlexeyAB/darknet/blob/6f718c257815a984253346bba8fb7aa756c55090/cfg/yolov4.cfg#L892修改`stride=4`

          • https://github.com/AlexeyAB/darknet/blob/6f718c257815a984253346bba8fb7aa756c55090/cfg/yolov4.cfg#L989修改`stride=4`

          • 如果想要同时检测大目标与小目标,可以使用修改模型:

            • 全模型 - 5个yolo层:https://raw.githubusercontent.com/AlexeyAB/darknet/master/cfg/yolov3_5l.cfg

            • 小模型 - 3个yolo层:https://raw.githubusercontent.com/AlexeyAB/darknet/master/cfg/yolov3-tiny_3l.cfg

            • YOLOv4 - 3个yolo层:https://raw.githubusercontent.com/AlexeyAB/darknet/master/cfg/yolov4-custom.cfg

          • 如果你训练的数据类别需要区分左右目标(如检测左右手,交通信号中的左右方向),则不能使用左右翻转图像增强,在cfg文件中设置flip=0https://github.com/AlexeyAB/darknet/blob/3d2d0a7c98dbc8923d9ff705b81ff4f7940ea6ff/cfg/yolov3.cfg#L17

          • 一般规则 - 您的训练数据集应包含待检测目标的相对大小的集合:

            • train_network_width * train_obj_width / train_image_width ~= detection_network_width * detection_obj_width / detection_image_width

            • train_network_height * train_obj_height / train_image_height ~= detection_network_height * detection_obj_height / detection_image_height

            也就是,对于测试数据集中的每个物体,训练数据集中必须至少有一个具有相同类与大约相同相对大小的物体。如果训练数据中仅有占图像面积80-90%的物体,则训练后的网络不能够检测占图像面积1-10%的物体。

          • 如果想加速训练(损失检测精度),可以在cfg文件layer-136中设置参数stopbackward=1

          • 注意物体的模型、侧面、光照、尺度、方位角等属性,从神经网络的内部角度来看,这些是不同的物体。因此,你想检测的物体越多,就应该使用越复杂的网络模型。

          • 如果想要外包矩形框更加精确,可以在[yolo]层中增加3个参数:ignore_thresh=.9 iou_normalizer=0.5 iou_loss=giou,这会增加mAP@0.9,同时降低mAP@0.5。

          • 如果你比较熟悉检测网络了,可以重新计算自定义数据集的锚框(Anchor):./darknet detector calc_anchors data/obj.data -num_of_clusters 9 -width 416 -height 416,然后设置cfg文件中3个[yolo]层9个锚框。同时需要改变每个[yolo]层中的锚框索引mask=,第一层有大于60*60的锚框,第二层有大于30*30的锚框,第三层相同。也需要改变每个[yolo]层之前的filters=(classes + 5)*。如果许多计算出的锚框不适合在适当的层下 - 那么就尝试使用默认锚框。

          训练之后提升检测效果的技巧

          • 增加cfg文件中网络输入的分辨率,如,height=608width=608,或height=832width=832,这样可以检测更小的目标。

          4

          如何将训练好的模型部署到无人机上

          TX2上的准备工作

          • 推荐使用Ubuntu 18.04(可以使用JetPack刷机)

          • CMake >= 3.8https://cmake.org/download/

          • CUDA >= 10.0https://developer.nvidia.com/cuda-toolkit-archive

          • cuDNN >= 7.0 for CUDA >= 10.0https://developer.nvidia.com/rdp/cudnn-archive

          • OpenCV >= 2.4https://opencv.org/releases.html

          • GCC

          • ROS Melodichttp://wiki.ros.org/melodic/Installation

          使用JetPack为TX2安装CUDA与cuDNN

          • 下载JetPack,地址:https://developer.nvidia.com/embedded/jetpack

          • 进入 sdkmanager-[version].[build].deb 所在的路径,其中version和build代表相应各自的编号,安装Debian包:

          sudo apt install ./sdkmanager-[version].[build].deb
          • 安装好之后,在Terminal中输入

          sdkmanager
          • 使用NVIDIA账号登录

          • 选择开发环境

            • 在 Product Category 中选择 Jetson.

            • 在 Hardware Configuration 中选择 target hardware(Jetson TX2),勾掉 host machine

            • 在 Target Operating System 中选择 JetPack 的版本.

            • 点击CONTINUE进入下一步

          • 检查下载组件(如果仅安装CUDA和cuDNN,则只勾选红圈内的选项)、选择存储路径以及接收条款

          • 保证Host计算机与TX2在同一局域网内,输入TX2的IP地址就可以安装

          部署Darknet-ROS

          • 下载darknet_ros源码

          cd ~
          cd catkin_ws/src

          git clone --recursive https://github.com/leggedrobotics/darknet_ros.git

          cd ../

          • 编译

          catkin_make -DCMAKE_BUILD_TYPE=Release
          • 将训练好的cfg和weights加载到darknet_ros中

          /home/user/darknet/cfg/yolov3-tiny.cfg/home/user/darknet/backup中刚刚训练好的参数 分别拷贝到/home/user/catkin_ws/src/darknet_ros/darknet_ros/yolo_network_config中的cfgweights两个文件夹中 在/home/user/catkin_ws/src/darknet_ros/darknet_ros/config文件夹中新建yolov3-tiny-obj.yaml

          里面写入

          yolo_model:  

          config_file:    

          name: yolov3-tiny-obj.cfg  

          weight_file:    

          name: yolov3-tiny-obj.weights  

          threshold:    

          value: 0.3  

          detection_classes:    

          names:      

          - drone

          注意,在yolov3-tiny-obj.yaml文件中,需要指定刚才拷贝的cfgweights文件以及names为自己训练的类别

          /home/user/catkin_ws/src/darknet_ros/darknet_ros/launch文件夹中,复制一份darknet_ros.launch,重命名为obj_det.launch 修改里面的

          注意:这正式刚才编写的yaml文件

          roslaunch darknet_ros obj_det.launch

          注意:进行检测,需要先打开一个ros_web_cam节点,以提供摄像头数据

          最后,给一张YOLOv4检测结果的样张吧

          来源:新机器视觉


          申明:感谢原创作者的辛勤付出。本号转载的文章均会在文中注明,若遇到版权问题请联系我们处理。


           

          ----与智者为伍 为创新赋能----


          【说明】欢迎企业和个人洽谈合作,投稿发文。欢迎联系我们
          诚招运营合伙人 ,对新媒体感兴趣,对光电产业和行业感兴趣。非常有意者通过以下方式联我们!条件待遇面谈
          投稿丨合作丨咨询

          联系邮箱:uestcwxd@126.com

          QQ:493826566



          评论
          • 村田是目前全球量产硅电容的领先企业,其在2016年收购了法国IPDiA头部硅电容器公司,并于2023年6月宣布投资约100亿日元将硅电容产能提升两倍。以下内容主要来自村田官网信息整理,村田高密度硅电容器采用半导体MOS工艺开发,并使用3D结构来大幅增加电极表面,因此在给定的占位面积内增加了静电容量。村田的硅技术以嵌入非结晶基板的单片结构为基础(单层MIM和多层MIM—MIM是指金属 / 绝缘体/ 金属) 村田硅电容采用先进3D拓扑结构在100um内,使开发的有效静电容量面积相当于80个
            知白 2025-01-07 15:02 65浏览
          • By Toradex 秦海1). 简介嵌入式平台设备基于Yocto Linux 在开发后期量产前期,为了安全以及提高启动速度等考虑,希望将 ARM 处理器平台的 Debug Console 输出关闭,本文就基于 NXP i.MX8MP ARM 处理器平台来演示相关流程。 本文所示例的平台来自于 Toradex Verdin i.MX8MP 嵌入式平台。  2. 准备a). Verdin i.MX8MP ARM核心版配合Dahlia载板并
            hai.qin_651820742 2025-01-07 14:52 38浏览
          • 本文介绍Linux系统更换开机logo方法教程,通用RK3566、RK3568、RK3588、RK3576等开发板,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。制作图片开机logo图片制作注意事项(1)图片必须为bmp格式;(2)图片大小不能大于4MB;(3)BMP位深最大是32,建议设置为8;(4)图片名称为logo.bmp和logo_kernel.bmp;开机
            Industio_触觉智能 2025-01-06 10:43 87浏览
          • 大模型的赋能是指利用大型机器学习模型(如深度学习模型)来增强或改进各种应用和服务。这种技术在许多领域都显示出了巨大的潜力,包括但不限于以下几个方面: 1. 企业服务:大模型可以用于构建智能客服系统、知识库问答系统等,提升企业的服务质量和运营效率。 2. 教育服务:在教育领域,大模型被应用于个性化学习、智能辅导、作业批改等,帮助教师减轻工作负担,提高教学质量。 3. 工业智能化:大模型有助于解决工业领域的复杂性和不确定性问题,尽管在认知能力方面尚未完全具备专家级的复杂决策能力。 4. 消费
            丙丁先生 2025-01-07 09:25 77浏览
          • PLC组态方式主要有三种,每种都有其独特的特点和适用场景。下面来简单说说: 1. 硬件组态   定义:硬件组态指的是选择适合的PLC型号、I/O模块、通信模块等硬件组件,并按照实际需求进行连接和配置。    灵活性:这种方式允许用户根据项目需求自由搭配硬件组件,具有较高的灵活性。    成本:可能需要额外的硬件购买成本,适用于对系统性能和扩展性有较高要求的场合。 2. 软件组态   定义:软件组态主要是通过PLC
            丙丁先生 2025-01-06 09:23 82浏览
          • 每日可见的315MHz和433MHz遥控模块,你能分清楚吗?众所周知,一套遥控设备主要由发射部分和接收部分组成,发射器可以将控制者的控制按键经过编码,调制到射频信号上面,然后经天线发射出无线信号。而接收器是将天线接收到的无线信号进行解码,从而得到与控制按键相对应的信号,然后再去控制相应的设备工作。当前,常见的遥控设备主要分为红外遥控与无线电遥控两大类,其主要区别为所采用的载波频率及其应用场景不一致。红外遥控设备所采用的射频信号频率一般为38kHz,通常应用在电视、投影仪等设备中;而无线电遥控设备
            华普微HOPERF 2025-01-06 15:29 125浏览
          • 这篇内容主要讨论三个基本问题,硅电容是什么,为什么要使用硅电容,如何正确使用硅电容?1.  硅电容是什么首先我们需要了解电容是什么?物理学上电容的概念指的是给定电位差下自由电荷的储藏量,记为C,单位是F,指的是容纳电荷的能力,C=εS/d=ε0εrS/4πkd(真空)=Q/U。百度百科上电容器的概念指的是两个相互靠近的导体,中间夹一层不导电的绝缘介质。通过观察电容本身的定义公式中可以看到,在各个变量中比较能够改变的就是εr,S和d,也就是介质的介电常数,金属板有效相对面积以及距离。当前
            知白 2025-01-06 12:04 167浏览
          • 根据Global Info Research项目团队最新调研,预计2030年全球封闭式电机产值达到1425百万美元,2024-2030年期间年复合增长率CAGR为3.4%。 封闭式电机是一种电动机,其外壳设计为密闭结构,通常用于要求较高的防护等级的应用场合。封闭式电机可以有效防止外部灰尘、水分和其他污染物进入内部,从而保护电机的内部组件,延长其使用寿命。 环洋市场咨询机构出版的调研分析报告【全球封闭式电机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球封闭式电机总体规
            GIRtina 2025-01-06 11:10 103浏览
          • 彼得·德鲁克被誉为“现代管理学之父”,他的管理思想影响了无数企业和管理者。然而,关于他的书籍分类,一种流行的说法令人感到困惑:德鲁克一生写了39本书,其中15本是关于管理的,而其中“专门写工商企业或为企业管理者写的”只有两本——《为成果而管理》和《创新与企业家精神》。这样的表述广为流传,但深入探讨后却发现并不完全准确。让我们一起重新审视这一说法,解析其中的矛盾与根源,进而重新认识德鲁克的管理思想及其著作的真正价值。从《创新与企业家精神》看德鲁克的视角《创新与企业家精神》通常被认为是一本专为企业管
            优思学院 2025-01-06 12:03 113浏览
          • 在智能家居领域中,Wi-Fi、蓝牙、Zigbee、Thread与Z-Wave等无线通信协议是构建短距物联局域网的关键手段,它们常在实际应用中交叉运用,以满足智能家居生态系统多样化的功能需求。然而,这些协议之间并未遵循统一的互通标准,缺乏直接的互操作性,在进行组网时需要引入额外的网关作为“翻译桥梁”,极大地增加了系统的复杂性。 同时,Apple HomeKit、SamSung SmartThings、Amazon Alexa、Google Home等主流智能家居平台为了提升市占率与消费者
            华普微HOPERF 2025-01-06 17:23 141浏览
          • 根据环洋市场咨询(Global Info Research)项目团队最新调研,预计2030年全球无人机锂电池产值达到2457百万美元,2024-2030年期间年复合增长率CAGR为9.6%。 无人机锂电池是无人机动力系统中存储并释放能量的部分。无人机使用的动力电池,大多数是锂聚合物电池,相较其他电池,锂聚合物电池具有较高的能量密度,较长寿命,同时也具有良好的放电特性和安全性。 全球无人机锂电池核心厂商有宁德新能源科技、欣旺达、鹏辉能源、深圳格瑞普和EaglePicher等,前五大厂商占有全球
            GIRtina 2025-01-07 11:02 61浏览
          我要评论
          0
          点击右上角,分享到朋友圈 我知道啦
          请使用浏览器分享功能 我知道啦