好久不见。
上俩星期开学复习补考去了,所以没更。。。嘤嘤嘤,今天考完啦。

我在识别眼镜和长头发特征的时候用的yolov5

主要是环境比较好搭建,效果也比较好,修改方便。
省赛的时候,我是直接训练的识别眼镜和长头发,比较老实,在网上爬虫爬了九千多张图片去训练的,效果还是相当不错滴。
国赛改为识别不同的人物姿态了,八个不同的人物模型做八个不同的标签,大概搜刮了4000多张图片训练的。效果神奇,图片稍微模糊一点识别效果也很好。

再来说说关于环境搭建

首先车上的jetpack不能升级,我之前升级过,然后声卡无了,又刷回去了。
关于jetpack升级看这几个链接
https://docs.nvidia.com/jetson/archives/l4t-archived/l4t-325/index.html#page/Tegra%20Linux%20Driver%20Package%20Development%20Guide/updating_jetson_and_host.html#wwpID0E06B0HA
\\\\\\

https://docs.nvidia.com/jetson/jetpack/install-jetpack/index.html#upgrade-jetpack
\\\\\\

https://developer.nvidia.com/embedded/jetpack-archive
\\\\\\\
所以我是拿CPU硬跑的,搭建的环境也是pytorch的CPU版本。
上github,yolov5

照着这个上面,jetsonnano上的python版本是3.6是够的,但是我比较推荐不要用pip install -r requirements.txt这个命令,一个一个照着requirements.txt里的东西pip install最好,要注意是python3.6的pip。
还有一个要注意的地方
pytorch要1.8版本最好,小车是arm64平台有一个1.9版本的,那个不行。我们安装1.8版本,不然会报错。

关于gpu加速

利用GPU在小车环境上的加速识别主要有两个方法,cuda和tensorrt。
先说tensorrt
这个是用王鑫宇大佬的开源工具最好啦,gitub上有https://github.com/wang-xinyu/tensorrtx。。然鹅车上的trt版本是5.4但是这个里面yolov5对应需要trt 7版本以上,所以用不了啦。

再说torch cuda
是这样子子的,在github主页上看到python版本得在3.6以上,同时pytorch版本要1.7以上。要通过gpu cuda加速需要安装对应的pytorch gpu版本,我去pytorch官网逛了一下https://pytorch.org/get-started/previous-versions/https://download.pytorch.org/whl/torch/

后缀带类似于cu102的是gpu版本,车上是aarch64环境,发现只有相关的cpu版本,我直接pip下载的1.8版本,实际上对应的是列表里的torch-1.8.0-cp36-cp36m-manylinux2014_aarch64.whl
但是nvidia官网有对应的 pytorch cuda版本,https://forums.developer.nvidia.com/t/pytorch-for-jetson-version-1-9-0-now-available/72048
这似乎是一个突破口,但是我发现torch1.7以上的版本对应的jetpack版本是4.4,但是车上的是4.2版本,4.2版本对应的最高pytorch版本是PyTorch v1.4.0。
所以问题就是,车上如果通过torch gpu加速,PyTorch最高版本只能到v1.4.0,但是yolov5需要PyTorch 1.7以上。
嗯,实际上我是有错误的
说白了就是github玩儿的不熟,没有注意发行版本,实际上我之前都是直接git clone https://github.com/ultralytics/yolov5.git 下载的master分支,但是一般来说发行版会更加稳定,同时有许多发行版可以做选择。
git clone -b v5.0 https://github.com/ultralytics/yolov5.git 类似于这样子可以克隆对应发行版的标签的仓库。

我可以看到yolov5 v1.0是可以通过PyTorch v1.4.0环境的,也就是说,可以通过torch cuda加速
以上内容是省赛完成后浙江科技大学的同学跟我在交流过程中提到过的,他们是这样子干的,我当时没有去大改这些,毕竟省赛后没几天就国赛了,我怕大改这个框架和环境会带来新的问题,不过这个是经过他们尝试的,速度上确实快很多,重点是节省出了cpu资源。

再来聊聊省赛方案

省赛方案就是简单直接,识别效果也很好,没有出现过识别不对的情况。
先看代码吧,对应/src/yolo/src/yolov5-develop/detect1.py,我的方案分几步:
拍照图片保存在/src/opencv_test/src/yoloP/,里面是我要识别的原始图片
(原图找不到啦)
先通过官方模型去识别人物,识别情况放到/src/opencv_test/src/yolo_debug/person/文件夹下面方便调试。输入图片大小为160像素大小,这样子一张图处理需要0.5s左右。

然后剪切出人的头部,存到/home/ucar/ucar_ws/src/opencv_test/src/yolo/,注意我剪裁的图像大小是320*320大小

然后识别/home/ucar/ucar_ws/src/opencv_test/src/yolo/文件夹下的图片,得到眼镜、长头发的特征数量。输入图片大小为320像素大小,这样子一张图处理需要0.8s左右。

这样子就over了。

下面说几个东西

  1. 首先为什么要去费那么大劲去把头给剪裁出来,这个最主要原因是为了保证图片细节不被压缩。如果按照直接识别,图片输入1080p大小是最好的图片不会被压缩,但是1080p大小一张图片耗时在7s左右。如果想识别耗时少就得将输入图片大小改小,比如480p左右,但是这样子会压缩图片,本来眼镜就模糊,一压缩那就直接没法儿识别啦。但是剪裁出来后对图片是没有压缩的,既能保证图片不被压缩,又保证我的识别速度是我要做的。

  2. 还有就是关于图片输入大小设置,为什么是160和320。这个考虑识别速度,我是用cpu跑的,图片输入大了会很慢,160大小保证我识别人物准确,320大小则是保证剪裁出来的图像不被压缩保证特征识别准确。

  3. 关于准确程度,我可以很肯定地说,如果拍照不是斜得非常厉害,识别还没翻过车。博客里面的图片比较清晰,实际上没那么清晰识别效果也很好,只是我没有保存这些,只找到了上面的图片。比赛的时候识别都是对的。

再看国赛方案

国赛是邮寄车,而且多了两个摆放点,如果按照之前省赛的方案我得拍5张照片,按照每张1.5s来算我需要8s多时间去处理,而赛题要求10s内出结果,我认为风险很大,而且国赛调试时间也只有10分钟还是远程调,我必须保证识别足够稳定,但是省赛的方案说实话受摆放的影响比较大,所以最终将识别方案改为了一个姿势识别。
对应/src/yolo/src/yolov5-develop/detect2.py
这个就比较简单粗暴了,拍图、识别,具体看一眼代码就能理清楚。

关于cpu资源

如果拿cpu跑的话,识别会直接占满cpu。所以需
而且还不够,我停车后识别需要的时间比我单独运行识别代码的识别时间长很多。、
所以是停车后依旧运行的程序进程什么的占用了cpu资源导致这个情况的。
我的干法也比较粗糙,我自己写的代码,就是roslaunch control_test control_test.launch和roslaunch yolo yolo.launch对应的代码。
里面都加了一句exit(EXIT_SUCCESS);这句话,到达终点后运行这个关闭我写的程序,确实能节约许多资源,让识别快许多。

晚安~