1. 程式人生 > >使用faster rcnn訓練自己的模型

使用faster rcnn訓練自己的模型

安裝caffe

資料預處理

我這裡主要是使用python對xml進行處理。

生產xml的程式碼:

# -*- coding:utf-8 -*-

__author__ = "Yu Chen"

import xml.dom
import xml.dom.minidom
import os
import json
import scipy
import numpy
import matplotlib
from PIL import Image

_ANNOTATION_SAVE_FOLDER_ = 'Annotations'
# xml檔案規範定義
_INDENT = '\t'
#' ' * 4 _NEW_LINE = '\n' _FOLDER_NODE = 'VOC2007' _ROOT_NODE = 'annotation' _DATABASE_NAME = 'INRIA' _ANNOTATION = 'PASCAL VOC2007' _AUTHOR = 'Yu Chen' _SEGMENTED = '0' _DIFFICULT = '0' _TRUNCATED = '0' _POSE = 'Unspecified' _IMAGE_HEIGHT = 360 _IMAGE_WIDTH = 640 _IMAGE_CHANNEL = 3 # 封裝建立節點的過程 def createElementNode
(doc, tag, attr):
# 建立一個元素節點 element_node = doc.createElement(tag) # 建立一個文字節點 text_node = doc.createTextNode(attr) # 將文字節點作為元素節點的子節點 element_node.appendChild(text_node) return element_node # 封裝新增一個子節點的過程 def createChildNode(doc, tag, attr, parent_node): child_node = createElementNode(doc, tag, attr) parent_node.appendChild(child_node) # object節點比較特殊
def createObjectNode(doc, attrs): object_node = doc.createElement('object') createChildNode(doc, 'name', attrs['classification'], object_node) createChildNode(doc, 'pose', _POSE, object_node) createChildNode(doc, 'truncated', _TRUNCATED, object_node) createChildNode(doc, 'difficult', _DIFFICULT, object_node) bndbox_node = doc.createElement('bndbox') createChildNode(doc, 'xmin', attrs['xmin'], bndbox_node) createChildNode(doc, 'ymin', attrs['ymin'], bndbox_node) createChildNode(doc, 'xmax', attrs['xmax'], bndbox_node) createChildNode(doc, 'ymax', attrs['ymax'], bndbox_node) object_node.appendChild(bndbox_node) return object_node # 將documentElement寫入XML檔案中 def writeXMLFile(doc, filename): tmpfile = open('tmp.xml', 'w') doc.writexml(tmpfile, addindent=_INDENT, newl='\n', encoding='utf-8') tmpfile.close() # 刪除第一行預設新增的標記 fin = open('tmp.xml') fout = open(filename, 'w') fout = open(filename, 'w') lines = fin.readlines() for line in lines[1:]: if line.split(): fout.writelines(line) #new_lines = ''.join(lines[1:]) #fout.write(new_lines) fin.close() fout.close() # 建立XML文件並寫入節點資訊 def createXMLFile(attrs, width, height, filename): # 建立文件物件, 文件物件用於建立各種節點 my_dom = xml.dom.getDOMImplementation() doc = my_dom.createDocument(None, _ROOT_NODE, None) # 獲得根節點 root_node = doc.documentElement # folder節點 createChildNode(doc, 'folder', _FOLDER_NODE, root_node) # filename節點 createChildNode(doc, 'filename', attrs['name'], root_node) # source節點 source_node = doc.createElement('source') # source的子節點 createChildNode(doc, 'database', _DATABASE_NAME, source_node) createChildNode(doc, 'annotation', _ANNOTATION, source_node) createChildNode(doc, 'image', 'flickr', source_node) createChildNode(doc, 'flickrid', 'NULL', source_node) root_node.appendChild(source_node) # owner節點 owner_node = doc.createElement('owner') # owner的子節點 createChildNode(doc, 'flickrid', 'NULL', owner_node) createChildNode(doc, 'name', _AUTHOR, owner_node) root_node.appendChild(owner_node) # size節點 size_node = doc.createElement('size') createChildNode(doc, 'width', str(width), size_node) createChildNode(doc, 'height', str(height), size_node) createChildNode(doc, 'depth', str(_IMAGE_CHANNEL), size_node) root_node.appendChild(size_node) # segmented節點 createChildNode(doc, 'segmented', _SEGMENTED, root_node) # object節點 object_node = createObjectNode(doc, attrs) root_node.appendChild(object_node) # 寫入檔案 writeXMLFile(doc, filename) if __name__ == "__main__": # open label fid = open('training/label.idl', 'r') # storage path if not os.path.exists('Annotations/'): os.mkdir('Annotations') while True: line = fid.readline() if line: data = json.loads(line) for ite_key in data.keys(): #print ite_key attrs = dict() attrs['name'] = str(ite_key) xml_file_name = os.path.join(_ANNOTATION_SAVE_FOLDER_, (attrs['name'].split('.'))[0] + '.xml') print xml_file_name if data[ite_key]: for bbx in data[ite_key]: attrs['xmin'] = str(bbx[0]) attrs['ymin'] = str(bbx[1]) attrs['xmax'] = str(bbx[2]) attrs['ymax'] = str(bbx[3]) attrs['classification'] = str(bbx[4]) if os.path.exists(xml_file_name): # print('do exists') existed_doc = xml.dom.minidom.parse(xml_file_name) root_node = existed_doc.documentElement # 如果XML存在了, 新增object節點資訊即可 object_node = createObjectNode(existed_doc, attrs) root_node.appendChild(object_node) # 寫入檔案 writeXMLFile(existed_doc, xml_file_name) # print bbx[0], bbx[1], bbx[2], bbx[3], bbx[4] else: # print('not exists') # 如果XML檔案不存在, 建立檔案並寫入節點資訊 # 建立XML檔案 createXMLFile(attrs, _IMAGE_WIDTH, _IMAGE_HEIGHT, xml_file_name) else: # createEmptyXMLFile(attrs, _IMAGE_WIDTH, _IMAGE_HEIGHT, xml_file_name) print "Empty List" else: break fid.close()

