基于计算机视觉的坑洼道路检测和识别-MathorCup A(深度学习版本)

news2024/11/28 6:41:04

1 2023 年 MathorCup 高校数学建模挑战赛——大数据竞赛

赛道 A:基于计算机视觉的坑洼道路检测和识别
使用深度学习模型,pytorch版本进行图像训练和预测,使用ResNet50模型

2 文件夹预处理

因为给定的是所有图片都在一个文件夹里面,所以需要先进行处理,核心代码:

for file_name in file_names:
    source_path = os.path.join(source_folder, file_name)

    # 判断文件名中是否包含'a'字符
    if "normal" in file_name:
        # 如果包含'a'字符,将文件移动到文件夹A
        destination_path = os.path.join(folder_normal, file_name)
        shutil.copy(source_path, destination_path)
    elif "potholes" in file_name:
        # 如果包含'bb'字符,将文件移动到文件夹BB
        destination_path = os.path.join(folder_potholes, file_name)
        shutil.copy(source_path, destination_path)

移动后的图片所在文件夹显示
在这里插入图片描述
每个文件夹里面包含属于这一类的图片

在这里插入图片描述
在这里插入图片描述

3 使用ResNet50模型进行建模

3.1 ResNet50核心原理

  • 输入层: 接收输入图像 卷积层1:对输入图像进行卷积操作,得到64个特征图批量标准化层1:对卷积层的输出进行批量标准化
  • ReLU激活函数1:对批量标准化后的特征图进行非线性激活
  • 残差块1:包含两个残差块,每个残差块由两个卷积层和一个批量标准化层组成ReLU激活函数2:对残差块1的输出进行非线性激活
  • 批量标准化层2:对ReLU激活函数2的输出进行批量标准化。
  • 卷积层2:对批量标准化后的特征图进行卷积操作,得到128个特征图残差块2:包含两个残差块,每个残差块由两个卷积层和一个批量标准化层组成ReLU激活函数3:对残差块2的输出进行非线性激活批量标准化层3:对ReLU激活函数3的输出进行批量标准化。卷积层3:对批量标准化后的特征图进行卷积操作,得到256个特征图

在这里插入图片描述

3.2 核心代码

3.2.1 数据预处理

数据预处理,归一化

transform = T.Compose([
    T.Resize(256),
    T.CenterCrop(224),
    T.ToTensor(),
    T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
                       ])

3.2.2 训练集和测试集划分

# 划分数据集为训练集和测试集
validation_split = 0.2
dataset_size = len(custom_dataset)
split = int(validation_split * dataset_size)
indices = list(range(dataset_size))
np.random.shuffle(indices)
train_indices, test_indices = indices[split:], indices[:split]

train_sampler = SubsetRandomSampler(train_indices)
test_sampler = SubsetRandomSampler(test_indices)

# 创建数据加载器
batch_size= 128
train_loader = DataLoader(custom_dataset, batch_size=batch_size, sampler=train_sampler)
test_loader = DataLoader(custom_dataset, batch_size=batch_size, sampler=test_sampler)

3.2.3 加载模型

from torchvision import models
model = models.resnet50(pretrained=True) # 导入resnet50网络

# 修改最后一层,最后一层的神经元数目=类别数目,所以设置为100个
model.fc = torch.nn.Linear(in_features=2048, out_features=2)

3.2.4 训练

        train = Variable(images).cuda()
        labels = Variable(labels).cuda()

        # 梯度清零
        optimizer.zero_grad()

        # 前向计算
        outputs = model(train)

        predicted = torch.max(outputs.data, 1)[1]  # 预测标签
        acc = (predicted == labels).sum() / float(len(labels))  # 计算精度
        loss = error(outputs, labels)  # 计算损失函数

        # 计算梯度
        loss.backward()

        # 更新梯度
        optimizer.step()
        train_loss_list.append(loss.data.cpu().item())
        train_acc_list.append(acc.cpu().item())

3.2.5 模型预测

遍历测试数据集

 with torch.no_grad():
        for inputs, labels in test_loader:
            inputs = Variable(inputs).cuda()
            labels = Variable(labels).cuda()
            outputs = model(inputs)
            _, predicted = torch.max(outputs, 1)  # 获取预测标签
            true_labels.extend(labels.cpu().numpy())  # 将真实标签添加到列表
            predicted_labels.extend(predicted.cpu().numpy())  # 将预测标签添加到列表

