faster-rcnn.pytorch-1.0的jwyang当前最火版本代码复现与讲解

一、faster-rcnn.pytorch-1.0

1、下载代码与权重文件

选择的是当前最火的框架,直接从jwyang大神的github上下载即可,注意要选择pytorch1.0版本进行下载。
数据集准备:Pascal_VOC数据集
下载训练、验证测试数据集training, validation, test data 和 VOCdevkit

wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar

将三个文件解压到同一个文件夹内VOCdevkit

tar xvf VOCtrainval_06-Nov-2007.tar
tar xvf VOCtest_06-Nov-2007.tar
tar xvf VOCdevkit_08-Jun-2007.tar

VOC数据集的文件夹tree结构:其中Annotations内放xml标注文件,JPEGImages内放图片,ImageSets/Main/内的四个txt文件分别是测试集、训练集、训练验证集、验证集。
最终在VOCdevkit目录下有VOC2007/Annotations等文件夹,数据集格式如图所示

VOCdevkit
└── VOC2007
    ├── Annotations
    ├── ImageSets
    │   └── Main
    │       ├── test.txt
    │       ├── train.txt
    │       ├── trainval.txt
    │       └── val.txt
    └── JPEGImages

特征提取训练权重准备:作者给出了两种特征提取网络的Pretrained Models,下载完成后把他们放到data/pretrained_model目录下(见作者github)

cp /data/faster-rcnn.pytorch.zip ~/
unzip faster-rcnn.pytorch.zip

将下载的压缩包拷贝到云服务器上后进行解压。

2、先安装所有环境

要进入到faster-rcnn.pytorch目录下,后执行命令

pip install -r requirements.txt

3、相关库函数版本以及安装

sudo pip uninstall torch
sudo pip install torch==1.0.0

sudo pip uninstall torchvision
sudo pip install torchvision==0.2.1

sudo pip uninstall scipy
sudo pip install scipy==1.0.0

可以跑通的版本号

cython==0.29.21
cffi==1.11.5
opencv-python==4.3.0.36
scipy==1.0.0
msgpack==1.0.0
easydict==1.9
matplotlib==3.3.0
pyyaml==5.3.1
tensorboardX==2.1

4、创建软连接

cd faster-rcnn.pytorch/data 
# 进入到我们创建的data文件夹
ln -s /home/mist/faster-rcnn.pytorch/data/VOCdevkit VOCdevkit2007
# ln -s VOCdevkit的绝对路径 VOCdevkit2007
# ln是链接(link)命令,ln -s 表示创建软连接。具体用法是:ln -s 源文件 目标文件。

5、编译CUDA依赖环境

cd lib
sudo python setup.py build develop

6、改bug

运行出现一个错误

ImportError: cannot import name '_mask'

解决——安装CoCO API

cd data
git clone https://github.com/pdollar/coco.git 
cd coco/PythonAPI
make
cd ../../..

7、训练

CUDA_VISIBLE_DEVICES=$GPU_ID python trainval_net.py \
                   --dataset pascal_voc --net vgg16 \
                   --bs $BATCH_SIZE --nw $WORKER_NUMBER \
                   --lr $LEARNING_RATE --lr_decay_step $DECAY_STEP \
                   --cuda

可用的示例

CUDA_VISIBLE_DEVICES=0 python trainval_net.py \
                   --dataset pascal_voc --net vgg16 \
                   --epochs 1 --bs 1 --nw 4 \
                   --lr  1e-3 --lr_decay_step 5 \
                   --cuda

参数选择图
在这里插入图片描述
从断点开始继续训练方法:
例如我训练好的模型名为faster_rcnn_1_9_9547.pth,它就对应了 checksession 为1 ,checkepoch为 9,checkpoint为 9547
例如我要继续训练这个模型到20次epoch,就可以写

CUDA_VISIBLE_DEVICES=0 python trainval_net.py --dataset pascal_voc --net res101 --bs 1 --nw 4  --cuda --r true --checksession 1 --checkepoch 8 --checkpoint 9547 --epochs 20

训练过程:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8、测试

python test_net.py --dataset pascal_voc --net vgg16 \
                   --checksession $SESSION --checkepoch $EPOCH --checkpoint $CHECKPOINT \
                   --cuda
python test_net.py --dataset pascal_voc --net vgg16 \
                   --checksession 1 --checkepoch 1 --checkpoint 10021 \
                   --cuda