生產Main的txt程式碼:

# -*- coding:utf-8 -*-

import os
import random

__author__ = 'Yu Chen'

'''

設定trainval和test資料集包含的圖片

'''

# ImageSets資料夾

_IMAGE_SETS_PATH = 'ImageSets'
_MAin_PATH = 'ImageSets/Main'
_XML_FILE_PATH = 'Annotations'

# Train資料集編號
_TRAIN_NUMBER = 6000
_TEST_NUM = 70091 # 72090

if __name__ == '__main__':

    resul = range(60091, 70091)
    random.shuffle(resul)

    # 建立ImageSets資料集
    if os.path.exists(_IMAGE_SETS_PATH):
        print('ImageSets dir is already exists')
        if os.path.exists(_MAin_PATH):
            print('Main dir is already in ImageSets')
        else:
            os.mkdir(_MAin_PATH)
    else:
        os.mkdir(_IMAGE_SETS_PATH)
        os.mkdir(_MAin_PATH)

    f_test = open(os.path.join(_MAin_PATH, 'test.txt'), 'w')
    f_trainval = open(os.path.join(_MAin_PATH, 'trainval.txt'), 'w')
    f_train = open(os.path.join(_MAin_PATH, 'train.txt'), 'w')
    f_val = open(os.path.join(_MAin_PATH, 'val.txt'), 'w')

    num = 0
    for root, dirs, files in os.walk(_XML_FILE_PATH):
        print len(files)
        for f in files:
            element = f.split('.')[0]
            f_trainval.write(str(element)+'\n')
            if num > _TRAIN_NUMBER:
                f_val.write(str(element) + '\n')
            else:
                f_train.write(str(element) + '\n')
            num += 1


    for i in range(_TEST_NUM, 72091):
        f_test.write(str(i) + '\n')

    f_test.close()
    f_trainval.close()
    f_train.close()
    f_val.close()

