目录
前言
📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
选题指导:
大家好,这里是海浪学长毕设专题,本次分享的课题是
🎯基于深度学习的钢印字符检测算法系统
设计思路
一、课题背景与意义
压印字符通过字符模具对钢板压印所产生,具有不易磨损,可长期保存的优点,因此在工业制作上得到广泛使用。传统的人工记录方法需要大量的劳动力,不但耗时耗力,而且容易出现记录错误等问题。因此,研究钢印字符智能识别方法对于提高压印字符的实时识别速率有着积极的意义。
二、算法理论原理
2.1 YOLOv5算法
YOLOv5算法使用参数depth_multiple和width_multiple来调整主干网络的宽度和深度,从而得到4个版本的模型,分别是YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x。YOLOv5s是最简单的版本。它具有最小的模型参数和最快的检测速度。由以下部分组成: focus、Conv-Bn-Leakyrelu(CBL)和CSP1_x、CSP2_x和空间金字塔池化(SPP)模块。Focus模块主要包含4个平行切片层来处理输入图像。CBL模块包含一个卷积层、批量归一化层和hard-wish激活函数。CSP1_x块包含CBL块和x个剩余连接单元。CSP2_x块包含x个CBL块。SPP块主要包含3个maxpool层。
2.2 输出改进
虽然经过算法检测,可以得到钢印字符的种类,但是所得到的结果是乱序的,只有种类而无序列。因此,为了得到与钢印一致的生产编号,需要对检测到的字符位置信息进行排序,本研究采用冒泡排序法,对位置信息按从小到大顺序进行排序,从而把相对应的字符从左到右排列,从而得到准确的生产标号。
三、检测的实现
3.1 数据集
由于没有公开的钢印字符数据集,根据编码的编制要求,制作了相应的带有字符编号的试验部件,并用相机对整块部件拍摄图片。通过对已经打上字符编号的钢材部件进行拍摄,得到422张图像。
为了保证样本的多样性,使其符合现实生产过程中采集到的图像,对现有的数据集进行扩充。采用图像模糊化,图像加亮,图像变暗,图像加噪等方法对已有图像进行处理,从而得到2,110张图像,并将其作为数据集,其中1,855张作为训练集,255张作为测试集。
3.2 实验环境搭建
实验平台为PC端,PC配置为AMD Ryzen 7 3700X 8-Core Processor,显卡/GPU为NVIDIA GeForce RTX 3060,16GB运行内存。cuda版本是11.2,集成开发环境是Pycharm,编程语言是Anaconda Python 3.9。
YOLOv5x模型训练参数的设置,批处理大小(batch Size)设为8,迭代次数(epochs)设为100次,学习率(learning_rate)设为0.001。
3.3 实验及结果分析
在字符识别前需要对YOLOv5网络进行训练,而经过训练获得的网络模型的优劣程度将直接影响到识别的效果是否达到满意的程度。在对训练集进行训练时,YOLOv5网络通过计算损失函数CIOU_Loss来判断训练的效果。为了得到较好的训练效果,所需求的CIOU_Loss值越小越好。
使用YOLOv5网络进行训练得到的loss函数曲线如下图。在训练结束后,可得到包括最佳训练权重、字符识别混淆矩阵、各类标签个数等信息数据。
混淆矩阵元素:
训练结束后的P-R曲线如下图所示:曲线围起的面积即为AP值,可看到0~9每个类别的AP值均达到90%以上,mAP为所有类别AP均值,且达到97.4%,这表明采用YOLOv5网络分类得到的效果很好。
部分代码如下:
import cv2
import numpy as np
import tensorflow as tf
# 加载预训练的字符检测模型
model = tf.keras.models.load_model('character_detection_model.h5')
# 设置字符类别标签
class_labels = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']
# 打开钢印图像
image = cv2.imread('steel_stamp_image.jpg')
# 对图像进行预处理,如调整大小、归一化等
preprocessed_image = preprocess_image(image)
# 使用字符检测模型进行预测
predictions = model.predict(np.expand_dims(preprocessed_image, axis=0))
# 提取预测结果
character_class_ids = np.argmax(predictions, axis=1)
predicted_characters = [class_labels[class_id] for class_id in character_class_ids]
# 在图像上绘制识别结果
image = draw_characters(image, predicted_characters)
# 显示图像
cv2.imshow('Steel Stamp Character Detection', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
创作不易,欢迎点赞、关注、收藏。
毕设帮助,疑难解答,欢迎打扰!