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.rhkb.cn/news/331489.html

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

相关文章

海康威视硬盘录像机NVR连接公网视频监控平台,注册失败,抓包发现有403 forbidden的问题解决

目录 一、问题描述 二、问题定位 1、查看DVR的配置 2、查看需要使用的端口是否开放 3、查看日志 4、抓包 (1)找出错误 (2)查看数据包内容 三、问题分析 1、国标28181中的域的概念 2、域应该如何定义 (1&am…

蓝桥杯备赛——DP【python】

一、小明的背包1 试题链接:https://www.lanqiao.cn/problems/1174/learning/ 问题描述 输入实例 5 20 1 6 2 5 3 8 5 15 3 3 输出示例 37 问题分析 这里我们要创建一个DP表,DP(i,j)表示处理到第i个物品时消耗j体…

STM32学习和实践笔记(30):窗口看门狗(WWDG)实验

1.WWDG介绍 1.1 WWDG简介 上一章我们已经介绍了IWDG,知道它的工作原理就是一个12位递减计数器不断递减计数,当减到0之前还未进行喂狗的话,产生一个MCU复位。 窗口看门狗WWDG其实和独立看门狗类似,它是一个7位递减计数器不断的往…

C语言之指针进阶(3),函数指针

目录 前言: 一、函数指针变量的概念 二、函数指针变量的创建 三、函数指针变量的使用 四、两段特殊代码的理解 五、typedef 六、函数指针数组 总结: 前言: 本文主要讲述C语言指针中的函数指针,包括函数指针变量的概念、创建…

aws msk加密方式和问控制连接方式

msk加密方式 msk提供了两种加密方式 静态加密传输中加密 创建集群时可以指定加密方式,参数如下 aws kafka create-cluster --cluster-name "ExampleClusterName" --broker-node-group-info file://brokernodegroupinfo.json --encryption-info file:/…

【基于springboot+vue的房屋租赁系统】

介绍 本系统是基于springbootvue的房屋租赁系统,数据库为mysql,可用于日常学习和毕设,系统分为管理员、房东、用户,部分截图如下所示: 部分界面截图 用户 管理员 联系我 微信:Zzllh_

Wpf 使用 Prism 实战开发Day24

自定义询问窗口 当需要关闭系统或进行删除数据或进行其他操作的时候&#xff0c;需要询问用户是否要执行对应的操作。那么就需要一个弹窗来给用户进行提示。 一.添加自定义询问窗口视图 (MsgView.xaml) 1.首先&#xff0c;添加一个自定义询问窗口视图 (MsgView.xaml) <Use…

qmt量化教程4----订阅全推数据

文章链接 qmt量化教程4----订阅全推数据 (qq.com) 上次写了订阅单股数据的教程 量化教程3---miniqmt当作第三方库设置&#xff0c;提供源代码 全推就主动推送&#xff0c;当行情有变化就会触发回调函数&#xff0c;推送实时数据&#xff0c;可以理解为数据驱动类型&#xff0…

使用 Flask 和 Celery 构建异步任务处理应用

文章目录 什么是 Flask&#xff1f;什么是 Celery&#xff1f;如何在 Flask 中使用 Celery&#xff1f;步骤 1&#xff1a;安装 Flask 和 Celery步骤 2&#xff1a;创建 Flask 应用程序步骤 3&#xff1a;运行 Celery Worker步骤 4&#xff1a;启动 Flask 应用程序 结论 在构建…

C# NetworkStream 流的详解与示例

文章目录 一、NetworkStream类的基本概念1.1 NetworkStream类概述1.2 NetworkStream类属性1.3 NetworkStream类方法 二、NetworkStream的连接方式三、NetworkStream的传输模式四、NetworkStream类示例服务器端代码&#xff1a;客户端代码&#xff1a; 五、总结 在C#中&#xff…

刷代码随想录有感(77):回溯算法——含有重复元素的全排列

题干&#xff1a; 代码&#xff1a; class Solution { public:vector<int> tmp;vector<vector<int>> res;void backtracking(vector<int> nums, vector<int> used){if(tmp.size() nums.size()){res.push_back(tmp);return;}sort(nums.begin(),…

iCloud 照片到 Android 指南:帮助您快速将照片从 iCloud 传输到安卓手机

​ 概括 iOS 和 Android 之间的传输是一个复杂的老问题。将 iCloud 照片传输到 Android 似乎是不可能的。放心。现在的高科技已经解决了这个问题。尽管 Apple 和 Android 不提供传输工具&#xff0c;但您仍然有其他有用的选项。这篇文章与您分享了 5 个技巧。因此&#xff0c;…

云部署最简单python web

最近在玩云主机&#xff0c;考虑将简单的web应用装上去&#xff0c;通过广域网访问一下&#xff0c;代码很简单&#xff0c;所以新手几乎不会碰到什么问题。 from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return Hello, World!app.route(/gree…

plsql 学习

过程化编程语言 赋值&#xff1a;&#xff1a; ||&#xff1a;连接符号 dbms_output.put_line() :输出的语句 var_name ACCOUNTLIBRARY.USERNAME%type; 变量名&#xff1b;某个表的数据类型&#xff1b;赋值给变量名 用下面的方法更好用 异常exception 循…

Linux网络编程:HTTP协议

前言&#xff1a; 我们知道OSI模型上层分为应用层、会话层和表示层&#xff0c;我们接下来要讲的是主流的应用层协议HTTP&#xff0c;为什么需要这个协议呢&#xff0c;因为在应用层由于操作系统的不同、开发人员使用的语言类型不同&#xff0c;当我们在传输结构化数据时&…

算法打卡 Day9(字符串KMP 算法)-实现 strStr+ 重复的子字符串

KMP 算法 KMP 算法解决的是字符串匹配的问题&#xff0c;其经典思想是&#xff1a;当出现的字符串不匹配时&#xff0c;可以记录一部分之前已经匹配的文本内容&#xff0c;利用这些信息避免从头再去做匹配。 前缀表 next 数组就是一个前缀表。前缀表是用来回退的&#xff0c…

【启明智显技术分享】SOM2D02-2GW核心板适配ALSA(适用Sigmastar ssd201/202D)

提示&#xff1a;作为Espressif&#xff08;乐鑫科技&#xff09;大中华区合作伙伴及sigmastar&#xff08;厦门星宸&#xff09;VAD合作伙伴&#xff0c;我们不仅用心整理了你在开发过程中可能会遇到的问题以及快速上手的简明教程供开发小伙伴参考。同时也用心整理了乐鑫及星宸…

TypeScript学习日志-第三十二天(infer关键字)

infer关键字 一、作用与使用 infer 的作用就是推导泛型参数&#xff0c;infer 声明只能出现在 extends 子语句中&#xff0c;使用如下&#xff1a; 可以看出 已经推导出类型是 User 了 二、协变 infer 的 协变会返回联合类型&#xff0c;如图&#xff1a; 三、逆变 infer…

【C++】详解AVL树——平衡二叉搜索树

个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 祝福语&#xff1a;愿你拥抱自由的风 目录 二叉搜索树 AVL树概述 平衡因子 旋转情况分类 左单旋 右单旋 左右双旋 右左双旋 AVL树节点设计 AVL树设计 详解单旋 左单旋 右单旋 详解双旋 左右双旋 平衡因子情况如…

默认路由实现两个网段互通实验

默认路由实现两个网段互通实验 **默认路由&#xff1a;**是一种特殊的静态路由&#xff0c;当路由表中与数据包目的地址没有匹配的表项时&#xff0c;数据包将根据默认路由条目进行转发。默认路由在某些时候是非常有效的&#xff0c;例如在末梢网络中&#xff0c;默认路由可以…