4 结果显示

要输出精度、F1 分数和分类报告等多种指标,你可以在训练模型之后使用Scikit-Learn的工具来进行评估和计算这些指标。

train data: 0  Loss: 0.1588  Accuracy: 0.9143
Accuracy: 0.9833333333333333
Precision: 0.9857142857142857
Recall: 0.9833333333333333
F1 Score: 0.9838964773544213
Classification Report:
               precision    recall  f1-score   support

           0       1.00      0.98      0.99        54
           1       0.86      1.00      0.92         6

    accuracy                           0.98        60
   macro avg       0.93      0.99      0.96        60
weighted avg       0.99      0.98      0.98        60

完整代码:https://docs.qq.com/doc/DWEtRempVZ1NSZHdQ

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

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

相关文章

Wpf 使用 Prism 实战开发Day03

一.实现左侧菜单绑定 效果图: 1.首先需要在项目中创建 mvvm 的架构模式 创建 Models &#xff0c;放置实体类。 实体类需要继承自Prism 框架的 BindableBase&#xff0c;目的是让实体类支持数据的动态变更! 例如: 系统导航菜单实体类 / <summary>/// 系统导航菜单实体类…

AWTK 液体流动效果控件发布

液体流动效果控件。 主要特色&#xff1a; 支持水平和垂直方向。支持正向和反向流动。支持设置头尾的图片。支持设置流动的图片。支持设置速度的快慢。支持启停操作。 准备 获取 awtk 并编译 git clone https://github.com/zlgopen/awtk.git cd awtk; scons; cd -运行 生成…

2023-10-29 LeetCode每日一题(H 指数)

2023-10-29每日一题 一、题目编号 274. H 指数二、题目链接 点击跳转到题目位置 三、题目描述 给你一个整数数组 citations &#xff0c;其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义&#xff1a…

【管理运筹学】第 10 章 | 排队论(5,多服务台排队系统、一般服务时间模型、P-K 公式、排队系统的经济分析)

文章目录 引言一、多服务台排队系统二、一般服务时间 M / G / 1 M/G/1 M/G/1 模型Pollaczek-Khinchine&#xff08;P-K&#xff09;公式 三、排队系统的经济分析写在最后 引言 对于多服务台负指数分布排队系统&#xff0c;大纲要求没那么深&#xff0c;只提到了状态转移图以及…

A. Doremy‘s Paint 3

今天第一次打CF&#xff0c;不过鼠鼠被气死了 先说说战况&#xff0c;今天一发没A&#xff08;赛场上&#xff09;&#xff0c;生活真是无奈&#xff0c;废物女友真是一点用没有 心里也很烦&#xff0c;什么压力都自己扛着。每天想尝试改变什么&#xff0c;又被现实掣肘&…

Leetcode刷题详解——第 N 个泰波那契数

1. 题目链接&#xff1a;1137. 第 N 个泰波那契数 2. 题目描述&#xff1a; 泰波那契序列 Tn 定义如下&#xff1a; T0 0, T1 1, T2 1, 且在 n > 0 的条件下 Tn3 Tn Tn1 Tn2 给你整数 n&#xff0c;请返回第 n 个泰波那契数 Tn 的值。 示例 1&#xff1a; 输入&#…

矩阵点乘multiply()函数和矩阵乘法dot()函数

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 矩阵点乘multiply()函数 和矩阵乘法dot()函数 [太阳]选择题 使用multiply()和dot()函数,输出错误的是&#xff1a; import pandas as pd import numpy as np df1pd.DataFrame([[0,1],[2,3]])…

Python---使用turtle模块+for循环绘制五角星---利用turtle(海龟)模块

首先了解涉及的新词汇&#xff0c;编程外国人发明的&#xff0c;所以大部分是和他们语言相关&#xff0c;了解对应意思&#xff0c;可以更好理解掌握。 import 英 /ˈɪmpɔːt/ n. 进口&#xff0c;进口商品&#xff1b;输入&#xff0c;引进&#xff1b;重要性&#xff1b;…

线程池里对异常的处理方式

