使用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