Rolla‘s homework:Image Processing with Python Final Project

对比学习Yolo 和 faster rcnn 两种目标检测

要求

Image Processing with Python Final Project

Derek TanLoad several useful packages that are used in this notebook:Image Processing with Python Final Project Project Goals: • Gain an understanding of the object detection pipeline. • Learn to develop anchor-based single-stage object detectors. • Learn to develop a two-stage object detector that combines a region proposal network with a recognition network. Coding:

Q1: The notebook single_stage_detector_yolo. ipynb will guide you through the implementation of a fully-convolutional single-stage object detector similar to YOLO (Redmon et al, CVPR 2016). You will train and evaluate your detector on the PASCAL VOC 2007 object detection dataset.

Q2: The notebook two_stage_detector_faster_rcnn. ipynb will guide you through the implementation of a two-stage object detector similar to Faster R-CNN (Ren et al, NeurIPS 2015). This will combine a fully-convolutional Region Proposal Network (RPN) and a second-stage recognition network.

Steps:

  1. Unzip the P24 file. You will find three *.py files, two *. ipynb files, and an ip24 folder which includes seven *.py files.
  2. Carefully read the two *. ipynb notebooks.
  3. Write the code in the *.py files as indicated. The Python files have clearly marked blocks where you are expected to write code. Do not write or modify any code outside of these blocks. You may only be allowed to ADD one block of code to save the final results. You will only get credit for code that has been run.
  4. Evaluate your implementation. When you are done, save single_stage_detector.py, two_stage_detector.py, and all the outputs (folder Results) in one folder called Coding. Writing: Write a comparative analysis paper comparing the two object detection algorithms

Steps:

  1.    Your paper should be written in English and should be clear and concise, with proper structure and formatting.
    
  2.    Include images, graphs, and tables as necessary to support your analysis.
    
  3.    Avoid extensive use of AI-generated content and plagiarism or copying from classmates.
    
  4.    Save your final paper and the references that you used in one folder called Writing.
    
  5.    The paper should be no less than 5 pages, and you will follow the template from (CVPR 2024), which can be found in PaperForReview.docx.Paper Structure:• Title,Abstract,Introduction• Methodology: •Description of YOLO-based single-stage object detector implementation.• Description of Faster R-CNN-based two-stage object detector implementation.• Experimental Setup: • Description of dataset: PASCAL VOC 2007 object detection dataset.        • Evaluation metrics: mAP, inference speed, training time.• Results and Discussion: • Performance comparison between YOLO and Faster R-CNN.        • Analysis of detection accuracy.• Conclusion, References Grading Criteria:
    
  6.    Implementation of object detection algorithms (40%).
    
  7.    Clarity and coherence of comparative analysis paper (30%).
    
  8.    Depth of analysis and insights provided (20%).
    
  9.    Presentation, formatting, and adherence to submission requirements (10%).Final Submission: 1.        Zip file that should include the Coding folder and the Writing folder.        The zip file should be named using your Chinese name and the English name.        2.        No late submissions.        Deadline: 1 June 2024, 8 p.m.
    

可以看到上面内容是英文。。。《Python图像处理》,一做一个不吱声。

下面只是我+AI的一个参考,并不是正确答案,毕竟也找不到正确答案,而且感觉这个代码好多年了,不仅不知道哪里少代码,还有几个版本上的问题。

关键都是英文,看起来不是很方便,为了方便,下面的介绍就中英结合了。

首先下载作业,压缩包。

Ⅰ [可选] 下载数据集

If you download the datasets yourself.

Datasets from VOC2007.

The PASCAL Visual Object Classes Challenge 2007 (VOC2007) (ox.ac.uk)

在这里插入图片描述

Unzip to a your local DIR.

Example: E:\datasets\voc

Then create a empty TXT file in this DIR.

Because it’s in the a5_helper.py has function get_pascal_voc2007_data()

def get_pascal_voc2007_data(image_root, split='train'):"""Use torchvision.datasetshttps://pytorch.org/docs/stable/torchvision/datasets.html#torchvision.datasets.VOCDetection"""check_file = os.path.join(image_root, "extracted.txt")download = not os.path.exists(check_file)train_dataset = datasets.VOCDetection(image_root, year='2007', image_set=split,download=download)open(check_file, 'a').close()return train_dataset

在这里插入图片描述

Ⅱ 使用Pycharm 打开代码

此处省略1万字。。。

Ⅲ 安装 Jupyter lab

这个主要是为了执行笔记本文件.ipynb。这个也不介绍,省略。

