RCNN网络源码解读(Ⅰ) --- 获取数据并预处理数据

news2025/1/10 22:18:45

目录

1.RCNN是什么东西

2.处理数据集

2.1 code:下载VOC数据集(pascal_voc.py)

2.2 code: 数据集预处理(pascal_voc_car.py)

3.code区域候选建议(selectivesearch.py)


1.RCNN是什么东西

        主要做目标检测用的。

2.处理数据集

        你要做目标检测,你要训练数据,你要检测数据,那么这些训练数据是如何获取,哪里下载、如何处理是我们需要知道的。

        我们这里用PASCAL VOC数据集。

2.1 code:下载VOC数据集(pascal_voc.py

pascal_voc.py

import cv2
import numpy as np
from torchvision.datasets import vocDetection

if __name__ == '__main__':
    """
    下载PASCAL VOC数据集
    """
    dataset = VOCDetection('../../data' , year='2007', image_set = 'trainval' , download = True)

    #打印dataset的大小
    print(len(dataset))

    #取到这张图片及target
    img,target = dataset._getitem__(202)

    img = np.array(img)
    print(target)
    print(img.shape)
    cv2.imshow('img',img)
    cv2.waitKey(0)

        vocDetection里面有软件包的数据,直接下载即可。

        getitem方法可以取得该数据集的某张图片。

        img是一张图片。

        这个数据集一共有5011张图片,因此len(dataset)的值为5011。

        target是什么呢?我们第202张图片来说:

{'anotation' : {'foldr':'VOC2007', 'filename':'002070.jpg','source' : {'database': 'The VOC2007 Database' , annotation : 'PASCAL VOC 2007','image': 'flicker' ,'flickerid' : '313674620'}, 'size':{'width':'500','height':'189','depth':'3'},'object':{'name':'sofa','pose':'frontal','difficulty':'0','bndbox':'xmin':'8','ymin':'32','xmax':'493','ymax':'173'}}}}

        这里比较重要的信息就是:

        filename是文件(图片)名称

        图片大小

        bndbox:是框体大小(标定的大小)

'bndbox':'xmin':'8','ymin':'32','xmax':'493','ymax':'173'

        我们看看这是什么意思:

        我们更改这部分的代码:

def draw_box_with_text(img,rect_list,score.list):
    """ 
    绘制边框其分类概率
    :param img:
    : param rect_list:
    : param score_list:
    : return:
    """
    for i in range(len(rect_list)):
        xmin,ymin,xmax,ymax = rect_list[i]
        score = score_list[i]
        
        cv2.rectangle(img,(xmin,ymin),(xmax,ymax),color=(0,0,255),thickness=1)
        cv2.putText(img,"{:.3f}".format(score),(xmin,ymin),cv2.FONT_HERSHEY_SINPLEX,0.5,(255,255,255),1)
def draw_box_with_text(img,xmin,ymin,xmax,ymax,text):

    cv2.rectangle(img,(xmin,ymin),(xmax,ymax),color=(0,0,255),thickness=1)
    cv2.putText(img,"{:.3f}".format(text),(xmin,ymin),cv2.FONT_HERSHEY_SINPLEX,0.5,(255,255,255),1)

        更改主函数:

import cv2
import numpy as np
from torchvision.datasets import vocDetection

if __name__ == '__main__':
    """
    下载PASCAL VOC数据集
    """
    dataset = VOCDetection('../../data' , year='2007', image_set = 'trainval' , download = True)

    #打印dataset的大小
    print(len(dataset))

    #取到这张图片及target
    img,target = dataset._getitem__(202)
    
    #弄懂bndbox是什么
    draw_box_with_text(img,8,32,493,173,'sofa')   

    img = np.array(img)
    print(target)
    print(img.shape)
    cv2.imshow('img',img)
    cv2.waitKey(0)

         我们可以看到这个小沙发被框体框住了。

         因此,通过这个函数,我们收集了PASCAL VOC 2007数据集,这个数据集共有5011张照片,且每张图片有标注信息(bndbox),我们可以拿这个数据集做监督学习的标准。

