(linux)Faster RCNN-pytorch1.0目标检测2:训练自己的数据集,gpu,pycharm, 训练笔记

前言

  1. 如何在anconda创建Faster-RCNN虚拟环境和用pycham为项目配置环境见(linux)Faster-RCNN pytorch目标检测1:环境配置gpu+anaconda+pycham+ RTX2080ti 笔记,确认你已经编译完成

  1. 部分参考: Faster-RCNN.pytorch的搭建、使用过程详解(适配PyTorch 1.0以上版本\使用Faster RCNN训练自己的数据集_fasterrcnn训练自己的数据集\用自己的数据集训练Faster RCNN的详细全过程\ 解决faster-rcnn中训练时assert(boxes[:,2]>=boxes[:,0]).all()

  1. Faster-RCNN pytorch1.0链接https://github.com/jwyang/faster-rcnn.pytorch/tree/pytorch-1.0,建议直接下载后提取

  1. 预训练模型下载

VGG16: https://filebox.ece.vt.edu/~jw2yang/faster-rcnn/pretrained-base-models/vgg16_caffe.pth

ResNet101:https://filebox.ece.vt.edu/~jw2yang/faster-rcnn/pretrained-base-models/resnet101_caffe.pth

  1. 如果无法上github。百度云盘链接:https://pan.baidu.com/s/1mde9g4FN68TTPamRMl_kBw?pwd=s5sb 提取码:s5sb,或者Faster-RCNNpytorch1.0,vgg16-caffe.pth和resnet101-caffe.pth-CSDN文库。包含Faster-RCNN pytorch1.0源码和要用到的预训练模型vgg16_caffe.pth、resnet101_caffe.pth

  1. pycharm汉化Pycharm汉化简单图文教程

  1. 报错ImportError: cannot import name '_mask '、 assert (boxes[:, 2] >= boxes[:, 0]).all()AssertionError 和RuntimeError: CUDA out of memory 解决在最后

数据集准备

  1. Faster-RCNN根目录下新建data文件夹

  1. 在data文件夹中新建VOCdevkit2007文件夹,VOCdevkit2007中新建VOC2007

  1. VOC2007文件夹下新建 JPEGImages 存放jpg图像文件,和Annotations文件夹存放xml标注文件

  1. 新建ImageSets/Main文件夹,划分数据集,split_train_val.py代码如下

import os
import random
import argparse

parser = argparse.ArgumentParser()
# ***为该数据集的绝对路径
parser.add_argument('--xml_path', default='***/Annotations', type=str, help='input xml label path')
parser.add_argument('--txt_path', default='***/ImageSets/Main', type=str, help='output txt label path')
opt = parser.parse_args()

trainval_percent = 0.9  # 训练集和验证集所占比例。
train_percent = 0.7     # 训练集所占比例,可自己进行调整
xmlfilepath = opt.xml_path
txtsavepath = opt.txt_path
total_xml = os.listdir(xmlfilepath)
if not os.path.exists(txtsavepath):
    os.makedirs(txtsavepath)

num = len(total_xml)
list_index = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list_index, tv)
train = random.sample(trainval, tr)

file_trainval = open(txtsavepath + '/trainval.txt', 'w')
file_test = open(txtsavepath + '/test.txt', 'w')
file_train = open(txtsavepath + '/train.txt', 'w')
file_val = open(txtsavepath + '/val.txt', 'w')

for i in list_index:
    name = total_xml[i][:-4] + '\n'
    if i in trainval:
        file_trainval.write(name)
        if i in train:
            file_train.write(name)
        else:
            file_val.write(name)
    else:
        file_test.write(name)

file_trainval.close()
file_train.close()
file_val.close()
file_test.close()

运行结果如下

  1. 如果你的数据集目标种类名称含大写字母,需要修改为小写格式,否则可能会报错,修改代码如下

# coding:utf-8
import os
import os.path
import xml.dom.minidom

path = r'\你的xml路径(最好备份一下)'
files = os.listdir(path)  # 得到文件夹下所有文件名称
for xmlFile in files:  # 遍历文件夹
    if xmlFile[-4:] in ['.xml']:
        dom = xml.dom.minidom.parse(os.path.join(path, xmlFile))
        root = dom.documentElement
        # 获取xml中name对应节点
        name = root.getElementsByTagName('name')
        for i in range(len(name)):
            if name[i].firstChild.data == 'ABC':  #修改为你的classname
                name[i].firstChild.data = 'abc'
        # 保存修改到xml文件中
        with open(os.path.join(path, xmlFile), 'w', encoding='UTF-8') as fh:
            dom.writexml(fh, encoding='UTF-8')

jcsjj xmin xmax

训练

  1. 将预训练模型放在data文件夹下的pretrained_model里

  1. 修改pascal_voc.py

根目录/lib/datasets/pascal_voc.py

找到class_name ,保留__background__,其余改为你自己的种类。种类名不能含大写字母,xml修改方法见上面。