Ⅳ 开始修改代码

  1. IP24目录下所有导入eecs598都删掉。

    删除所有的 import eecs598

  2. 修改single_stage_detector.py

    Edit single_stage_detector.py

    在这里插入图片描述

    This code is long long, you can typing code yourself or get in my CSDN resource: 1. single-stage-detector.py. 看文章最后。

    Note: It’s best to write your own code for this part. Mine is just a reference code.

    简单介绍一下几个函数的实现:AI 解释哈。

    single_stage_detector.py

    def GenerateAnchor(anc, grid):
    为每个图像生成所有锚框(anchor boxes)的坐标,它们是在图像的不同位置和尺度上预定义的边界框,用于预测目标的位置和大小。输入:
    anc: 一个形状为 (A, 2) 的张量,表示要考虑的每个网格点上的锚框形状。anc[a] = (w, h) 给出第 a 个锚框形状的宽度和高度。
    grid: 一个形状为 (B, H', W', 2) 的张量,给出从主干特征图中每个特征的中心坐标 (x, y)。这是从 GenerateGrid 函数返回的张量。
    输出:
    anchors: 一个形状为 (B, A, H', W', 4) 的张量,给出整个图像的所有锚框的位置。anchors[b, a, h, w] 是一个中心位于 grid[b, h, w] 的锚框,其形状由 anc[a] 给出。锚框参数化为 (x_tl, y_tl, x_br, y_br),其中 (x_tl, y_tl)(x_br, y_br) 分别给出框的左上角和右下角的 xy 坐标。实现:
    代码获取输入张量 grid 和 anc 的形状信息,分别存储在 B, H, W 和 A 变量中。
    然后,创建一个形状为 (B, A, H, W, 4) 的全零张量 anchors,用于存储所有锚框的坐标。这里假设使用 CUDA 设备进行计算。
    使用四重嵌套循环遍历每个批次、每个锚框、每个高度和宽度。
    在循环内部,计算每个锚框的左上角和右下角坐标:
    x_tl = grid[b, h, w, 0] - anc[a, 0] / 2:锚框左上角的 x 坐标,从网格中心的 x 坐标减去锚框宽度的一半。
    y_tl = grid[b, h, w, 1] - anc[a, 1] / 2:锚框左上角的 y 坐标,从网格中心的 y 坐标减去锚框高度的一半。
    x_br = grid[b, h, w, 0] + anc[a, 0] / 2:锚框右下角的 x 坐标,从网格中心的 x 坐标加上锚框宽度的一半。
    y_br = grid[b, h, w, 1] + anc[a, 1] / 2:锚框右下角的 y 坐标,从网格中心的 y 坐标加上锚框高度的一半。
    将计算出的坐标存储在 anchors 张量中。返回计算出的所有锚框的坐标张量 anchors。def GenerateProposal(anchors, offsets, method='YOLO'):用于根据给定的锚框(anchors)和偏移量(offsets)生成区域提议(proposals)。这个函数支持两种不同的转换方法:'YOLO''FasterRCNN'。输入:
    anchors: 一个形状为 (B, A, H', W', 4) 的张量,表示锚框的位置,其中 B 是批次大小,A 是锚框的数量,H' 和 W' 是特征图的高度和宽度,4 表示每个锚框由左上角和右下角坐标组成。
    offsets: 一个形状为 (B, A, H', W', 4) 的张量,表示应用于每个锚框的偏移量。对于每个锚框,偏移量包括 (tx, ty, tw, th),分别表示中心点 x 和 y 的偏移以及宽度和高度的缩放因子。
    method: 一个字符串,指定使用的转换方法,可以是 'YOLO''FasterRCNN'。输出:
    proposals: 一个形状为 (B, A, H', W', 4) 的张量,表示转换后的区域提议。代码实现:
    首先,代码检查 method 是否为 'YOLO''FasterRCNN',并初始化 proposals 张量为零。
    使用四重嵌套循环遍历每个批次、每个锚框、每个高度和宽度。
    在循环内部,从 anchors 和 offsets 中提取相应的坐标和偏移量。
    根据 method 的不同,应用不同的转换公式:
    对于 'FasterRCNN',中心点的偏移量 tx 和 ty 是相对于锚框原始宽度和高度的比例。
    对于 'YOLO',中心点的偏移量 tx 和 ty 是直接加到锚框的中心点上。
    计算新的宽度和高度,使用 torch.exp(tw) 和 torch.exp(th) 来确保宽度和高度始终为正。
    计算新的左上角和右下角坐标,并将它们存储在 proposals 张量中。返回值:
    函数返回计算出的所有区域提议的坐标张量 proposals。
    
  3. 开始修改运行文件single_stage_detector_yolo.ipynb

    You can also write them together in main.py.

    # 这里导入了包
    import torch
    from a5_helper import *# 设置了路径
    train_dataset = r"E:\datasets\voc"
    val_dataset = train_datasettrain_dataset = get_pascal_voc2007_data(train_dataset, 'train')
    # val_dataset = get_pascal_voc2007_data(train_dataset, 'val')train_dataset = torch.utils.data.Subset(train_dataset, torch.arange(0, 2500)) # use 2500 samples for training
    train_loader = pascal_voc2007_loader(train_dataset, 10)
    val_loader = pascal_voc2007_loader(train_dataset, 10) 
    print("加载完成!")
    
    # 创建迭代器
    train_loader_iter = iter(train_loader)# 获取下一个批次
    img, ann, _, _, _ = train_loader_iter.__next__()print('img has shape: ', img.shape)
    print('ann has shape: ', ann.shape)print('Image 1 has only two annotated objects, so ann[1] is padded with -1:')
    print(ann[1])print('\nImage 2 has six annotated objects:, so ann[2] is not padded:')
    print(ann[2])print('\nEach row in the annotation tensor indicates (x_tl, y_tl, x_br, y_br, class).')
    

    ……

