当前位置:   article > 正文

小白也能学会的从零开始的树莓派yolov5目标检测(一)—— 数据采集与模型训练_目标检测树莓派

目标检测树莓派

小白也能学会的从零开始的树莓派yolov5目标检测(一)—— 数据采集与模型训练

断断续续花了两天的时间,从对树莓派和yolo一窍不通到实现了使用树莓派进行目标检测。其间大麻烦没有、小问题不断,遂决定将这一过程分享出来。在本文中我不会介绍原理,而是更注重实现的过程。

我将会分章节将这一过程讲完,包括数据的采集、模型的训练、如何部署到树莓派上等等。在本章节中,将会介绍如何在windows系统上准备数据集、训练模型、测试模型效果等过程。

1. 环境配置

该步需要用到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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

打开anaconda prompt,输入以下命令创建、激活名为yolov5的虚拟环境:

conda create --name yolov5 python=3.8
activate yolov5
  • 1
  • 2

继续在anaconda prompt中操作,我的文件目录为“E:\yolo\YOLOv5-Lite-master”,输入以下命令进入文件夹“YOLOv5-Lite-master”。

cd /d E:\yolo\YOLOv5-Lite-master
  • 1

使用pip安装库:

pip install -r requirements.txt
  • 1

国内网络下载速度较慢,可以将下载的地址换源为国内的镜像网站,如:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ -r requirements.txt
  • 1

此处不知什么原因我直接运行命令“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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

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'))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

不过我们这里无需修改什么,直接运行detect.py。如若环境配置完成,则程序顺利进行运行,结果将会保存至“runs\detect\expx”。

运行结果如下图所示:
在这里插入图片描述

2.数据集采集

2.1 图片采集

该步骤中我们需要一个与电脑连接的摄像头,并运行以下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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

由于我在此使用的是USB摄像头,因此cap = cv2.VideoCapture(1)中参数为1,若使用笔记本电脑自带的摄像头,将改行代码改为:

cap = cv2.VideoCapture(0)
  • 1

该程序的功能为按下键盘‘a’键后,保存摄像头所拍摄的图像。

我希望实现的是对可乐进行目标检测,所以我拍摄了100张可乐的图片:

在这里插入图片描述

2.2 数据标注

在此我一开始使用的是python的库labelme进行数据标注,但labelme输出的标签并不符合yolov5的要求,因此还需要对标签进行一次格式转换,很麻烦。

后面我转而使用labelimg进行数据标注,该库的使用方法与labelme几乎一模一样,唯一的区别在于labelimg可以直接输出符合yolov5要求的标签,方便很多。

输入以下命令行进入环境、安装labelimg、打开labelimg:

activate yolov5
  • 1
pip install labelimg
  • 1
labelimg
  • 1

关于使用labelimg进行数据标注的方法我在此不过多介绍,bilibili上有许多视频教学,5min即可学会。总之,完成数据标注后,我们的文件夹结构如下所示:

cola
└─train
    ├─images
    └─labels
  • 1
  • 2
  • 3
  • 4

其中images是我们前一步中采集的图片,labels中是我们标注的标签数据(即labelimg标注后的输出)。

3.模型训练

关于模型训练《基于树莓派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']
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

4.测试

训练完成后,会在”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
  • 1
  • 2

其中,修改第一行参数以使用我们自己训练出来的权重,修改第二行参数是为了打开摄像头,进行实时的目标检测。后运行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
  • 1
  • 2

其中,修改第一行参数以使用我们自己训练出来的权重,修改第二行参数是为了打开摄像头,进行实时的目标检测。后运行detect.py程序,可以看到运行结果如下面视频所示:

yolov5-lite检测百事可乐

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/140388
推荐阅读
相关标签
  

闽ICP备14008679号