毕业设计-基于机器视觉的车型识别系统

news2024/9/21 4:31:47

目录

前言

课题背景和意义

实现技术思路

实现效果图样例


前言


    📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。

🚀对毕设有任何疑问都可以问学长哦!

大家好,这里是海浪学长毕设专题,本次分享的课题是

🎯基于机器视觉的车型识别

课题背景和意义

在交通安防中,车型识别是一个重要的技术点,车型识别主要包括车辆检测、型号识别、颜色识别,基于视频的车型识别,还包括跟踪算法的设计。

实现技术思路

数据集准备与处理

拍摄尽可能多的车辆照片,主要为汽车、公共汽车、卡车三种类型,拍摄时尽可能从不同角度、不同场景、不同环境下采集图片,初次之外,每种类型车型的图片量尽可能相差不大。

数据标记

标注图片时,要时常查看标注的数据是否已经保存,并且要非常注意要勾选标注图片的类型

一定要生成指定的XML格式文件,此次主要是根据pascal xml数据制作数据标签

生成标签

object-class:是指对象的索引,从0开始,具体代表哪个对象去obj.names配置文件中按索引查,初次之外,每个txt文件可以有多个boundbox的信息,表示圈定的图片不是一个单一类。
x,y:是一个坐标,需要注意的是它可不是对象左上角的坐标,而对象中心的坐标
width,height:是指对象的宽高

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join

sets=[('2018', 'train'), ('2018', 'val')]

classes = ["car", "bus", "truck"] #设置分类车型


def convert(size, box): #此函数主要生成labels文件中归一化的值
    dw = 1./(size[0]) #用于归一化
    dh = 1./(size[1])
    x = (box[0] + box[1])/2.0 #找出对象的中心点坐标
    y = (box[2] + box[3])/2.0
    w = box[1] - box[0] # 得到真是的boundbox的长宽信息
    h = box[3] - box[2]
    x = x*dw #归一化
    w = w*dw
    y = y*dh
    h = h*dh
    return (x,y,w,h)

def convert_annotation(year, image_id):#解析XMl文件
    
    in_file = open('VOCdevkit/VOC%s/Annotations/%s.xml'%(year, image_id))
    out_file = open('VOCdevkit/VOC%s/labels/%s.txt'%(year, image_id), 'w')
    tree=ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)

    for obj in root.iter('object'):
        
        difficult = obj.find('difficult').text
        cls = obj.find('name').text #查找是不是我们自己的类
        
        if cls not in classes or int(difficult)==1:#跳过
            continue
            
        cls_id = classes.index(cls)#得到类别标签
        
        xmlbox = obj.find('bndbox')
        b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
        
        bb = convert((w,h), b)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')

#1.创建labels文件夹
for year, image_set in sets: #此处第一个循环训练集 第二个循环验证集
    if not os.path.exists('VOCdevkit/VOC%s/labels/'%(year)):
        os.makedirs('VOCdevkit/VOC%s/labels/'%(year))
        
#2.得到图片的id    
    image_ids = open('VOCdevkit/VOC%s/ImageSets/Main/%s.txt'%(year, image_set)).read().strip().split()
#3.创建训练集和验证集文件夹  
    list_file = open('%s_%s.txt'%(year, image_set), 'w')
#4.创建绝对路径下的图片文件路径    
    for image_id in image_ids:
        list_file.write('%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg\n'%(wd, year, image_id))
#5.xml 转 label
        convert_annotation(year, image_id)
    list_file.close()

os.system("cat 2018_train.txt 2018_val.txt > train.txt")#扩充训练集数据量


数据预处理

classes= 3 #分类类型
train  = /home/gavin/Machine/darknet/scripts/train.txt #训练集
valid  = /home/gavin/Machine/darknet/scripts/2018_val.txt #验证集
names = data/voc.names #类别信息
backup = backup #存放训练权重

训练模型

Avg IOU:当前迭代中,预测的box与标注的box的平均交并比,越大越好,期望数值为1;
Class: 标注物体的分类准确率,越大越好,期望数值为1;
obj: 越大越好,期望数值为1;
No obj: 越小越好;
.5R: 以IOU=0.5为阈值时候的recall; recall = 检出的正样本/实际的正样本
0.75R: 以IOU=0.75为阈值时候的recall;
count:正样本数目。

检测图片

测试检测结果准确度
 

数据分析

提取数据

import inspect
import os
import random
import sys
def extract_log(log_file,new_log_file,key_word):
    with open(log_file, 'r') as f:
      with open(new_log_file, 'w') as train_log:
  #f = open(log_file)
    #train_log = open(new_log_file, 'w')
        for line in f:
    # 去除多gpu的同步log
          if 'Syncing' in line:
            continue
    # 去除除零错误的log
          if 'nan' in line:
            continue
          if key_word in line:
            train_log.write(line)
    f.close()
    train_log.close()
 