评估

这部分有问题,我也不懂,反正写出来了,不知道啥问题。ap最后0.19

  1. 将上面的结果转一下格式,用于评估,所有类一样的放在一起
#!/usr/bin/python3.6
# -*- coding: utf-8 -*-
#
# Copyright (C) 2021 #
# @Time    : 2024/5/20 16:47
# @Author  : # @Email   : # @File    : 结果txt转换.py
# @Software: PyCharm
import osdef process_files(directory, outdir):# 创建一个字典来保存每个类型的数据data_by_type = {}# 遍历目录中的所有文件for filename in os.listdir(directory):if filename.endswith('.txt'):with open(os.path.join(directory, filename), 'r') as file:for line in file:# 解析每一行,提取类型和数据parts = line.strip().split()if len(parts) == 6:type_name, confidence, x1, y1, x2, y2 = parts# 将数据添加到对应类型的字典中if type_name not in data_by_type:data_by_type[type_name] = []data_by_type[type_name].append(' '.join([filename.split(".txt")[0], confidence, x1, y1, x2, y2]))# 将每个类型的数据写入到单独的文件中for type_name, data in data_by_type.items():print(type_name)with open(f'{outdir + type_name}.txt', 'w') as output_file:output_file.write('\n'.join(data))# 使用函数
process_files(r'./mAP/input/detection-results/', r'./mAP/input/detection-results-cls/')
  1. 计算
import pickleimport osimport numpy as np
import matplotlib.pyplot as plt
import torchfrom a5_helper import idx_to_class, pascal_voc2007_loader, class_to_idx
from faster_rcnn_pytorch_master.lib.datasets.voc_eval import voc_ap, parse_rec
from faster_rcnn_pytorch_master.lib.datasets.voc_eval import voc_ap, parse_rec, voc_evaldef plot_pr_curve(precisions, recalls):plt.figure()plt.plot(recalls, precisions, lw=2)plt.xlabel('Recall')plt.ylabel('Precision')plt.title('Precision-Recall Curve')plt.savefig('pr_curve.png')plt.close()def evaluate_map(output_dir):# Compute AP for each categoryaps = []for i, cls in enumerate(class_to_idx):print(i, cls)if cls == '__background__':continuerec, prec, ap = voc_eval(r'D:\Python\work\python图像处理实践\Coding\mAP\input\detection-results-cls\{:s}.txt',r"E:\datasets\voc\VOCdevkit\VOC2007\Annotations\{:s}.xml",r"E:\datasets\voc\VOCdevkit\VOC2007\ImageSets\Main\train.txt", cls,"./cachedir", ovthresh=0.5, )# print(rec, prec, ap)print(cls, ap)aps += [ap]print(('AP for {} = {:.4f}'.format(cls, ap)))with open(os.path.join(output_dir, cls + '_pr.pkl'), 'wb') as f:pickle.dump({'rec': rec, 'prec': prec, 'ap': ap}, f)plot_pr_curve(prec, rec)print(('Mean AP = {:.4f}'.format(np.mean(aps))))print('~~~~~~~~')# print('Results:')# for ap in aps:#     print(('{:.3f}'.format(ap)))print(('{:.3f}'.format(np.mean(aps))))print('~~~~~~~~')print('')print('--------------------------------------------------------------')print('Results computed with the **unofficial** Python eval code.')print('Results should be very close to the official MATLAB eval code.')print('Recompute with `./tools/reval.py --matlab ...` for your paper.')print('-- Thanks, The Management')print('--------------------------------------------------------------')# Compute mAPmAP = np.mean(aps)return mAPdef main():mAP = evaluate_map('mAP/input')print(f'Mean Average Precision (mAP): {mAP}')if __name__ == '__main__':main()

