回顾2023,有为了一个BUG或知识熬过夜,也有为了项目连续几天三点一线,在这期间的积累的一砖一瓦中,除了直接获得专业知识,提高专业技能外,更多的是从项目中得到足以使我终生受益的其他收获。 下面就一今年收获最多的项目来总结我的2023
————————————————————————————————
一次在刷短视频的时候,看到一个把区域框起来,有人进入区域的话就把会报警,如果人离开区域外就不会报警,精准的识别了需要看守的区域,而不是监控画面的全部。
看完之后我就想自己能不能做一个这样的,于是我便开始上网查阅资料,根据自己对视觉的理解开始着手起来。
我想到的是用Opencv鼠标事件作为交互的手段,并且用OpenCV的混合高斯模型背景建模实现动态检测,这种方案原理就是对后一帧和前一帧进行比较,不一样的点视为动态点,可以检测到特定区域内的动态物体,总是实现较为简单。便开始编写程序上机测试。
上机测试之后,缺点明显,不能缺定动态物体为人类,极易受其他的东西干扰,保护不了动态物体。
在发现以上问题之后决定开始寻求解决办法于是就开始使用YOLOv5深度神经网络,来寻求更加精确的检验。具体思路是用把人类当做目标,转化为目标检测问题,目标检测当下流行方法是深度学习。深度学习可以准确的区分出人类,并且可以精准抓拍人类,避免其他的东西干扰,随着计算机的算力发展,深度学习由于其优秀的性能,在众多目标算法中脱颖而出,得到了广泛的应用。
由于神经网络需要训练,服务器上需要训练需要建立docker环境来避免干扰到其他项目同时也能独立的进行训练,于是开始学习docker的使用方法。
安装docker:
curl -fsSL https://test.docker.com -o test-docker.sh
sudo sh test-docker.sh
拉取镜像
docker pull ubuntu
运行容器
docker run -it ubuntu /bin/bash
退出容器:
使用 exit 命令退出容器
主机内容传入 Docker 容器:
docker run -it -v /host/path:/container/path ubuntu /bin/bash
这会将主机上的 /host/path 映射到容器内的 /container/path。
要将容器内的文件或目录传递到主机上,可以使用 docker cp 命令。首先,确定容器的ID或名称,然后执行以下命令:
docker cp <container_id_or_name>:/container/path /host/path
这将从容器中复制 /container/path 到主机上的 /host/path。
学习这些基本思路之后我开始训练模型
训练好了之后开始测试刚开始似乎结果不是那么好,于是开始修改网络,以及训练的方法。
开始查阅资料最终决定采用改进Mosaic9,增强小目标的检测。
受YOLOv5算法中Mosaic增强的启发,本设计进一步拓展了这一方法,采用了Mosaic9增强技术。在Mosaic9中,将9张图片随机裁剪并拼接成一张大图,以此来增强神经网络对小目标的区分能力和提升模型的泛化能力。
通过使用更多的图像样本进行拼接,Mosaic9增强技术可以提供更多的视觉上下文信息,使得模型在训练过程中能够更好地理解不同目标之间的相互关系。这对于小目标的检测和分类尤为重要,因为小目标往往具有更少的可见特征,需要依靠周围环境的上下文来进行准确的预测。[6]
此外,Mosaic9增强技术还可以帮助提升模型的泛化能力。通过将多个场景和不同角度的图像合并到一张训练图像中,模型可以学习到更多的变化和复杂性,从而更好地适应各种不同的测试数据。这有助于减少过拟合的风险,并提高模型在现实世界中的实际应用效果,Mosaic9增强技术是一种强大的数据增强方法,通过拼接多个随机裁剪的图像,为神经网络提供了更丰富的信息和更广泛的视野。这种增强方法可以改善模型对小目标的检测和分类能力,并提升模型的泛化能力,使其更适用于各种真实场景中的目标识别任务。
增强之后效果有明显的提升。
在utils/dataloaders.py,找到mosaic板块
mosaic = self.mosaic and random.random() < hyp['mosaic']
if mosaic:
# Load mosaic
img, labels = load_mosaic(self, index) # use load_mosaic4
shapes = None
# MixUp augmentation
if random.random() < hyp['mixup']:
img, labels = mixup(img, labels, *load_mosaic(self, random.randint(0, self.n - 1)))
把:
img, labels = load_mosaic(self, index)
和
img, labels = mixup(img, labels, *load_mosaic(self, random.randint(0, self.n - 1)))
改为:
img, labels = load_mosaic9(self, index)
和
img, labels = mixup(img, labels, *load_mosaic9(self, random.randint(0, self.n - 1)))
为了更加贴近实际,决定给这个小项目落地。于是我选择了jetson Nano这块开发板进行部署
考虑到行人检测的实际应用场景和需求,选择将模型部署于嵌入式开发平台,其中NVIDIA公司的jetson Nano是一个理想的选择。
jetson Nano是一款功能强大的小型计算机,它具备强大的计算能力,jetson Nano搭载了NVIDIA的GPU,拥有128个CUDA核心,可以提供高性能的计算能力,能够并行运行多个神经网络模型,实现实时的行人检测任务;jetson Nano广泛应用于图像分类、物体检测、图像分割、语音处理等各种应用场景。它适用于多个行业领域,如智能安防、无人驾驶、机器人技术等;jetson Nano提供了简单易用的开发环境和工具,使开发人员能够快速搭建和部署深度学习模型。它支持常用的深度学习框架,如TensorFlow、PyTorch等,开发人员可以选择他们熟悉的框架进行模型的开发和训练;jetson Nano的功耗仅为5瓦,具有出色的能效比。这使得它非常适合部署在资源有限的嵌入式设备中,如智能摄像头等,实现高效的行人检测任务。
Jetson Nano搭载的是Ubuntu系统,烧录的是英伟达的镜像。
从GitHub上下载源码文件夹,查看requiremen.txt安装YOLOv5所需要的运行环境,使用pip进行安装,值得注意的是pythorch和thorchvision版本要对应,
命令行输入:
sudo apt-get install python3-pip libopenblas-base libopenmpi-dev libomp-dev
pip3 install Cython
pip3 install numpy torch-1.8.0-cp36-cp36m-linux_aarch64.whl
接着下载对应版本的torchvision,并输入命令:
sudo apt-get install libjpeg-dev zlib1g-dev libpython3-dev libavcodec-dev libavformat-dev libswscale-dev
cd torchvision
export BUILD_VERSION=0.9.0 #python3 setup.py install --user
cd ../
pip install 'pillow<7'
安装完成后其余的库用pip安装。运行代码缺谁装谁,在安装完成以后开始测试环境是否搭建成功,使用YOLO官方提供的权重和图片进行测试,测试结果如下,YOLOv5代码运行正常,表示部署成功。
接着把代码部署在上面即可。
到这里这个项目就结束了,在这个项目中我学习到了docker的用法,进一步熟悉了Ubuntu系统的使用,同时也学会了改进YOLOv5使其提高精度,比项目本身更重要的是通过项目学习到的东西。
不忘初心,不念过往,不惧将来