https://blog.csdn.net/u012426298/article/details/80450537
https://blog.csdn.net/u012426298/article/details/80343500
利用Retinanet 訓練自己的數據集 | keras retinanet - focal loss 網絡訓練過程中使用csv格式進行訓練自己的數據
一、csv數據准備(需要利用Pascal voc2007數據集形式來生成)
在生成csv數據集時候,需要先將自己的數據做成VOC 2007形式,參考上篇博客:VOC2007數據集制作-進行自己數據集的訓練,可用於目標檢測、圖像分隔等任務
Pascal voc2007 數據集轉換成csv數據集時候,將會使用voc2007數據集中三個文件JPEGImages,Annatations,ImageSets中Main文件夾生成,結果保存到csv文件夾下的annotations.csv,classes.csv。
首先介紹本文使用的文件夾目錄情況:
1. 自己的voc2007數據集,用來生成csv數據集
自己的VOC數據格式如下,圖片的命名沒有按照標准VOC2007重命名,因為在后面進行Retinanet訓練時候,圖片名字不影響。
├── Annotations │ ├── 0095.xml │ ├── 0096.xml │ ├── 0312.xml │ ├── 0313.xml │ ├── 0588.xml │ ├── 0589.xml │ ├── 0590.xml │ ├── 0800.xml │ ├── 0801.xml │ ├── 0802.xml │ ├── 0803.xml │ ├── 0804.xml │ └── 0805.xml ├── generate_Main_txt.py # generate_Main_txt是上文博客中生成ImageSets/Main中4個txt的函數。在本篇博客暫時用不到 ├── ImageSets │ └── Main │ ├── test.txt │ ├── train.txt │ ├── trainval.txt │ └── val.txt ├── JPEGImages │ ├── 0095.png │ ├── 0096.png │ ├── 0312.png │ ├── 0313.png │ ├── 0588.png │ ├── 0589.png │ ├── 0590.png │ ├── 0800.png │ ├── 0801.png │ ├── 0802.png │ ├── 0803.png │ ├── 0804.png │ └── 0805.png └── pascal2csv.py 4 directories, 32 files
2.自己的csv數據集按如下格式存放
├── csv │ ├── Annotations #上文步驟1中的自己的vOC2007數據集中的Annotations │ │ ├── 0095.xml │ │ ├── 0096.xml │ │ ├── 0312.xml │ │ ├── 0313.xml │ │ ├── 0588.xml │ │ ├── 0589.xml │ │ ├── 0590.xml │ │ ├── 0800.xml │ │ ├── 0801.xml │ │ ├── 0802.xml │ │ ├── 0803.xml │ │ ├── 0804.xml │ │ └── 0805.xml │ ├── annotations.csv #生成的CSV數據集中文件 │ ├── classes.csv #生成的CSV數據集中文件 │ ├── ImageSets #上文步驟1中的自己的vOC2007數據集中的ImageSets │ │ └── Main │ │ ├── test.txt │ │ ├── train.txt │ │ ├── trainval.txt │ │ └── val.txt │ ├── JPEGImages #上文步驟1中的自己的vOC2007數據集中的JPEGImages │ │ ├── 0095.png │ │ ├── 0096.png │ │ ├── 0312.png │ │ ├── 0313.png │ │ ├── 0588.png │ │ ├── 0589.png │ │ ├── 0590.png │ │ ├── 0800.png │ │ ├── 0801.png │ │ ├── 0802.png │ │ ├── 0803.png │ │ ├── 0804.png │ │ └── 0805.png │ └── pascal2csv.py #下文將要說的轉換函數
二、Pascal voc2007 數據集轉換成csv數據轉換函數
直接上pascal2csv.py:
-
# -*- coding:utf-8 -*-
-
-
import csv
-
import os
-
import glob
-
import sys
-
-
class PascalVOC2CSV(object):
-
def __init__(self,xml=[], ann_path='./annotations.csv',classes_path='./classes.csv'):
-
'''
-
:param xml: 所有Pascal VOC的xml文件路徑組成的列表
-
:param ann_path: ann_path
-
:param classes_path: classes_path
-
'''
-
self.xml = xml
-
self.ann_path = ann_path
-
self.classes_path=classes_path
-
self.label=[]
-
self.annotations=[]
-
-
self.data_transfer()
-
self.write_file()
-
-
-
def data_transfer(self):
-
for num, xml_file in enumerate(self.xml):
-
try:
-
# print(xml_file)
-
# 進度輸出
-
sys.stdout.write( '\r>> Converting image %d/%d' % (
-
num + 1, len(self.xml)))
-
sys.stdout.flush()
-
-
with open(xml_file, 'r') as fp:
-
for p in fp:
-
if '<filename>' in p:
-
self.filen_ame = p.split( '>')[1].split('<')[0]
-
-
if '<object>' in p:
-
# 類別
-
d = [next(fp).split( '>')[1].split('<')[0] for _ in range(9)]
-
self.supercategory = d[ 0]
-
if self.supercategory not in self.label:
-
self.label.append(self.supercategory)
-
-
# 邊界框
-
x1 = int(d[ -4]);
-
y1 = int(d[ -3]);
-
x2 = int(d[ -2]);
-
y2 = int(d[ -1])
-
-
self.annotations.append([os.path.join( 'JPEGImages',self.filen_ame),x1,y1,x2,y2,self.supercategory])
-
except:
-
continue
-
-
sys.stdout.write( '\n')
-
sys.stdout.flush()
-
-
def write_file(self,):
-
with open(self.ann_path, 'w', newline='') as fp:
-
csv_writer = csv.writer(fp, dialect= 'excel')
-
csv_writer.writerows(self.annotations)
-
-
class_name=sorted(self.label)
-
class_=[]
-
for num,name in enumerate(class_name):
-
class_.append([name,num])
-
with open(self.classes_path, 'w', newline='') as fp:
-
csv_writer = csv.writer(fp, dialect= 'excel')
-
csv_writer.writerows(class_)
-
-
-
xml_file = glob.glob( './Annotations/*.xml')
-
-
PascalVOC2CSV(xml_file)
函數運行結束后,會在目錄下生成classes.csv、annotations.csv.
他們的格式大致如下:
annotations.csv
path/to/image.jpg,x1,y1,x2,y2,class_name
/data/imgs/img_001.jpg,837,346,981,456,cow /data/imgs/img_002.jpg,215,312,279,391,cat # 02圖片第一個對象 /data/imgs/img_002.jpg,22,5,89,84,bird # 02圖片第二個對象 /data/imgs/img_003.jpg,,,,, # 背景圖片,沒有任何要檢查的對象
classes.csv
class_name,id cow,0 cat,1 bird,2 # 因為這里的背景對應的類別為 空 , # 而mask RCNN 與 FCN(RFCN)都是使用0來表示背景,也就是google object detection中的檢測框架,以及mask rcnn中第一種目標是從1開始標記的
至此,自己數據集csv制作完畢。