赞
踩
断断续续花了两天的时间,从对树莓派和yolo一窍不通到实现了使用树莓派进行目标检测。其间大麻烦没有、小问题不断,遂决定将这一过程分享出来。在本文中我不会介绍原理,而是更注重实现的过程。
我将会分章节将这一过程讲完,包括数据的采集、模型的训练、如何部署到树莓派上等等。在本章节中,将会介绍如何在windows系统上准备数据集、训练模型、测试模型效果等过程。
该步需要用到anaconda配置虚拟环境,如若没有使用过anaconda可先搜索其他教程学习安装配置anaconda。
由于树莓派性能的限制,故而直接使用yolov5部署在树莓派上进行目标检测的速度会很慢,因此我们在此使用yolov5-lite作为我们的目标检测模型。
yolov5-lite是一个基于yolov5的轻量化目标检测模型,它通过一系列的消融实验,使得模型的Flops更小,内存占用更低,参数更少,同时也提高了推理速度和部署的便利性。
yolov5-lite的GitHub链接为:https://github.com/ppogg/YOLOv5-Lite。进入该网页,下载并解压项目文件。
下载并解压项目文件,可以在文件夹“YOLOv5-Lite-master”中看到以下这些文件和文件夹:
android_demo
cpp_demo
data
detect.py
export.py
LICENSE
models
python_demo
README.md
requirements.txt
scripts
test.py
train.py
utils
打开anaconda prompt,输入以下命令创建、激活名为yolov5的虚拟环境:
conda create --name yolov5 python=3.8
activate yolov5
继续在anaconda prompt中操作,我的文件目录为“E:\yolo\YOLOv5-Lite-master”,输入以下命令进入文件夹“YOLOv5-Lite-master”。
cd /d E:\yolo\YOLOv5-Lite-master
使用pip安装库:
pip install -r requirements.txt
国内网络下载速度较慢,可以将下载的地址换源为国内的镜像网站,如:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ -r requirements.txt
此处不知什么原因我直接运行命令“pip install -r requirements.txt”会出错,遂将“requirements.txt”里要求的库一个一个安装了…
配置完环境以后便可以通过运行detect.py进行测试。在运行前,我们进入yolov5-lite的GitHub链接:https://github.com/ppogg/YOLOv5-Lite,下拉找到大标题“·Model Zoo·”下小标题“Download Link:”下载预训练模型,项目作者提供了多种预训练模型,这里我们找到“v5lite-s.pt”并点击下载。模型下载好后,进入“YOLOv5-Lite-master”文件夹中新建文件夹,并命名为“weights”,并将刚刚下载好的预训练模型“v5lite-s.pt”移至该文件夹下。
另外,我们还需要在“YOLOv5-Lite-master”文件夹下新建文件夹,并命名为“sample”,在该文件夹下放入记账图片,供detect.py使用。
yolov5-lite修改自项目yolov5,测试用图片可在yolov5项目文件的该路径“yolov5/data/images”中找到,当然也可以自己找几张图片进行测试。
此时“YOLOv5-Lite-master”文件夹中有有如下文件及文件夹,可以看到新增了两个文件夹,分别是文件夹“sample”——装有测试用的图片,还有文件夹“weights”——装有预训练模型“v5lite-s.pt”。
android_demo cpp_demo data detect.py export.py LICENSE models python_demo README.md requirements.txt sample scripts test.py train.py utils weights
detect.py程序中的参数均可在149~169行的如下代码中进行修改:
if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--weights', nargs='+', type=str, default='weights/v5lite-s.pt', help='model.pt path(s)') parser.add_argument('--source', type=str, default='sample', help='source') # file/folder, 0 for webcam parser.add_argument('--img-size', type=int, default=640, help='inference size (pixels)') parser.add_argument('--conf-thres', type=float, default=0.45, help='object confidence threshold') parser.add_argument('--iou-thres', type=float, default=0.5, help='IOU threshold for NMS') parser.add_argument('--device', default='', help='cuda device, i.e. 0 or 0,1,2,3 or cpu') parser.add_argument('--view-img', action='store_true', help='display results') parser.add_argument('--save-txt', action='store_true', help='save results to *.txt') parser.add_argument('--save-conf', action='store_true', help='save confidences in --save-txt labels') parser.add_argument('--nosave', action='store_true', help='do not save images/videos') parser.add_argument('--classes', nargs='+', type=int, help='filter by class: --class 0, or --class 0 2 3') parser.add_argument('--agnostic-nms', action='store_true', help='class-agnostic NMS') parser.add_argument('--augment', action='store_true', help='augmented inference') parser.add_argument('--update', action='store_true', help='update all models') parser.add_argument('--project', default='runs/detect', help='save results to project/name') parser.add_argument('--name', default='exp', help='save results to project/name') parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment') opt = parser.parse_args() print(opt) check_requirements(exclude=('pycocotools', 'thop'))
不过我们这里无需修改什么,直接运行detect.py。如若环境配置完成,则程序顺利进行运行,结果将会保存至“runs\detect\expx”。
运行结果如下图所示:
该步骤中我们需要一个与电脑连接的摄像头,并运行以下python程序对我们需要进行检测的图片进行目标采集:
import cv2 import time cap = cv2.VideoCapture(1) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) while True: ret, frame = cap.read() cv2.imshow('H65 USB CAMERA', frame) if cv2.waitKey(1) & 0xFF == ord('a'): filename = 'image_' + time.strftime('%Y%m%d-%H%M%S') + '.jpg' cv2.imwrite(filename, frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
由于我在此使用的是USB摄像头,因此cap = cv2.VideoCapture(1)中参数为1,若使用笔记本电脑自带的摄像头,将改行代码改为:
cap = cv2.VideoCapture(0)
该程序的功能为按下键盘‘a’键后,保存摄像头所拍摄的图像。
我希望实现的是对可乐进行目标检测,所以我拍摄了100张可乐的图片:
在此我一开始使用的是python的库labelme进行数据标注,但labelme输出的标签并不符合yolov5的要求,因此还需要对标签进行一次格式转换,很麻烦。
后面我转而使用labelimg进行数据标注,该库的使用方法与labelme几乎一模一样,唯一的区别在于labelimg可以直接输出符合yolov5要求的标签,方便很多。
输入以下命令行进入环境、安装labelimg、打开labelimg:
activate yolov5
pip install labelimg
labelimg
关于使用labelimg进行数据标注的方法我在此不过多介绍,bilibili上有许多视频教学,5min即可学会。总之,完成数据标注后,我们的文件夹结构如下所示:
cola
└─train
├─images
└─labels
其中images是我们前一步中采集的图片,labels中是我们标注的标签数据(即labelimg标注后的输出)。
关于模型训练《基于树莓派4B的YOLOv5-Lite目标检测的移植与部署(含训练教程)》中介绍很详细,在此不过多赘述。
训练的过程中有可能遇到报错:
yolov5运行train.py时报错[WinError 1455] 页面文件太小,无法完成操作。 Error loading “D:\anaconda\envs\yolov5\lib\site-packages\torch\lib\caffe2_detectron_ops_gpu.dll” or one of its dependencies.
在文章《YOLO系列——WinError 1455] 页面文件太小,无法完成操作_Star星屹程序设计的博客-CSDN博客》中有多种解决方案,我是通过其中”修改yolov5代码,修改文件在 yolov5\utils\datasets.py,修改参数 num_workers为0“的方法解决了此问题。
并且,在配置训练集与验证集的地址时,由于我懒得搞验证集,因此验证集的地址放的是训练集的地址,虽然这导致了训练效果变差,但跑出来的模型同样也可以使用。作为参考,配置文件cola.yaml内容如下:
#cola.yaml
# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: E:/yolo/dataset_bundle/cola/train/images
val: E:/yolo/dataset_bundle/cola/train/images
# number of classes
nc: 1
# class names
names: [ 'cola']
训练完成后,会在”YOLOv5-Lite-master\runs\train“保存训练结果,其中包括训练得到的模型权重,分别是历史最佳best.pt和最后一次训练的权重last.pt,我们将best.pt复制到之前创建的文件夹“weights”中。
打开detect.py,找到主函数入口,并且修改底下两行(150行、151行)参数如下:
parser.add_argument('--weights', nargs='+', type=str, default='weights/best.pt', help='model.pt path(s)')
parser.add_argument('--source', type=str, default='1', help='source') # file/folder, 0 for webcam
其中,修改第一行参数以使用我们自己训练出来的权重,修改第二行参数是为了打开摄像头,进行实时的目标检测。后运行detect.py程序,可以看到运行结果如下面视频所示:
parser.add_argument('--weights', nargs='+', type=str, default='weights/cola_best.pt', help='model.pt path(s)')
parser.add_argument('--source', type=str, default='1', help='source') # file/folder, 0 for webcam
其中,修改第一行参数以使用我们自己训练出来的权重,修改第二行参数是为了打开摄像头,进行实时的目标检测。后运行detect.py程序,可以看到运行结果如下面视频所示:
yolov5-lite检测百事可乐
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。