對於訓練程式碼的修改

遇到問題

1、error 1:assert (boxes[:, 2] >= boxes[:, 0]).all()
將py-faster-rcnn/lib/datasets/imdb.py中的相應程式碼改成如下程式碼即可:

def append_flipped_images(self):
        num_images = self.num_images
        widths = [PIL.Image.open(self.image_path_at(i)).size[0]
                  for i in xrange(num_images)]
        for i in xrange(num_images):
            boxes = self.roidb[i]['boxes'].copy()
            oldx1 = boxes[:, 0].copy()
            oldx2 = boxes[:, 2].copy()
            boxes[:, 0] = widths[i] - oldx2 - 1
            boxes[:, 2] = widths[i] - oldx1 - 1

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

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

2、IndexError: list index out of range

刪除fast-rcnn-master/data/cache/ 資料夾下的.pkl檔案,或者改名備份,重新訓練即可。

3、image_num aeert divide 0.
這是因為在做xml的時候,沒有目標的圖片不能記錄。

參考性很強

相關推薦

使用faster-rcnn訓練自己模型

參考 faster-rcnn 原始碼連結 論文連結 一個不錯的參考 faster rcnn簡介 各檔案目錄介紹  caffe-fast-rcnn —> caffe框架  data —> 存放資料,以及讀取檔案的ca

使用faster rcnn訓練自己模型

安裝caffe 資料預處理 我這裡主要是使用python對xml進行處理。 生產xml的程式碼: # -*- coding:utf-8 -*- __author__ = "Yu Chen" import xml.dom

使用pytorch版faster-rcnn訓練自己資料集

