目录
前言
📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
大家好,这里是海浪学长毕设专题,本次分享的课题是
🎯基于机器视觉的安全帽佩戴识别
课题背景和意义
随着人工智能的发展,现在越来越多的场景需要人工智能。在工厂的厂区中以安全为首,但工人普遍缺乏佩戴安全帽意识;工厂环境复杂,有各种各样的禁止进入的区域,普通的图像识别算法很难实现;加上使用传统的人工监管存在诸多缺点。
基于计算机视觉的安全帽自动识别技术设计通过在施工现场布设视频监控设备或利用现有的施工监控设备,采用机器视觉的相关方法进行安全帽的自动识别,可以实现对作业人员安全帽佩戴情况信息的全程快速识别,在降低监管费用的同时提升了监管信息化水平。
实现技术思路
NAS算法
NAS 算法是自动机器学习领域的热点算法之 一,可通过数据特征自动找到合适的神经网络架 构[9] 。该算法的原理是光定义搜索空间;然后,通 过搜索策略找出候选网络架构,对候选网络进行评 估;最后,根据评估结果进行下一轮的搜索。由于 NAS 的根本思想是探索各种潜在的解决方案,搜 索空间越大,需要训练与评估的架构就越多,消耗 的资源与时间就越多。因此,搜索空间的设定将直 接影响计算开销。目前 NAS 的主流设计方法为先 基于单元 (cell) 的架构进行设计,再将单元堆叠 在主干网络上,构成整体网络架构,并由此限制搜 索空间大小。换言之,大型网络是由多个单元组成 的,而单元的结构是由整个网络共享的[10] ,因此主 干网络的选择也十分重要。
目前主流的目标检测算法是 Fast r-cnn[11] 系列 算法,首先使用神经网络生成待检测预选定位框, 再对预选定位框进行调整和分类,属于两阶段算 法,虽然精度高,但实时性不强。而YOLO (You Only Look Once)[12] 系列的一阶段算法采用了回归 的思想,直接在图像上回归出预选定位框,同时预 测预选定位框所属类别。YOLO 系列算法的检测 精度虽然略低于 Fast r-cnn 系列,但是运行速度 快,能够很好地完成实时目标检测任务。另外,还 有 SSD (Single Shot MultiBox Detector)[13] 算法,结合了回归思想和预选定位框机制,使得检测速度和准确率都得到提升。YOLO 系列算法经过不断 更新,其中 YOLOv3[14] 结合了多种网络设计技 巧,包括了SSD算法中的多尺度特征融合策略[15] , 进一步提高了网络的检测性能。因此,本文以 YOLOv3 为基础框架,设计了基于神经网络架构 搜 索 的 YOLO 网 络 , 即 NAS-YOLO。 NASYOLO由2种单元架构组成,分别是下行单元和上 行单元,并通过基于单元的搜索方式,确定其最终 网络拓扑结构。
数据集
学长在这里找到了一份数据集可以作为参考
环境准备
Python>=3.7
Pytorch==1.5.x
PyQt5==5.15.3
PyQtChart==5.15.3
PyQt5-tools
GPUtil
训练自己的数据
# 训练集和验证集的 labels 和 image 文件的位置
train: ./score/images/train
val: ./score/images/val
# number of classes
nc: 3
# class names
names: ['person', 'head', 'helmet']
创建每个图片对应的标签文件
- 每一行都是一个目标
- 类别序号是零索引开始的(从0开始)
- 每一行的坐标
class x_center y_center width height
格式 - 框坐标必须采用归一化的 xywh格式(从0到1)。如果您的框以像素为单位,则将
x_center
和width
除以图像宽度,将y_center
和height
除以图像高度。
import numpy as np
def convert(size, box):
"""
将标注的 xml 文件生成的【左上角x,左上角y,右下角x,右下角y】标注转换为yolov5训练的坐标
:param size: 图片的尺寸: [w,h]
:param box: anchor box 的坐标 [左上角x,左上角y,右下角x,右下角y,]
:return: 转换后的 [x,y,w,h]
"""
x1 = int(box[0])
y1 = int(box[1])
x2 = int(box[2])
y2 = int(box[3])
dw = np.float32(1. / int(size[0]))
dh = np.float32(1. / int(size[1]))
w = x2 - x1
h = y2 - y1
x = x1 + (w / 2)
y = y1 + (h / 2)
x = x * dw
w = w * dw
y = y * dh
h = h * dh
return [x, y, w, h]
选择一个需要的模型
# parameters
nc: 3 # number of classes <============ 修改这里为数据集的分类数
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple
# anchors
anchors:
- [10,13, 16,30, 33,23] # P3/8
- [30,61, 62,45, 59,119] # P4/16
- [116,90, 156,198, 373,326] # P5/32
# YOLOv5 backbone
backbone:
# [from, number, module, args]
[[-1, 1, Focus, [64, 3]], # 0-P1/2
[-1, 1, Conv, [128, 3, 2]], # 1-P2/4
[-1, 3, BottleneckCSP, [128]],
[-1, 1, Conv, [256, 3, 2]], # 3-P3/8
[-1, 9, BottleneckCSP, [256]],
[-1, 1, Conv, [512, 3, 2]], # 5-P4/16
[-1, 9, BottleneckCSP, [512]],
[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
[-1, 1, SPP, [1024, [5, 9, 13]]],
[-1, 3, BottleneckCSP, [1024, False]], # 9
]
# YOLOv5 head
head:
[[-1, 1, Conv, [512, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 6], 1, Concat, [1]], # cat backbone P4
[-1, 3, BottleneckCSP, [512, False]], # 13
[-1, 1, Conv, [256, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 4], 1, Concat, [1]], # cat backbone P3
[-1, 3, BottleneckCSP, [256, False]], # 17
[-1, 1, Conv, [256, 3, 2]],
[[-1, 14], 1, Concat, [1]], # cat head P4
[-1, 3, BottleneckCSP, [512, False]], # 20
[-1, 1, Conv, [512, 3, 2]],
[[-1, 10], 1, Concat, [1]], # cat head P5
[-1, 3, BottleneckCSP, [1024, False]], # 23
[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
]
实现效果图样例
我是海浪学长,创作不易,欢迎点赞、关注、收藏、留言。
毕设帮助,疑难解答,欢迎打扰!