extract_log('yolov3.log','train_log_loss.txt','images')
extract_log('yolov3.log','train_log_iou.txt','IOU')

绘制数据图

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#%matplotlib inline
 
lines =79755    #改为自己生成的train_log_loss.txt中的行数
result = pd.read_csv('train_log_loss.txt', skiprows=[x for x in range(lines) if ((x%10!=9) |(x<1000))] ,error_bad_lines=False, names=['loss', 'avg', 'rate', 'seconds', 'images'])
result.head()
 
result['loss']=result['loss'].str.split(' ').str.get(1)
result['avg']=result['avg'].str.split(' ').str.get(1)
result['rate']=result['rate'].str.split(' ').str.get(1)
result['seconds']=result['seconds'].str.split(' ').str.get(1)
result['images']=result['images'].str.split(' ').str.get(1)
result.head()
result.tail()
 
# print(result.head())
# print(result.tail())
# print(result.dtypes)
 
print(result['loss'])
print(result['avg'])
print(result['rate'])
print(result['seconds'])
print(result['images'])
 
result['loss']=pd.to_numeric(result['loss'])
result['avg']=pd.to_numeric(result['avg'])
result['rate']=pd.to_numeric(result['rate'])
result['seconds']=pd.to_numeric(result['seconds'])
result['images']=pd.to_numeric(result['images'])
result.dtypes
 
 
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(result['avg'].values,label='avg_loss')
# ax.plot(result['loss'].values,label='loss')
ax.legend(loc='best')  #图列自适应位置
ax.set_title('The loss curves')
ax.set_xlabel('batches')
fig.savefig('avg_loss')
# fig.savefig('loss')

实现效果图样例

 

 

我是海浪学长,创作不易,欢迎点赞、关注、收藏、留言。

毕设帮助,疑难解答,欢迎打扰!

最后

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/60397.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【人脸识别】Octuplet Loss:一个可以提高低分辨率和跨分辨率人脸识别效果的损失

论文题目&#xff1a;《Octuplet Loss:Make Face Recognition Robust to Image Resolution》 论文地址&#xff1a;https://arxiv.org/pdf/2207.06726v1.pdf 代码地址&#xff1a;https://github.com/martlgap/octuplet-loss 1.概述 一般来说&#xff0c;在图像分辨率方面&…

多线程设计模式-全面详解(学习总结---从入门到深化)

目录 Single Thread Execution 设计模式 机场过安检 非线程安全 问题分析 首字母相同却未通过检查 为何出现首字母不相同的情况 线程安全 Future 设计模 Master-Worker 设计模式 生产者消费者设计模式 Immutable 不可变对象设计模式 关于时间日期 API 线程不安全的问题…

Attention机制详解(深入浅出)

目录1. 为什么要有Attention2. Attention机制我们都知道&#xff0c;对于人类来说注意力是非常重要的一件事。有了注意的能力我们才能在一个比较复杂的环境中&#xff0c; 把有限的注意力放到重要的地方。在这一节中&#xff0c;我们将了解如何使得我们的网络也具有产生注意力的…

47. 全排列 II

关上过去和未来的铁门&#xff0c;活在“今天”这个舱室中。 ——《人性的优点》 47. 全排列 II 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2] 输…

蓝桥杯嵌入式AT24C02

文章目录前言一、AT24C02原理图二、IIC通信协议三、代码编写1.拷贝官方驱动程序2.编写AT24C02读写函数1.查看AT24C02芯片手册确定AT24C02器件地址2.读函数编写3.写函数编写4.代码使用总结前言 本文将带大家了解IIC协议&#xff0c;并带大家编写AT24C02的驱动代码。 一、AT24C…

MySQL-MHA高可用配置及故障切换

文章目录一、MHA概述二、MHA的组成1、MHA Node&#xff08;数据节点&#xff09;2、MHA Manager&#xff08;管理节点&#xff09;3、MHA 的特点四、搭建步骤实验思路实验操作故障模拟故障切换备选主库的算法一、MHA概述 MHA&#xff08;MasterHigh Availability&#xff09;是…

Java搭建宝塔部署实战毕设项目SpringBoot大学生就业信息管理源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 本期给大家带来一套Java开发的毕设项目SpringBoot大学生就业信息管理源码&#xff0c;适合拿来做毕业设计的同学。可以下载来研究学习一下&#xff0c;本期把这套系统分享给大家。 技术架构 技术框架&#xff1a…

(ICIP-2019)通过神经结构搜索进行视频动作识别

