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.datasets
  https://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_dataset
    
    train_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 os

def 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 pickle

import os

import numpy as np
import matplotlib.pyplot as plt
import torch

from 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_eval

def 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 category
    aps = []
    for i, cls in enumerate(class_to_idx):
        print(i, cls)
        if cls == '__background__':
            continue
        rec, 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 mAP
    mAP = np.mean(aps)
    return mAP


def 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的分享

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【vue-5】双向数据绑定v-model及修饰符

单向数据绑定:当数据发生改变时,视图会自动更新,但当用户手动更改input的值,数据不会自动更新; 双向数据绑定:当数据发生改变时,视图会自动更新,但当用户手动更改input的值&#xf…

【深度学习】yolov8 seg实例分割训练,交通灯

文章目录 一、类别定义二、标注后再清洗数据三、训练yolov8 seg四、部署五、代码资料 一、类别定义 类别0: 类别1: 类别2: 类别3: 类别4: 类别5: 类别6: 类别7: 二、标注后再清洗…

【Linux】TCP协议【上】{协议段属性:源端口号/目的端口号/序号/确认序号/窗口大小/紧急指针/标记位}

文章目录 1.引入2.协议段格式4位首部长度16位窗口大小32位序号思考三个问题【demo】标记位URG: 紧急指针是否有效提升某报文被处理优先级【0表示不设置1表示设置】ACK: 确认号是否有效PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走RST: 对方要求重新建立连接; 我们把携带R…

Go 1.23 Release Notes编写方式改进!

2024.5.22日,Go 1.23 feature冻结!Go团队开始Go 1.23rc1的冲刺,截至发文时,Go 1.23 milestone已经完成59%(https://github.com/golang/go/milestone/212),还有188个open的issue待解决。 Go 1.23有哪些新feature&#x…

前后端开发入门全攻略:零基础学起

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、前后端开发概览 二、后端开发基础:Flask框架入门 代码案例:Hel…

Pytorch-01 框架简介

智能框架概述 人工智能框架是一种软件工具,用于帮助开发人员构建和训练人工智能模型。这些框架提供了各种功能,如定义神经网络结构、优化算法、自动求导等,使得开发人员可以更轻松地实现各种人工智能任务。通过使用人工智能框架,…

域内攻击 ----->约束非约束委派攻击

在域中,除了我们常见的横向移动以外,还有很多攻击,像什么kerberoasting,委派攻击,NTLMrelay啊...... 还有很多(暂时只知道这些) 以前在一篇公众号看到的一个笑话也荟萃了网安的一些攻击手法&am…

vue17:v-bind对css样式的控制增强

代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><styl…

Kafka(十三)监控与告警

目录 Kafka监控与告警1 解决方案1.2 基础知识JMX监控指标代理查看KafkaJMX远程端口 1.3 真实案例Kafka Exporter:PromethusPromethus Alert ManagerGrafana 1.3 实际操作部署监控和告警系统1.2.1 部署Kafka Exporter1.2.2 部署Prometheus1.2.3 部署AlertManger1.2.4 添加告警规…

缓存IO与直接IO

IO类型 缓存 I/O 缓存 I/O 又被称作标准 I/O&#xff0c;大多数文件系统的默认 I/O 操作都是缓存 I/O。在 Linux 的缓存 I/O 机制中&#xff0c;数据先从磁盘复制到内核空间的缓冲区&#xff0c;然后从内核空间缓冲区复制到应用程序的地址空间&#xff08;用户空间&#xff0…

java基础-JVM日志、参数、内存结构、垃圾回收器

一、基础基础 1.1 数据类型 Java的数据类型分为原始数据类型和引用数据类型。 原始数据类型又分为数字型和布尔型。 数字型又有byte、short、int、long、char、float、double。注意&#xff0c;在这里char被定义为整数型&#xff0c;并且在规范中明确定义&#xff1a;byte、…

阿里云的域名购买和备案(一)

前言 本篇文章主要讲阿里云的域名购买和备案。 大家好&#xff0c;我是小荣&#xff0c;我又开始做自己的产品迷途dev了。这里详细记录一下域名购买的流程和备案流程。视频教学 购买流程 1.阿里云官网搜索域名注册 2.搜索你想注册的域名 3.将想要注册的域名加入域名清单 4.点…

Java+原生HTML+ WebSocket+MySQL云HIS信息管理系统源码 支持一体化电子病历四级

Java原生HTML WebSocketMySQL云HIS信息管理系统源码 支持一体化电子病历四级 云HIS电子病历系统是一种基于云计算技术的医疗信息管理系统&#xff0c;旨在实现医疗信息的数字化、标准化和共享化。该系统通过云计算平台&#xff0c;将医院内部的各个业务模块&#xff08;如门诊、…

Spring系列-03-BeanFactory和Application接口和相关实现

BeanFactory BeanFactory和它的子接口们 BeanFactory 接口的所有子接口, 如下图 BeanFactory(根容器)-掌握 BeanFactory是根容器 The root interface for accessing a Spring bean container. This is the basic client view of a bean container; further interfaces such …

【深度学习实战—7】:基于Pytorch的多标签图像分类-Fashion-Product-Images

✨博客主页&#xff1a;王乐予&#x1f388; ✨年轻人要&#xff1a;Living for the moment&#xff08;活在当下&#xff09;&#xff01;&#x1f4aa; &#x1f3c6;推荐专栏&#xff1a;【图像处理】【千锤百炼Python】【深度学习】【排序算法】 目录 &#x1f63a;一、数据…

提示优化 | PhaseEvo:面向大型语言模型的统一上下文提示优化

【摘要】为大型语言模型 (LLM) 制作理想的提示是一项具有挑战性的任务&#xff0c;需要大量资源和专家的人力投入。现有的工作将提示教学和情境学习示例的优化视为不同的问题&#xff0c;导致提示性能不佳。本研究通过建立统一的上下文提示优化框架来解决这一限制&#xff0c;旨…

【讲解下PDM,PDM是什么?】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

GEE批量导出逐日、逐月、逐季节和逐年的遥感影像(以NDVI为例)

影像导出 1.逐日数据导出2.逐月数据导出3.季节数据导出4.逐年数据导出 最近很多小伙伴们私信我&#xff0c;问我如何高效导出遥感数据&#xff0c;从逐日到逐季度&#xff0c;我都有一套自己的方法&#xff0c;今天就来和大家分享一下&#xff01;   &#x1f50d;【逐日导出…

基于51单片机的数字频率计(电路图+pcb+论文+仿真+源码)

于51单片机的数字频率计 设计的频率计范围能够达到1HZ-1MHZ(实际上51单片机达不到这个范围&#xff0c;不要在实验环境下进行)&#xff0c;这个是课设来着&#xff0c;用Proteus仿真实现的&#xff0c;给有需要的同学参考一下 仿真原理图如下&#xff08;proteus仿真工程文件可…

方言和大语言模型

方言多样性及其对语言模型的影响 语言的演变是不可避免的&#xff0c;反映并推动了重大的社会变革和传统。语言接触往往会推动我们说话方式的创新&#xff0c;在美国全球文化的影响下&#xff0c;一种新的叙事正在其语言织锦中展开。 例如&#xff0c;在佛罗里达州南部&#…