使用pytorch版faster-rcnn訓練自己資料集 引言 faster-rcnn pytorch程式碼下載 訓練自己資料集 接下來工作 參考文獻 引言 最近在復現目標檢測程式碼(師兄強烈推薦F

Faster RCNN訓練自己的資料集

Faster RCNN(py caffe)工程各個目錄的作用: caffe-fast-rcnn:caffe框架目錄; data:用來存放pretrained(預訓練)模型以及讀取檔案的cache快取,還有一些下載模型的指令碼; experiments:存放配置

Caffe學習系列——Faster-RCNN訓練自己的資料集

由於要實現服裝的目標檢測,所以一直在研究Faster-RCNN 。講到目標檢測,不得不提到rbg大神的深度神經網路檢測算法系列RCNN、Fast-RCNN、Faster-RCNN,其還在github上開源了自己的程式碼,造福廣大碼農。這是rbg大神的主頁 https://people.eecs.berk

使用faster rcnn訓練自己的資料(py-faster-rcnn

出於在csdn上面學到很多東西這裡也幫自己的一些收穫和大家分享一下     直奔主題~~ 前提是已經安裝好caffe的環境 本文是在Ubuntu 15.04下做的測試 $Faster_rcnn表示py-faster-rcnn根目錄 1. 修改資料介面 ($Faster_rc

Faster RCNN 訓練自己的資料集遇到的一些問題

1. xml標籤格式問題 原本的標籤是yaml格式的,需要轉換成xml格式。 在製作xml標籤時,有些資訊是比較重要的不能省略 <?xml version="1.0" encoding="utf-8"?> <annotation> <folder>

不能再詳細!!!手把手教你用Faster-RCNN訓練自己的資料集

一、環境安裝準備 python2.7以及相關的包cython, python-opencv, easydict 本文假設你已經按照上面的教程完成了安裝,並可以執行demo.py 並且可以訓練 二、準備自己的資料集 在實際的應用中,這個資料集肯定是自己專案裡面拍攝的。

深度學習Caffe實戰筆記(20)Windows平臺 Faster-RCNN 訓練自己的資料集

1、把自己的資料集放到Faster-master中 我覺得這個過程是最重要的一個過程吧,博主在這裡跳了很多的坑,最後找到了一個非常簡單高效的方法。不用修改任何檔案,就可以輕鬆實現載入自己的資料集。 在faster_rcnn-master資料夾下,有一個d

Faster-RCNN 訓練自己資料集的坑記錄

主要照這篇部落格進行訓練配置,因為沒有GPU所以好多坑,CPU訓練可以參見這篇部落格 正所謂,跑通了的都一樣,錯誤千萬樣。按照教程來也是坑多 訓練: python train_faster_rcnn_alt_opt.py --net_name ZF --weights

利用faster rcnn 訓練自己的資料集——kitti資料集

前言:非常感謝https://blog.csdn.net/flztiii/article/details/73881954,這篇部落格,本文主要參考這篇文章kitti資料集是一個車輛檢測的資料集資料集的準備Kitti資料集的下載只需要第一個圖片集(12G)和標註檔案即可【第一

py-faster-rcnn訓練自己資料集需要修改的引數

faster rcnn預設有三種網路模型ZF(小)、VGG_CNN_M_1024(中)、VGG16 (大) 訓練圖片大小為500*500,類別數1。 修改VGG_CNN_M_1024模型配置

win10 tensorflow faster rcnn訓練自己的資料集(一、製作VOC2007資料集)

參考部落格:http://blog.csdn.net/gaohuazhao/article/details/60871886 一、關於VOC資料集: 1)JPEGImages資料夾 資料夾裡包含了訓練圖片和測試圖片,混放在一起 2)Annatations資料夾 資

faster-rcnn訓練自己的資料時報錯too many indices

利用faster-rcnn 好不容易四個階段訓練完了,在測試的時候出現這個錯誤。 原因:在data/VOCdevkit2007/results/VOC2007/Main/  這個檔案下有n個txt檔案。n是你的類別數            每個txt儲存了test.txt

製作自己的目標檢測資料集再利用tf-faster-rcnn訓練

1.製作資料集的工具 我利用資料集標註工具是精靈標註助手,我認為很好用。奉勸一句標註資料集時不要隨便找人給你標,如果他沒有用心給你標註,你在後面訓練會出現很多問題。在一開始標註資料集的時候不要一下子給他標註完,先標註幾十張圖片,然後用在你的網路裡,看看有沒有錯誤,如果沒有問

深度學習Caffe實戰筆記(21)Windows平臺 Faster-RCNN 訓練好的模型測試資料

前一篇部落格介紹瞭如何利用Faster-RCNN訓練自己的資料集,訓練好會得到一個模型,這篇部落格介紹如何利用訓練好的模型進行測試資料。 1、訓練好的模型存放位置 訓練好的模型存放在faster_rcnn-master\output\faster_rcnn_

TF-Faster-RCNN訓練篇(基礎版)結合自己訓練的修改過程而撰寫

這裡,我就主要記錄一下自己在跑tensorflow框架下的faster-rcnn。首先,就是硬體要求,這裡只能做到使用一塊GPU。具體環境要求:        1.Ubuntu  16.04系統、CUDA 8.0和cudnn(可以支援NVIDIA的GPU運算,當然有很多人在說

faster rcnn訓練測試+單獨測試預訓練好的模型

這裡主要講兩個方面內容,一方面是從無到有如何成功執行demo(假設你的Caffe已經可以用),另一方面是如何自己訓練模型,可以用自己的資料,也可以是本文的VOC資料集。 一、執行demo 直接按照git上的readme進行安裝和編譯即可,由於git上的說明較為簡單,所以接下來詳細介紹: 1、Clone

Mxnet(2)---faster-rcnn製作自己的資料集進行訓練

Mxnet自帶有faster-rcnn的例子,但是如果要用自己的資料進行訓練可能需要作一些更改,一個是類別的數目,一個數據的標籤。其實它的修改方式和py-faster-rcnn差不多。 **

Faster RCNN訓練的兩種模型配置

./experiments/scripts/faster_rcnn_end2end.sh 0 zf pascal_voc./experiments/scripts/faster_rcnn_alt_op