方式&#xff1a;重写afterExecute方法, 统一处理线程池里抛出的异常。 但是要区分是execute方式提交的&#xff0c;还是submit方式提交的。 代码如下&#xff1a; public class Test001 {public static void main(String[] args) throws Exception {ExecutorService executor…

Redis(07)| 数据结构-跳表

Redis 只有 Zset 对象的底层实现用到了跳表&#xff0c;跳表的优势是能支持平均 O(logN) 复杂度的节点查找。 zset 结构体里有两个数据结构&#xff1a;一个是跳表&#xff0c;一个是哈希表。这样的好处是既能进行高效的范围查询&#xff0c;也能进行高效单点查询。 typedef s…

37基于MATLAB平台的图像去噪,锐化,边缘检测,程序已调试通过,可直接运行。

基于MATLAB平台的图像去噪&#xff0c;锐化&#xff0c;边缘检测&#xff0c;程序已调试通过&#xff0c;可直接运行。 37matlab边缘检测图像处理 (xiaohongshu.com)

ABBYY FineReader PDF15免费版图片文件识别软件

ABBYY全称为“ABBYY FineReader PDF”, ABBYY FineReader PDF集优秀的文档转换、PDF 管理和文档比较于一身。 首先这款软件OCR文字识别功能十分强大&#xff0c;话不多说&#xff0c;直接作比较。下图是某文字识别软件识别一串Java代码的结果&#xff0c;识别的结果就不多评价…

pyro库应用第 1 部分----贝叶斯回归

Bayesian Regression - Introduction (Part 1) — Pyro Tutorials 1.8.6 documentation 一、说明 我们很熟悉线性回归的问题&#xff0c;然而&#xff0c;一些问题看似不似线性问题&#xff0c;但是&#xff0c;用贝叶斯回归却可以解决。本文使用土地平整度和国家GDP的关系数据…

LibTorch实战二:MNIST的libtorch代码

目录 一、前言 二、另一种下载数据集方式 三、MNIST的Pytorch源码 四、MNIST的Libtorch源码 一、前言 前面介绍过了MNIST的python的训练代码、和基于torchscript的模型序列化&#xff08;导出模型&#xff09;。今天看看&#xff0c;如何使用libtorch C来实现手写数字训练。…

【算法|动态规划No.32 | 完全背包问题】完全背包模板题

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

2023年【加氢工艺】考试题库及加氢工艺免费试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年加氢工艺考试题库为正在备考加氢工艺操作证的学员准备的理论考试专题&#xff0c;每个月更新的加氢工艺免费试题祝您顺利通过加氢工艺考试。 1、【单选题】《使用有毒物品作业场所劳动保护条例》规定,从事使用高…

Linux常用命令——chown命令

在线Linux命令查询工具 chown 用来变更文件或目录的拥有者或所属群组 补充说明 chown命令改变某个文件或目录的所有者和所属的组&#xff0c;该命令可以向某个用户授权&#xff0c;使该用户变成指定文件的所有者或者改变文件所属的组。用户可以是用户或者是用户D&#xff0…

杨辉三角形

要求输出10行杨辉三角形如下图&#xff1a; 杨辉三角的特点: 1,只需要处理下三角形; 2.第一列和主对角线的值为1; 3.其它位置的值等于上一行前 一列上一行同列的值。 int main() { #define ROW 10//行和列int arr[ROW][ROW];for (int i 0; i < ROW; i){for (int j 0; j &l…

第四章 文件管理 十一、虚拟文件系统

目录 一、虚拟文件系统图 二、虚拟文件系统的特点 三、存在的问题 四、文件系统挂载 一、虚拟文件系统图 二、虚拟文件系统的特点 1、向上层用户进程提供统一标准的系统调用接口&#xff0c;屏蔽底层具体文件系统的实现差异。 2、VFS要求下层的文件系统必须实现某些规定的…

SPI 串行外围设备接口

SPI&#xff08;Serial Peripheral interface&#xff09;&#xff0c;串行外围设备接口。是一种全双工形式的高速同步通信总线。 SPI 硬件接口由四根信号线组成&#xff0c;分别是&#xff1a; SDI&#xff1a;数据输入SDO&#xff1a;数据输出SCK&#xff1a;时钟CS/SS&…