摘要:本文將介紹如何使用其他數(shù)據(jù)集重新訓練模型,文章將會詳細介紹每一步。下載數(shù)據(jù)集我們將使用數(shù)據(jù)集訓練我們的模型,該數(shù)據(jù)集可以用來做圖像分類目標檢測圖像分割。模型訓練完成后,權重文件保存路徑。
介紹
YOLO目標檢測快速上手這篇文章我們通過簡短的代碼就實現(xiàn)了一個視頻目標檢測功能。本文將介紹如何使用其他數(shù)據(jù)集重新訓練YOLO模型,文章將會詳細介紹每一步。
下載數(shù)據(jù)集我們將使用Pascal VOC數(shù)據(jù)集訓練我們的模型,該數(shù)據(jù)集可以用來做圖像分類、目標檢測、圖像分割。
下載并解壓文件后,我們介紹下相關文件的作用。
“Annotations”文件夾:用于存放圖片描述,文件格式為.xml,具體內容如下圖所示:
如圖所示,文件保存了圖片文件名,尺寸,標注,坐標,是否分割等信息。
“ImageSets”文件夾:保存了不同用途的圖片名字列表,文件格式是.txt。
“l(fā)ayout”文件夾:保存具有人體部位的圖片名字列表。
“main”文件夾:保存用于圖像物體識別的圖片名字列表。
“segmenttions”文件夾:保存用于圖像分割的圖片名字列表。
因為本次項目使用“main”文件夾,所以我們再詳細看下:
文件夾一共有20個分類的文件,通過文件名字我想大家肯定也知道作用了。這里介紹下文件里的正負數(shù)代表正負樣本,如:
“JPEGImages”文件夾:保存全部圖片源文件。
這里我們要留意的是圖片名字,以后我們在自己創(chuàng)建數(shù)據(jù)集的時候,最好也參考此命名方式。
“SegmentationClass”,“SegmentationObject”保存用于圖像分割的源圖片,兩者區(qū)別如圖所示:
創(chuàng)建標簽標簽的結構是四維分別是("類別",“中心點x坐標”,“中心點y”坐標,“圖片寬度”,“圖片高度”),其實就是上面所說的圖片xml文件中的內容。我們可以通過官方提供的python文件來執(zhí)行此操作。
# 獲取py文件 wget https://pjreddie.com/media/files/voc_label.py
執(zhí)行此文件之前留意下相關路徑是否正確
import xml.etree.ElementTree as ET import pickle import os from os import listdir, getcwd from os.path import join sets=[("2007", "train"), ("2007", "val"), ("2007", "test")] classes = ["aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"] def convert(size, box): dw = 1./size[0] dh = 1./size[1] x = (box[0] + box[1])/2.0 y = (box[2] + box[3])/2.0 w = box[1] - box[0] h = box[3] - box[2] x = x*dw w = w*dw y = y*dh h = h*dh return (x,y,w,h) def convert_annotation(year, image_id): in_file = open("VOCdevkit/VOC%s/Annotations/%s.xml"%(year, image_id)) out_file = open("VOCdevkit/VOC%s/labels/%s.txt"%(year, image_id), "w") tree=ET.parse(in_file) root = tree.getroot() size = root.find("size") w = int(size.find("width").text) h = int(size.find("height").text) for obj in root.iter("object"): difficult = obj.find("difficult").text cls = obj.find("name").text if cls not in classes or int(difficult) == 1: continue cls_id = classes.index(cls) xmlbox = obj.find("bndbox") b = (float(xmlbox.find("xmin").text), float(xmlbox.find("xmax").text), float(xmlbox.find("ymin").text), float(xmlbox.find("ymax").text)) bb = convert((w,h), b) out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + " ") wd = getcwd() for year, image_set in sets: if not os.path.exists("VOCdevkit/VOC%s/labels/"%(year)): os.makedirs("VOCdevkit/VOC%s/labels/"%(year)) image_ids = open("VOCdevkit/VOC%s/ImageSets/Main/%s.txt"%(year, image_set)).read().strip().split() list_file = open("%s_%s.txt"%(year, image_set), "w") for image_id in image_ids: list_file.write("%s/VOCdevkit/VOC%s/JPEGImages/%s.jpg "%(wd, year, image_id)) convert_annotation(year, image_id) list_file.close()
執(zhí)行py文件:
python voc_label.py
執(zhí)行成功后會生成一個label文件夾和三個txt文件,分別是“2007_train.txt”,"2007_test.txt","2007_val.txt"(我只下載了2007的數(shù)據(jù)集),文件保存的是對應功能的全部圖片路徑:
label文件夾內文件格式:
分別是:("類別",“中心點x坐標”,“中心點y”坐標,“圖片寬度”,“圖片高度”)
修改配置文件打開darknet/cfg/voc.data,修改“train”,“valid”文件路徑。
“classes”:數(shù)據(jù)集中圖片分類數(shù)量。
“train”:用于訓練的圖片數(shù)據(jù)集絕對路徑。
“valid”:用于驗證的圖片數(shù)據(jù)集絕對路徑。
“names”:數(shù)據(jù)集中圖片分類名字,如:“dog”,“person”等。
“backup”:模型訓練完成后,權重文件保存路徑。
模型訓練首先下載YOLOv3模型:
wget https://pjreddie.com/media/files/darknet53.conv.74
訓練之前,我們先看下yolov3-voc.cfg文件里都是什么:
[net] # Testing # batch=1 # subdivisions=1 # 模型訓練模式 Training # batch_size batch=64 # 用于進一步分割batch_size,分割后的batch_size大小為:batch_size/subdivisions subdivisions=16 # 模型輸入圖像寬 width=416 # 模型輸入圖像高 height=416 # 圖像通道數(shù) channels=3 # 使用帶動量優(yōu)化函數(shù)的動量參數(shù) momentum=0.9 # 權重衰減率,用于防止過擬合 decay=0.0005 # 以下4項是通過改變圖像角度,飽和度,曝光量,色調來生成更多樣本,可用于防止過擬合 angle=0 saturation = 1.5 exposure = 1.5 hue=.1 # 初始學習率 learning_rate=0.001 burn_in=1000 # 迭代次數(shù) max_batches = 50200 # 當?shù)?0000,45000時更改學習率 policy=steps steps=40000,45000 scales=.1,.1 [convolutional] # BN標準化處理,可以通過改變數(shù)據(jù)分布,處理梯度過小問題,加快模型收斂 batch_normalize=1 # 輸出特征大小 filters=32 # 卷積核大小3x3 size=3 # 卷積步長為1 stride=1 # pad為0,padding由 padding參數(shù)指定。如果pad為1,padding大小為size/2 pad=1 # 激活函數(shù),和relu的區(qū)別是當輸入值小于0時,輸出不為0 activation=leaky **。。。。。省略。。。。。。** [yolo] mask = 0,1,2 # 預選框,可手動指定也可通過聚類學習得到 anchors = 10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326 # 識別種類 classes=20 # 每個cell預測box數(shù)量,yolov1時只有一個 num=9 # 增加噪聲 jitter=.3 ignore_thresh = .5 truth_thresh = 1 random=1
執(zhí)行訓練:
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74
訓練完成后,權重文件保存在backup文件夾內。
總結如果訓練我們自己的數(shù)據(jù),數(shù)據(jù)準備工作參考VOC數(shù)據(jù)集,在模型訓練之前還要更改cfg/yolov3-voc.cfg文件,修改classes類別數(shù)量和filter數(shù)量,其中filter計算方式:3*(classes+1+4),然后訓練即可。
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42851.html
摘要:值得一提的是,基于百度自研的開源深度學習平臺的實現(xiàn),參考了論文,增加了,等處理,精度相比于原作者的實現(xiàn)提高了個絕對百分點,在此基礎上加入最終精度相比原作者提高個絕對百分點。 YOLO作為目標檢測領域的創(chuàng)新技術,一經(jīng)推出就受到開發(fā)者的廣泛關注。值得一提的是,基于百度自研的開源深度學習平臺PaddlePaddle的YOLO v3實現(xiàn),參考了論文【Bag of Tricks for Imag...
摘要:將圖像到作為輸入,輸出,即將圖片劃分為,每個單元格獨立檢測。類別損失當有物體的中心點落在單元格中,此單元格就負責預測該物體。 YOLO-v1介紹 YOLO是一個端到端的目標檢測算法,不需要預先提取region proposal(RCNN目標檢測系列),通過一個網(wǎng)絡就可以輸出:類別,置信度,坐標位置,檢測速度很快,不過,定位精度相對低些,特別是密集型小目標。 showImg(https:...
閱讀 1459·2021-09-30 09:57
閱讀 1466·2021-09-09 09:33
閱讀 2220·2021-09-04 16:40
閱讀 1792·2021-09-01 10:50
閱讀 3237·2021-09-01 10:31
閱讀 2539·2019-08-30 15:56
閱讀 2970·2019-08-30 15:44
閱讀 3475·2019-08-29 17:29