Okay,这个代码真的太长了,不想粘贴了。

果然、训练模型花了十来个小时。。。这是作业?服!

Do you feel bad when you see this?

所有文件

It’s time for a showdown: I should give the attachment, otherwise I may be attacked by the Internet!

VOC2007 训练数据集

VOCtrainval_06-Nov-2007.tar

链接:https://pan.baidu.com/s/19hMEn-fwBjT5ikbWauSIfA?pwd=vapt
提取码:vapt
–来自百度网盘超级会员V6的分享

Yolo 和 Faster R-CNN 目标检测对比学习——作业原压缩包

IPFinal Project.rar

链接:https://pan.baidu.com/s/1h0g2SRsWfBZZ4VHziisGnw?pwd=sdvl
提取码:sdvl
–来自百度网盘超级会员V6的分享

CVPR 2024 word模板

链接:https://pan.baidu.com/s/1OAVuCH35UXTKNidsag4ELg?pwd=nycl
提取码:nycl
–来自百度网盘超级会员V6的分享

训练修改的文件、训练的结果
链接:https://pan.baidu.com/s/1r-dPd9W70LrNVsfeNDvd3A?pwd=li16
提取码:li16
–来自百度网盘超级会员V6的分享

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

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

相关文章

使用git生成SSH公钥,并设置SSH公钥

1、在git命令行里输入以下命令 ssh-keygen -t rsa 2、按回车,然后会看到以下字眼 Generating public/private rsa key pair. Enter file in which to save the key (/c/Users/xxx/.ssh/id_rsa) 例: 3、继续回车,然后会看到以下字眼 Enter…

【面试干货】数据库乐观锁,悲观锁的区别,怎么实现