通过神经结构搜索进行视频动作识别 paper题目&#xff1a;VIDEO ACTION RECOGNITION VIA NEURAL ARCHITECTURE SEARCHING paper是奥卢大学发表在ICIP 2019的工作 paper地址&#xff1a;链接 ABSTRACT 深度神经网络在视频分析和理解方面取得了巨大成功。然而&#xff0c;设计高…

【Spring系列】- Spring循环依赖

Spring循环依赖 &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 一个有梦有戏的人 怒放吧德德 &#x1f31d;分享学习心得&#xff0c;欢迎指正&#xff0c;大…

JMeter入门教程(11) --关联

文章目录1.任务背景2.任务目标3.任务实操1.任务背景 当JMeter执行脚本时&#xff0c;伪装成浏览器&#xff0c;然后根据脚本&#xff0c;把当初真的浏览器所发过的内容&#xff0c;再对网站服务器重新发送一遍&#xff0c;JMeter企图骗过服务器&#xff0c;让服务器以为它就是…

010. 递增子序列

1.题目链接&#xff1a; 491. 递增子序列 2.解题思路&#xff1a; 2.1.题目要求&#xff1a; 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 &#xff08;数组可能有重复的元素&#xff0c;相等的元素排…

IDOC的状态

这篇文章介绍IDOC Status的概念和它们的用途&#xff0c;明确IDOC status的类别&#xff0c;看一下完整的状态列表&#xff0c;包括INBOUND和OUTBOUND&#xff0c;还有入站和出站iDoc处理时iDoc状态的顺序。 另外还有监控SAP IDOC status的工具&#xff0c;比如AIF&#xff0c;…

推特营销引流入门指南

一、关注 当您关注另一个Twitter用户时&#xff0c;您进行订阅&#xff0c;即可立即阅读其内容分享。因此&#xff0c;请评估您关注的人&#xff0c;尤其是刚开始时。跟踪新用户的一种简单方法是找到他们的个人资料&#xff0c;然后单击“关注”按钮。 Twitter对于那些疯狂点…

机器学习笔记之受限玻尔兹曼机(三)推断任务

机器学习笔记之受限玻尔兹曼机——推断任务引言回顾&#xff1a;受限玻尔兹曼机的模型表示推断任务求解——后验概率(posterior)基于隐变量的后验概率求解基于观测变量的后验概率求解受限玻尔兹曼机与神经网络的联系引言 上一节介绍了受限玻尔兹曼机的模型表示(Representation…

C++图书管理系统(管理员-读者)

C图书管理系统&#xff08;管理员-读者&#xff09; 一、设计一款文字式交互的图书管理系统&#xff0c;要求具备注册登录、浏览图书、借还图书等基本功能&#xff1b; 二、要求以外部文件的形式存储书籍信息、馆藏记录、借阅记录、用户信息等。【可参考提供的书籍清单】 三…

如何批量查询搜狗收录?提升搜狗收录8个方法介绍

如何批量查询搜狗收录? 批量查询搜狗收录的具体流程如下&#xff1a; 1、打开站长工具 2、在域名输入框添加需要查询的域名 3、在功能选择区勾选需要查询的功能&#xff08;这里勾选搜狗是否收录&#xff0c;搜狗收录总数&#xff09; 4、提交查询&#xff0c;等待查询结果 …

Android样式和主题背景

简介&#xff1a; 本文将简单介绍Android样式与主题背景的相关内容 文章目录前言一、样式二、主题背景三、样式层次结构四、创建并应用样式五、自定义默认主题六、添加特定于版本的样式七、常见的主题风格总结前言 借助 Android 中的样式和主题背景&#xff0c;我们可以将应用…

十五管还原炉舟皿自动卸料单元

目  录 摘要 Ⅰ 1 绪论 1 1.1 十五管还原炉舟皿产生和发展 1 1.2十五管还原炉舟皿的今天与明天 2 2 总体方案设计 4 2&#xff0e;1自动卸料单元的作用 4 2&#xff0e;2十五管还原炉舟皿自动卸料单元结构的选择 4 2&#xff0e;3设计技术参数: 7 2&#xff0e;4 自动卸料单元…

Python实现基于物品的协同过滤推荐算法构建电影推荐系统

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 基于物品的协同过滤推荐&#xff08;Item-based CF&#xff09;的假设原理为&#xff1a;跟你喜欢的东西…

python的数据可视化

python画图1.使用pyecharts画图1.1 画地图1.1.1 画2D中国地图1.1.2 画2D世界地图1.1.3 画3D世界地图1.2 pyecharts的三种图片渲染工具1.2.1 snapshot_selenium1.2.2 snapshot_phantomjs1.2.3 snapshot_pyppeteer1.3 词云图1.3.1依据图片渲染出指定形状的词云图1.3.2渲染出指定大…