训练指令

在终端运行:

CUDA_VISIBLE_DEVICES=0,1 python trainval_net.py --dataset pascal_voc --net res101 --bs 4 --nw 4 --lr 0.005 --lr_decay_step 5 --cuda --epochs 50

CUDA_VISIBLE_DEVICES GPU ID,即使用哪块GPU进行训练,这里0,1为双显卡,单显卡0

–dataset:指训练数据集名称,此处以pascal-voc为例。

–net:所使用的backbone网络,即你要使用的预训练模型,可以换为vgg16。

–bs:指的batch size,显存不够就调小bs。

–nw:指的是worker number,取决于你的Gpu能力

–lr:指学习率

–cuda:指的是使用gpu。

–epoch:指要训练的轮数。

训好的model会存到models文件夹中

出现报错RuntimeError: CUDA out of memory时将bs和nw改小

测试

test_net.py测试

训练完成后,首先进入文件夹model/res101/pascal_voc,查看训练完成之后保存的模型

在文件夹主目录中输入指令进行测试

python test_net.py --dataset pascal_voc --net res101 --checksession 1 --checkepoch 50 --checkpoint 1288 --cuda

运行完成可以看结果

报错 ImportError: cannot import name '_mask '

参考https://blog.csdn.net/Watermelon1986/article/details/110232782

需要安装CoCO API:

在FasterRCNN pytorch文件夹打开终端,激活farcnn虚拟环境,依次执行

conda activate farcnn

cd data

git clone https://github.com/pdollar/coco.git

cd coco/PythonAPI

make

完成即可关闭终端

重新运行指令,顺利进行

报错assert(boxes[:,2]>=boxes[:,0]).all()

参考解决faster-rcnn中训练时assert(boxes[:,2]>=boxes[:,0]).all()的问题略有修改

(1) 修改lib/datasets/pascal_voc.py,_load_pascal_annotation(,)函数

将Xmin,Ymin,Xmax,Ymax 后的-1全部去掉

(2) 修改lib/datasets/imdb.py,append_flipped_images()函数

数据整理,在一行代码为 boxes[:, 2] = widths[i] - oldx1 - 1下加入代码:

aboxes = boxes
for b in range(len(boxes)):
if boxes[b][2] < boxes[b][0]:
    boxes[b][0] = boxes[b][2]
    boxes[b][2] = aboxes[b][0]

原因是数据集中可能有标注框的xmin>xmax,造成报错,这里借助aboxes实现xmin与xmax数据互调

报错RuntimeError: CUDA out of memory

显存不够或Gpu能力不够,将指令中bs和nw改小

CUDA_VISIBLE_DEVICES=0,1 python trainval_net.py --dataset pascal_voc --net res101 --bs 4 --nw 4 --lr 0.005 --lr_decay_step 5 --cuda --epochs 50

报错KeyError: 'difficult'

参考利用py-faster-rcnn训练目标检测模型_liuyan20062010的博客-CSDN博客

difficult = np.array([x['difficult'] for x in R]).astype(np.bool)

KeyError: 'difficult'

difficult = np.array([x['difficult'] for x in R]).astype(np.bool)

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
利用PyQt5为目标检测Faster-RCNN-PyTorch添加GUI界面是一种很好的方式,可提供用户友好的交互界面,方便用户使用和了解检测结果。下面是一种可能的实现方式: 首先,我们需要安装PyQt5库。使用以下命令在终端中安装: ``` pip install PyQt5 ``` 接下来,我们需要创建一个主窗口来容纳GUI界面。使用PyQt5的QMainWindow类,我们可以轻松创建一个窗口。使用以下代码创建一个名为MainWindow的主窗口: ```python from PyQt5.QtWidgets import QMainWindow class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("目标检测GUI") self.setGeometry(100, 100, 800, 600) # 设置窗口的位置和大小 ``` 然后,我们可以在主窗口中添加各种GUI元素,例如按钮、标签和图像显示区域。根据需要,您可以根据您的要求进行自定义。以下是一个示例: ```python from PyQt5.QtWidgets import QLabel, QPushButton class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("目标检测GUI") self.setGeometry(100, 100, 800, 600) self.label = QLabel(self) self.label.setGeometry(10, 10, 780, 480) self.button = QPushButton("开始检测", self) self.button.setGeometry(10, 500, 780, 50) self.button.clicked.connect(self.start_detection) def start_detection(self): # 在此处添加目标检测的代码 pass ``` 最后,我们需要在主函数中初始化应用程序并显示主窗口。使用以下代码: ```python from PyQt5.QtWidgets import QApplication import sys if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec()) ``` 您可以在`start_detection()`方法中添加您的目标检测代码。这样,当用户点击“开始检测”按钮时,将会调用该方法并执行目标检测。 以上是利用PyQt5为目标检测Faster-RCNN-PyTorch添加GUI界面的一种实现方式。您可以根据需要进行进一步的自定义和改进,以实现更好的用户体验和功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值