【面试干货】数据库乐观锁,悲观锁的区别,怎么实现 1、乐观锁,悲观锁的区别2、总结 💖The Begin💖点点关注,收藏不迷路💖 1、乐观锁,悲观锁的区别 悲观锁(Pessimistic Lo…

web前端框架设计第十课-组件

web前端框架设计第十课-组件 一.预习笔记 组件:Vue最强大的功能之一 1.局部组件注册 注意事项:template标签中只能有一个根元素 2.全局组件的注册 注意事项:组件名的大小写需要注意(实践) 3.案例(查询框…

Vivado 使用教程(个人总结)

Vivado 是 Xilinx 公司推出的一款用于 FPGA 设计的集成开发环境 (IDE),提供了从设计输入到实现、验证、调试和下载的完整流程。本文将详细介绍 Vivado 的使用方法,包括项目创建、设计输入、约束文件、综合与实现、仿真、调试、下载配置等步骤。 一、创建…

HCIP-VLAN综合实验

一、实验拓扑 二、实验要求 1、pc1和pc3所在接口为access;属于vlan 2; PC2/PC4/PC5/PC6处于同一网段’其中PC2可以访问PC4/PC5/PC6; PC4可以访问PC6;PC5不能访问PC6; 2、PC1/PC3与PC2/PC4/PC5/PC6不在同一个网段; 3、所有PC通过DHCP获取IP…

闲话 .NET(5):.NET Core 有什么优势?

前言 .NET Core 并不是 .NET FrameWork 的升级版,它是一个为满足新一代的软件设计要求而从头重新开发的开发框架和平台,所以它没有 .NET FrameWork 的历史包袱,相对于 .NET FrameWork,它具备很多优势。 .NET Core 有哪些优势&am…

C# GDI+ 绘制文字不同的操作系统渲染文字大小不同

一、C# GDI 绘制文字不同的操作系统渲染文字大小不同 原因:使用Font 字体的时候,没有指定字体渲染的单位。 不同系统的默认字体单位会不同。 二、解决方案: 在指定字体的时候,指定字体大小,同时也要设置字体的单位 …

sqlserver 创建表,列及表,列描述

-- 创建表 CREATE TABLE Employees (EmployeeID INT PRIMARY KEY,EmployeeName NVARCHAR(100),EmployeeEmail NVARCHAR(100) );-- 为表添加描述 EXEC sp_addextendedproperty name NMS_Description, value N员工信息表, level0type NSchema, level0name dbo, level1type N…

springboot整合kkFileView部署,前端使用

前言: 官方文档:https://kkfileview.keking.cn/zh-cn/docs/production.html docker方式或加入星球获取发行包直接获取启动,无需以下步骤: 拉取镜像# 网络环境方便访问docker中央仓库 docker pull keking/kkfileview:4.1.0# 网…

二元关系表示

一、二元关系的定义和表示 什么是二元关系?对集合A和B,A\timesB的任意子集R为A到B的一个二元关系。当AB时,A\timesA的任一子集R称为A上的一个二元关系。在不引起误解的情况下,二元关系可简称关系。 若|A|m,|B|n,则A到…

手机版AI写作软件哪个好用?5款AI写作软件分享

在这个快节凑的时代,人们对于高效、便捷的创作方式很是追求。尤其是在人工智能技术发展迅速的今天,AI写作软件的出现,让很多自媒体创作者都会想到在手机上面进内容创作,这样不仅能提高工作效率,而且工作的自由度会更高…

自动化运维(AIOps): 现代IT管理的革命

在数字化时代,企业的 IT 系统变得愈加复杂。从云计算到大数据,从物联网到人工智能,技术的飞速发展使得企业面临前所未有的挑战。这种复杂性不仅体现在数据量和数据流的增加上,还包括高成本和高错误率的运维需求。在此背景下&#…

基于51单片机的盆栽自动浇花系统

一.硬件方案 工作原理是湿度传感器将采集到的数据直接传送到ADC0832的IN端作为输入的模拟信号。选用湿度传感器和AD转换,电路内部包含有湿度采集、AD转换、单片机译码显示等功能。单片机需要采集数据时,发出指令启动A/D转换器工作,ADC0832根…

Android 实现竖排文本(垂直方向显示)

Android 实现竖排文本-垂直方向显示 前言效果图代码实现方式一 Custom View1. 自定义视图 VerticalTextView2. 在xml布局文件中使用3. 设置文本内容 方式二 使用 TextView 的 rotation属性方式三 使用带有跨距文本的TextView1. 自定义视图 VerticalTextView2. 在xml布局文件中使…

【Windows系统】解决Intel 6代CPU安装win7系统过程中无法操作键盘鼠标的问题

问题 微软表示,从 2016 年 7 月 17 日起,新的 Intel、AMD 和Qualcomm 处理器将仅支持 Windows 10,不再支持 Windows 7 和 8.1。因此,Intel 6代以后的CPU因为没有USB驱动无法完成win7系统的安装。 下文核心思想是通过老毛桃PE系统…

云界洞见:移动云服务开启技术创新与问题解决的新篇章

一、什么是移动云 移动云以“央企保障、安全智慧、算网一体、属地服务”为品牌支撑,聚焦智能算力建设,打造一朵智能、智慧、安全可信可控的云,提供更优质的算力服务,引领云计算产业发展。 那么下面博主带领大家了解移动云的优势所…

关于c++的通过cin.get()维持黑框的思考

1.前言 由于本科没有学过c语言,研究生阶段接触c上手有点困难,今天遇到关于通过cin.get()来让黑框维持的原因。 2.思考 cin.get()维持黑框不消失的原因一言蔽之就是等待输入。等待键盘的输入内容并回车(一般是回车)后cin.get()才…

Plotly库利用滑块创建数据可视化

使用了Plotly库来创建一个数据可视化图表,并使用滑块来控制显示哪些数据 import plotly.graph_objects as go from plotly.subplots import make_subplots# 示例数据 x [1, 2, 3, 4, 5] y1 [1, 2, 3, 4, 5] y2 [5, 4, 3, 2, 1] y3 [2, 3, 1, 5, 4]# 创建子图 f…

Python vscode debug: Error while enumerating installed packages.解决

记录一个vscode python debug时出现的错误: 具体错误如下: E00000.030: Error while enumerating installed packages. Traceback (most recent call last): File “/root/.vscode-server/extensions/ms-python.debugpy-2024.0.0-linux-x64/bundled/lib…

Study--Oracle-03-Oracle19C--RAC集群部署

一、硬件信息及配套软件 1、硬件设置 RAC集群虚拟机:CPU:2C、内存:9G、操作系统:30G、数据库安装目录:100G 数据存储:50G (10G*5) 共享存储:2G (1G*2) 2…