目标检测simple Faster R-CNN训练自己的数据集

一、复现

刚开始接触目标检测,自己动手复现的第一个开源项目是github上chenyuntc的simple faster rcnn。历经千辛万苦最后貌似因为服务器显卡内存不够,在训练时一直出现一个错误,如下:

目标检测simple Faster R-CNN训练自己的数据集_第1张图片

最后也没解决掉,就直接使用预训练模型去测试了,测试平台是jupyter notebook.在连着实验室使用服务器时,外部的网络就卡成了狗,而我对linux环境的不熟悉,也在一定程度上对自己造成了困扰。总之最后测试的效果还可以,精确度比较高,但是我不知道是否由于自己训练失败的原因,总之没有看到任何训练、测试结果准确度和速度的参数。

二、跑自己数据集

这两天浅浅标注了150张图片的自己的数据集,准备看一下初步效果顺便熟悉一下流程。

1、准备好数据集后的第一件事是要裁剪使其大小合适,(当然去掉无关背景后也方便自己选择图片),裁剪尺寸自己按需来定。裁剪代码如下:

import numpy as np
import cv2
import os


def update(input_img_path, output_img_path):
    image = cv2.imread(input_img_path)
    print(image.shape)
    cropped = image[800:1170, 780:1180]  # 裁剪坐标为[y0:y1, x0:x1]
    cv2.imwrite(output_img_path, cropped)


dataset_dir = r'D:\nagetive-33'
output_dir = r'D:\nagetive-44' #改成自己的路径

# 获得需要转化的图片路径并生成目标路径
image_filenames = [(os.path.join(dataset_dir, x), os.path.join(output_dir, x))
                   for x in os.listdir(dataset_dir)]
# 转化所有图片
for path in image_filenames:
    update(path[0], path[1])

2、裁剪后需要将选好的数据集中的图片重命名,方便查找。(起始序号可更改)排序代码如下:

import os
import os.path
import numpy as np
rootdir = r"F:\DataSet_damo\JPEGImages/" #末尾斜杠不要丢,你的文件存放位置
files = os.listdir(rootdir)
b=1  #可更改起始序号
for name in files:
    a=os.path.splitext(name)
    print(a[0])
    newname = str(b)+'.jpg'
    b = b + 1
    os.rename(rootdir+name,rootdir+newname)

3、 由于我使用的是faster rcnn的改进版算法,其使用的数据集标签格式为VOC格式,不像使用yolo系列还需要做标签的xml——>txt格式转换,因此目前需要做的只有将打完标签的xml格式的数据集分别划分为训练集、验证集和测试集。划分代码如下:

import os
import random

path='D:/VOCtrainval_06-Nov-2007/yoloV3conf\keras-yolo3-master/VOCdevkit/VOC2007/'

trainval_percent = 0.66
train_percent = 0.5

xmlfilepath = path+'Annotations'
txtsavepath = path+'ImageSets/Main'
total_xml = os.listdir(xmlfilepath)
 
num=len(total_xml)
list=range(num)
tv=int(num*trainval_percent)
tr=int(tv*train_percent)
trainval= random.sample(list,tv)
train=random.sample(trainval,tr)
 
ftrainval = open(path+'ImageSets/Main/trainval.txt', 'w')
ftest = open(path+'ImageSets/Main/test.txt', 'w')
ftrain = open(path+'ImageSets/Main/train.txt', 'w')
fval = open(path+'ImageSets/Main/val.txt', 'w')
 
for i  in list:
    name=total_xml[i][:-4]+'\n'
    if i in trainval:
        ftrainval.write(name)
        if i in train:
            ftrain.write(name)
        else:
            fval.write(name)
    else:
        ftest.write(name)
 
ftrainval.close()
ftrain.close()
fval.close()
ftest .close()

你可能感兴趣的:(目标检测,cnn,深度学习,计算机视觉,python)