这一周看了很多的关于YOLO算法布置的教程,本文将会拿出一些认为为对代码布置有用的文章视频进行记录总结,记录从0开始布置图像识别的教程。文章包括三部分,分别是Github使用、Python环境配置和安全帽检测项目实操。
Github 使用
学习github网站使用:还不会使用 GitHub ? GitHub 教程来了!万字图文详解 - 知乎 (zhihu.com)
这篇文章中整体逻辑和讲解比较容易看懂,包括Github 网站的功能,Github 的下载和一些使用的方式,比如目前常使用的功能,下载源码到本地,举例:
完整操作,以安全帽识别为例共有两种方法
第一种:键盘操作打开window+R 输入cmd,进入想要下载github代码的位置
复制Github 网站的链接,输入 '''git clone https://目标github网址.git''' 代码,提示下载成功
直接复制代码用就行↓↓↓↓
git clone https://github.com/PeterH0323/Smart_Construction
打开文件夹查看是否安装成功。
第二种方式是在Releases中,找到作者已经打包好的文件,直接下载后在电脑中解压。
和第一种相比各有利弊,有的作者懒得整理压缩包。
Python环境配置
因为之前用python的时候,都是嫌配置环境比较麻烦,所以一直没有系统学习,但是以后要总用到了,所以还是系统的看了下文章和教程。
从0开始运行YOLOV5:1、YOLOV5 CPU运行环境搭建_哔哩哔哩_bilibili
b站的这个视频讲的还是不错的,加上一些文章的补充就够用了。
首先先捋顺一下逻辑,要配置环境最简单的就是下载已经集成好的模块,比如说是Anaconda3,因为有的项目需要使用python=3.7,有的需要使用python=3.10,要是每次都单独下载太麻烦了,使用Anaconda3就可以减少这种麻烦;后续要使用的包也选择集成的比如Ultralytics(YOLO各个版本项目集成一键下载,包含torchs等小包),如果没有这种大的集成,就去翻翻项目所使用的requirements.txt文件,也能一键配置。
比如使用YOLOv5和YOLOv8为例,虽然环境都是一个系列大同小异,但是为了保险起见,还是将他们的分开配置,就需要建两个环境。
键盘操作打开window+R 输入cmd
后续要涉及下载,先都设置为国内的下载源,谁快用谁,这个是清华的:
#设置清华下载源:
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --set show_channel_urls yes
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
接下来依次输入代码
#建立环境与需要的py版本
conda create -n safehat python=3.10
#检查环境是否安装成功
conda info -e
#激活新的环境
activate safehat
#若有大集成,就直接安装环境中需要的库,比如YOLO
pip install ultralytics
#若有的是requirements.txt,就输入以下代码
pip install -r requirements.txt
环境建好以后就可以配置了,我的是Pycharm,左上角【文件】→【打开(选择要项目文件夹)】→【设置】→【python解释器】→【设置标志,添加】→【Conda】→【现有环境】→【文件夹路径如图,配置的环境在Anaconda3/envs下】
然后查看一下自己配置好的环境中的包对不对,要是没有问题,就可以跑项目了。
安全帽检测项目实操
这个链接是基于yolov5来检测安全帽,里面涉及到一些模块在未来也是可以使用的,比如说VOC格式的数据集转换成YOLOv5训练需要用到的格式、数据文件的排列树方式、与后面的可视化部分。
在学习的过程中,再阅读多篇的文章后,学习到,在CPU上运行的YOLOv5在部分能力上要强于YOLOv8,仅仅是一小部分。But,在GPU上运行的YOLOv8,无论实在运行速度还是运行结果的准确性上,都要强于YOLOv5,那为什么不直接跑v8模型呢?
于是我就找到了这个课程②:基于yolov8,训练一个安全帽识别的目标检测模型_哔哩哔哩_bilibili
在这个视频中,作者讲明了如何操作能使得代码跑起来,短短十分钟全是干货。
数据集在Kaggle中下载获取。
因为是调包来完成,所以需要敲出启动代码。
safehat.yaml
下面代码最后一行,数据集有打了很多标签,比如Person之类的,我们只需要第0个和第2个就行了,就是带和不带安全帽,代码需要建 **.yaml的格式。
# 训练数据图片存储的位置
train: D:\Deeplearning\Helmet testing\archive\css-data\train\images
# 验证数据图片存储的位置
val: D:\Deeplearning\Helmet testing\archive\css-data\valid\images
# 测试数据图片存储的位置
test: D:\Deeplearning\Helmet testing\archive\css-data\test\images
# number of classes
nc: 10
# class names
#names: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
#Hardhat - 安全帽
#Mask - 口罩
#NO-Hardhat - 无安全帽
#NO-Mask - 无口罩
#NO-Safety Vest - 无安全背心
#Person - 人
#Safety Cone - 安全锥a
#Safety Vest - 安全背心
#machinery - 机械(挖掘机)
#vehicle - 车辆
names: [Hardhat, Mask, NO-Hardhat, NO-Mask, NO-Safety Vest, Person, Safety Cone, Safety Vest, machinery, vehicle]
yolo_train.py
接下来建训练启动代码,直接调用ultralytics中的YOLO走接口,'data='后面改成上一步建的*.yaml文件,最后再验证后,就能得到模型文件**.bt。
from ultralytics import YOLO # 导入Yolo模块
# 利用x yolo v8的预训练模型,这个模型是在yolov8训练了coco数据集训练的通用目标检测模型,
# 我们将它作为基础模型,在该模型的基础上,训练安全帽检测
model = YOLO('yolov8n.pt') # 加载预训练模型
# 训练用户自定义的数据集,数据的配置文件存放在safehat.yaml中,epochs参数不设为100代表训练100代
model.train(data='safehat.yaml', epochs=5)
# 使用验证集验证效果
model.val()
yolo_test.py
训练的启动代码建成后就可以开始了,但是为了完整性,我们一口气将测试的代码也完成,这部分不完全相同于教学视频中的代码,我进行了小小的更改。视频中是单个数据测试需要一个一个输入,但是我有一个文件夹的图片需要识别标注,所以我就把代码改为了遍历整个文件夹的形式。
from ultralytics import YOLO # 导入在训练中导入yolo模块
import os
import glob
# 导入训练好的模型best.pt
model = YOLO(r'D:\Deeplearning\Helmet testing\archive\runs\detect\train3\weights\best.pt')
# 定义包含源文件的目录
source_dir = r'D:\Deeplearning\Helmet testing\archive\source_files'
# 获取源目录中所有图像和视频文件的列表
file_types = ('*.jpg', '*.jfif', '*.mp4') # 根据需要添加或删除文件类型
files_grabbed = []
for files in file_types:
files_grabbed.extend(glob.glob(os.path.join(source_dir, files)))
# 对每个文件进行预测
for file in files_grabbed:
model.predict(file, save=True, classes=[0, 2], line_width=4)
最后文件夹应该是长这个样子的。
运行train代码,对模型进行训练,找到best.bt就是你训练出来最好的模型,再利用这个模型,对你输入的图片进行定位识别,因为我的电脑配置不是很ok,视频中的up跑了100轮用了一下午,我就只跑了五轮,花了一个半小时的时间,需要根据自己电脑配置量力而行.......
最后放一下跑的成果吧,视频图片都有,这里就只放下图片:
以上就是一周内学到的知识与安全帽的流程,到此也算是结束了。
这时候,我弟发来了消息
于是,我试试
安全帽是没识别出来,但是这..........