测试过程:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9、demo

  • 在跑demo文件过程中,也需要把类别修改成适应你的新数据集的形式。
//个例实验
python demo.py --net vgg16  --checksession 1  --checkepoch 10 --checkpoint 359 --cuda --load_dir models

二、生成数据集

1、修改xml文件参数

import os
import os.path
import xml.dom.minidom


# path="../xml/"
path_xml = '/home/Annotations/'
path_img='/home/JPEGImage/'
files = os.listdir(path_xml)  # 得到文件夹下所有文件名称
modify_folder = "Annotations"
modify_database = "labproject"

for xmlFile in files:  # 遍历文件夹
    if not os.path.isdir(xmlFile):  # 判断是否是文件夹,不是文件夹才打开
        print(xmlFile)
        xmlFile

    filepath = os.path.join(path_xml, xmlFile)
    # 最核心的部分,路径拼接,输入的是具体路径
    dom = xml.dom.minidom.parse(os.path.join(path_xml, xmlFile))
    root = dom.documentElement

    # 修改path
    oldpath = root.getElementsByTagName('path_xm')
    # print(oldpath[0].firstChild.data)

    newpath = path_img + xmlFile[0:6] + ".jpg"
    oldpath[0].firstChild.data = newpath

    # 修改folder
    oldfolder = root.getElementsByTagName('folder')
    oldfolder[
### 使用 Faster R-CNN 和 PyTorch 实现实例分割 为了实现实例分割,通常会选择使用 Mask R-CNN 而不是直接使用 Faster R-CNN。这是因为 Mask R-CNN 是在 Faster R-CNN 的基础上进行了扩展和改进,不仅能够检测图像中的对象,还能为每个对象生成精确的像素级分割掩码[^4]。 然而,在某些情况下,如果确实需要利用 Faster R-CNN 来完成类似的任务,则可以通过修改其输出来近似实现简单的实例分割功能。下面是一个简化版的例子,展示如何基于 Faster R-CNN 结合额外模块来进行实例分割: #### 安装依赖库 首先确保安装必要的 Python 库: ```bash pip install torch torchvision torchaudio ``` #### 导入所需包 加载所需的 Python 包以及预训练模型: ```python import torch from PIL import Image import matplotlib.pyplot as plt from torchvision.models.detection.mask_rcnn import maskrcnn_resnet50_fpn, MaskRCNN_ResNet50_FPN_Weights ``` #### 加载预训练模型 这里我们实际上会先加载一个已经包含了实例分割能力的 Mask R-CNN 预训练模型作为起点: ```python weights = MaskRCNN_ResNet50_FPN_Weights.DEFAULT model = maskrcnn_resnet50_fpn(weights=weights) model.eval() ``` #### 准备输入图片 读取并处理要分析的目标图片文件: ```python image_path = "example.jpg" img = Image.open(image_path).convert("RGB") preprocess = weights.transforms() batch = [preprocess(img)] prediction = model(batch)[0] labels = prediction["labels"].tolist() scores = prediction["scores"].tolist() masks = prediction["masks"] > 0.5 boxes = [[(i[0], i[1]), (i[2], i[3])] for i in prediction['boxes'].detach().numpy()] ``` #### 可视化结果 后绘制带有边界框和遮罩的结果图: ```python plt.figure(figsize=(10, 8)) ax = plt.gca() for label, score, mask, box in zip(labels, scores, masks, boxes): ax.add_patch(plt.Rectangle(*box, fill=False, edgecolor='red', linewidth=2)) ax.text(box[0][0], box[0][1], f'{label} {score:.2f}', bbox=dict(facecolor='yellow', alpha=0.5), fontsize=9, color='black') masked_image = np.zeros_like(np.array(img), dtype=np.uint8) masked_image[mask.squeeze()] = np.array([255, 0, 0]) img_with_mask = cv2.addWeighted(np.array(img), 0.7, masked_image, 0.3, 0) plt.imshow(Image.fromarray(img_with_mask)) plt.axis('off') plt.show() ``` 需要注意的是,这段代码实际上是采用了 Mask R-CNN 模型而不是纯粹意义上的 Faster R-CNN 来执行实例分割操作。对于真正的 Faster R-CNN,由于缺乏内置的支持用于创建逐像素预测的功能,因此无法直接支持完整的实例分割特性;但是可以考虑将其自定义层或其他第三方工具相结合以达到相似的效果。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值