2.2 code: 数据集预处理(pascal_voc_car.py)

        在RCNN论文中,有如下的流程:

        一张图片经过处理之后会选出一些框,每个框经过CNN网络之后实现一个二分类。

        在处理一张图片时,我们不是将一张图片中的所有图像类别判定出来,而是每次训练一类数据,判断框体里面是否含有这一类的数据。

        因此RCNN的过程主要是:抽取数据集中的任何一个类别的数据,作为训练对象。(将这种训练的过程重复进行N次(N是指类别数量)
        我们看看VOC2007数据集的目录结构:

        总共有20类,每个类别有四种数据(训练集train,训练集+测试集trainval,测试集val,test),每一个数据里面存放着照片的索引。RCNN是针对每一个类别都训练一个东西用于判别在图像里选出一堆框这堆框里面是不是这一类的。拿同样的图片到第二个类别再去比对,看看这个图片有没有第二类的东西............

         也就是说,我们要训练20个模型(狗、马.....),然后用模型遍历20次我们的图片网格,从而判断一张图片里面有什么(听起来就很low,但是这是入门啊,后面我还会出mask-rcnn,faster-rcnn的教程的)。

        因此数据预处理的第一步就是抽出一个类别的数据,只有抽出一个系别的数据,我们才能针对这种东西训练神经网络训练出一个二分类器来判断该张图片是否有该种物体。

        这里我们拿处理汽车为例:

import os
import shutil
import random
import numpy as np
import xmltodict
from util import check_dir

#文件后缀
suffix_xml = '.xml'
suffix_jpeg = '.jpg'

#车的数据集的路径
car_train_path = '../../data/VOCdevkit/VOC2007/Imagesets/Main/car_train.txt'
car_val_path = '../../data/VOCdevkit/VOC2007/Imagesets/Main/car_val.txt'

#定义车的图片及标注的路径
voc_annotation_dir = '../../data/VOCdevkit/VOC2007/Annotations'
voc_jpeg_dir = '../../data/VOCdevkit/VOC2007/JPEGImages/'

#为以后创建car的目录用
car_root_dir = '../../data/voc_car/'

VOC2007下的数据集文件
数据集car_train的内容如上,是voc_jppg_dir下的图片的索引,是不带后缀的。

        就是说,car_train.txt里面的内容是图片的索引,图片的位置是在voc_jpeg_dir下。

        我们的目的是建立一个汽车的数据集,即我们要创建car_root_dir目录存放关于车图片的数据集。如下:我们在voc_car的文件夹创立train和val目录,然后在创建标注文件和图片以及索引文件,再将数据从数据集中拷贝过去。

本小节最终目标,创立汽车数据集

         我们看它的main函数:

if __name__ == '__main__':
    samples ={'train': parse_train_val(car_train_path),'val':parse_train_val(car_val_path)}
    print(samples)
    #samples = sample_train_val(samples)
    # print(samples)

    check_dir(car_root_dir)
    for name in ['train', 'val']:
        data_root_dir = os.path.join(car_root_dir, name)
        data_annotation_dir = os.path.join(data_root_dir,"Annotations ')
        data_jpeg_dir = os.path.join(data_root_dir,"JPEGImages ')

        check_dir(data_root_dir)
        check_dir(data_annotation_dir)
        check_dir(data_jpeg_dir)
        save_car(samples[name],data_root_dir,data_annotation_dir,data_jpeg_dir)

    print('done')

        这里面几个路径我们说明一下:

car_train_path = '../../data/VOCdevkit/VOC2007/Imagesets/Main/car_train.txt'
car_val_path = '../../data/VOCdevkit/VOC2007/Imagesets/Main/car_val.txt'

        我们将car_train_patcar_val_path 传入 parse_train_val函数中,这个函数会将我们的索引文件car_train.txt和car_val.txt按行分割读取装入samples中。

        因此,samples最后得到的是一个向量列表。

        随后我们建立这些文件夹,check_dir的作用是检查文件夹是否存在,若不存在则创建。

        os.path.join是拼接目录的函数。

        data_root_dir = data/voc_car/train

        data_annotation_dir = data/voc_car/train/annotation

        data_jdpg_dir = data/voc_car/train/JPEGImages

        最后然后处理samples中的数据。

def parse_train_val(data_path):
    """
    获取指定类别数据
    """
    samples=[]
    with open(data_path,'r') as file:
        lines = file.readlines()
        for line in lines:
            res = line.strip().split(' ')
            if len(res) == 3 and int(res[2]) == 1:
                samples.append(res[0])

    return np.array(samples)
def save_car(car_samples,data_root_dir,data_annotation_dir,data_jpeg_dir):
    """
    保存类别Car的样本图片和标注文件
    """

    #分别遍历val中和train中的sample数据放到对应文件夹里
    #这里的samplename就是 train 或者 val 字符串
    for sample_name in car_samples:
        src_annotation_path = os.path.join(voc_annotation_dir,sample_name +suffix_xml)
        dst_annotation_path = os.path.join(data_annotation_dir,sample_name +suffix_xml)
        shutil.copyfile(src_annotation_path, dst_annotation_path)

        src_jpeg_path = os.path.join(voc_jpeg_dir,sample_name + suffix_jpeg)
        dst_jpeg_path = os.path.join(data_jpeg_dir,sample_name + suffix_jpeg)
        shutil.copyfile(src_jpeg_path, dst_jpeg_path)

    csv_path = os.path.join(data_root_dir,'car.csv')
    np.savetxt(csv_path,np.array(car_samples), fmt='%s')

这里目录:

src_annotation_path = data/VOCdevkit/VOC2007/annotations/009774.xml

dst_annotation_path = data/voc_car/train/annotation/009774.xml

3.code区域候选建议(selectivesearch.py)

import sys
import cv2

def get_selective_search():
    gs = cv2.ximgproc.segmentation.createselectiveSearchSegmentation()
    return gs

        区域候选建议是使用cv2的模块(opencv 3.4.2 版本有这个模块)

        gs是定义了一个区域候选建议的一个方法

        该方法有s、f、q三种形式,根据方法不一样,选出来的候选框也不一样。config函数是进行配置,get_nects是进行画框的过程。

def config(gs,img,strategy='q'):
    gs.setBaseImage(img)

    if(strategy == 's'):
        gs.switchToSinglestrategy()
    elif(strategy == 'f'):
        gs.switchToSelectiveSearchFast()
    elif (strategy == 'q'):
    gs.switchToSelectivesearchQuality()
    else:
        print(__doc__)

    sys.exit(1)


def get_nects(gs):
    rects =gs.process()
    rects[:,2] += rects[:, 0]
    rects[:,3] += rects[:, 1]

    return rects

        论文说我们采用一个区域候选的方法在一个图中选出大约2K个搜索区域

if __name__ == ' __main__':
    """
    选择性搜索算法操作
    """

    gs = get_selective_search()

    img = cv2.imread('d:/code/R-CNN/imgs/00057905.jpg',cv2.IMREAD_COLOR)
    config(gs,img,strategy='q')

    rects = get_rects(gs)
    print(len(rects))
    color = (255,255,255)

    rect_img(img, color, rects)

        rects得到框体,最后我们显示图像。

一个图像处理2000个候选框执行起来是这样,CPU运算会很慢

         显示框体的函数如下:

def rect_ img(img,color,rects):
    for x1,y1,×2,y2 in rects[0:2000]:
        cv2.rectangle(img,(x1,y1),(x2,y2),,color,thickness=2)
    
    #cv2.putText(img,objectname,(x1,y1),cv.FONT_HERSHEY_COMPLEX,0.7,(0,255,0),
    # thickness=2)
    #cv2.imshow('head',img)
    
    cv2.imwnite('d:/code/R-CNN/imgs/00057903_rect.jpg',img)

        这个方法的缺点是使用cpu进行计算生成候选框,这就大大拖慢了我们预测时候的速度。预处理也很慢。

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

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

相关文章

Web(十)JavaScript知识训练-JS函数

1、下列选项中,( B)可用于检查某个值是否为无穷大的数。 A、 isNaN() B、 isFinite() C、 parseInt() D、 parseFloat() 2、函数parseInt(15.36)…

燕东微在科创板上市:市值263亿元,北京电控、亦庄国投等为股东

12月16日,北京燕东微电子股份有限公司(下称“燕东微”,SH:688172)在上海证券交易所科创板上市。本次在上市,燕东微的发行价为21.98元/股,募资总额约为39.53亿元,募资净额约为37.57亿元&#xff…

【Java寒假打卡】Java基础-方法

【Java寒假打卡】Java基础-方法一、定义二、方法的定义和调用三、方法调用过程四、带参数的方法和调用五、debug查看方法参数传递六、带返回值的方法的调用七、方法重载八、方法传递数据九、返回一个数组的最大值和最小值一、定义 方法就是一段具有独立功能的代码块&#xff0…

Java中的Set系列集合

Set系列集合Set系列集合Set系列集合概述HashSet元素的底层原理:哈希表HashSet元素去重复的底层原理实现类:LinkedHashSet实现类:TreeSetCollection体系的特点、使用场景终结补充知识:可变参数集合工具类CollectionsCollection体系…

Unity PolyNav2D(2D寻路) 插件

下载地址 https://download.csdn.net/download/qq_27461747/87300286 组件 PolyNav2D 寻路地图,一般来说 有且只有一个, 寻路的主要接口就在这个组件里PolyNavObstacle 障碍物PolyNavAgent 导航代理, 带有移动功能。这个可有可无,可以自己…

重点| 系统集成项目管理工程师考前50个知识点(6)

本文章总结了系统集成项目管理工程师考试背记50个知识点!!! 帮助大家更好的复习,希望能对大家有所帮助 比较长,放了部分,需要可私信!! 40、冲突的下列特点: &#xff…

css知识复习点

四种css使用方式&#xff1a;内嵌式、外链式、行内式、导入式 复合选择器 后代选择器 选择器之间需要用空格隔开&#xff0c;后代不一定是儿子 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>复合…

渗透测试-crlf注入原理

目录 概念 HTTP报文结构与漏洞原理 漏洞检测 Bottle之CRLF漏洞 nginx配置错误之CRLF漏洞 漏洞危害 会话固定 修复建议 漏洞检测POC 概念 这个漏洞一般很少出现。 CRLF是CR和LF两个字符的拼接&#xff0c;它们分别代表”回车换行”&#xff08;\r\n&#xff09;。十六…

[附源码]Nodejs计算机毕业设计基于的学生事务管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

Java+mysql基于SSM的网上出差审批与费用报销系统 开题 毕业设计

本课题是一个基于SSM的管理系统,本网上出差审批与费用报销系统是在Windows7系统的环境下,利用Eclipse和Mysql工具开发的。在网上出差审批与费用报销系统中分为管理员和普通用户2个模块。其中网上出差审批与费用报销系统中的管理人员在登陆之后可以管理本系统内的部门信息管理,员…

性能测试场景:如何进行场景设计?

我们在前面屡次强调了场景的重要性,今天终于到了要把实际场景拿出来解析的时候了。 在本篇文章中,为了保证数据的连续性,我用之前的项目资料来作明确地说明。同时为了模糊关键业务信息,以及让场景的描述更通用性,我会把所有的业务名隐去。 根据之前我们所说的,基准性能…

【DevOps实战系列】第六章:详解Docker私服Nexus3篇

个人亲自录制全套DevOps系列实战教程 &#xff1a;手把手教你玩转DevOps全栈技术 概述/目标 私服我们很熟悉了&#xff0c;比如docker hub就是官方私服&#xff0c;而有些情况比如我们自建的镜像&#xff0c;不想往外传&#xff0c;就需要考虑内部搭建一个私有服务器来存放私有…

ELK 日志框架搭建 (springboot 接入 elk)

什么是ELK&#xff1f; ELK 是一个开源的实时日志分析平台&#xff0c;它主要由 Elasticsearch、Logstash 和 Kiabana 三部分组成。 Logstash Logstash 主要用于收集日志&#xff0c;它是一个开源数据收集引擎&#xff0c;具有实时管道功能。Logstash 可以动态地将来自不同数…

《大正野球娘》:棒球少女·棒球1号位

《大正野球娘。》是根据神乐坂淳的人气轻小说「大正棒球少女」及「大正棒球少女&#xff5e;沾满土与尘&#xff5e;」改编的电视动画。原作小说是神乐坂淳原作&#xff0c;小池定路插画的轻小说改德间书店出版&#xff0c;至2009年6月已发行三卷。此外&#xff0c;小说还被改编…

曙光超算平台如何使用以及常见问题

官方参考链接如下&#xff0c;有需要的自取&#xff1a; Notebook 计算服务 了解常用的E-shell命令 (1) squeue: 查看目前提交作业的信息 (2) salloc :抢占计算资源命令 salloc -p wzhdtest -N 1 -n 8 --gresdcu:1 &#xff08;部分地区有绑卡机制&#xff0c;比如乌镇&am…

PHP将PDF转图片-实战

Windows环境下 一、开启 Imagick 扩展 1、安装PHP扩展&#xff1a;Imagick&#xff0c;下载地址 https://pecl.php.net/package/imagick 注意和php版本保持一致&#xff1b; 2、将下载下来的文件解压&#xff0c;把php_imagick.dll复制到php/ext下&#xff0c;即php的扩展目…

【人脸识别】形态学教室人数统计(带面板)【含Matlab源码 1703期】

⛄一、人数统计简介&#xff08;附课程作业报告&#xff09; 1 课题背景 本课题为基于matlab的人数统计系统。近年来&#xff0c;很多行业对人流信息有极大的需求&#xff0c;如汽车公交站&#xff0c;地铁站台&#xff0c;商场出入口等。通过人数统计系统可以方便、可靠、实时…

5-6: Elasticsearch(入门安装)

Elasticsearch简介 一个分布式的&#xff08;多台服务器集群部署&#xff09;、Restful风格(设计风格&#xff0c;前后端交互的风格&#xff0c;请求标准的描述)的搜索引擎。支持对各种类型的数据的检索。搜索速度快&#xff0c;可以提供实时的搜索服务。便于水平扩展&#xf…

23.层和块

在构造自定义块之前&#xff0c;我们先回顾一下多层感知机 的代码。 下面的代码生成一个网络&#xff0c;其中包含一个具有256个单元和ReLU激活函数的全连接隐藏层&#xff0c; 然后是一个具有10个隐藏单元且不带激活函数的全连接输出层。 import torch from torch import nn …

是面试官放水,还是公司实在是太缺人?这都没挂,京东原来这么容易进...

“京东是大企业&#xff0c;是不是很难进去啊&#xff1f;”“在京东做软件测试&#xff0c;能得到很好的发展吗&#xff1f;一进去就有9.5K&#xff0c;其实也没有想的那么难”直到现在&#xff0c;心情都还是无比激动&#xff01; 本人211非科班&#xff0c;之前在字节和腾讯…