Yolo系列学习1-Yolov3训练福彩快三平台出租自己的数据

目的:福彩快三平台出租haozbbs.comQ1446595067

实现利用yolov3训练自己的数据集(voc格式)

方法:

1)构建VOC数据集

将你手中的数据集的标注txt修改成voc格式的txt,voc格式如下:

000002.jpg car 44 28 132 121
000003.jpg car 54 19 243 178
000004.jpg car 168 6 298 164  

其中第一列为图片名,第二列为目标类别,最后是目标的包围框坐标(左上角和右下角坐标)。

批量修改文件名python代码:

pic_path = "D:/VOCdevkit/VOC2007/JPEGImages/"
piclist = os.listdir(pic_path)
total_num = len(piclist)
i = 1
for pic in piclist:
    if pic.endswith(".jpg"):
        old_path = os.path.join(os.path.abspath(pic_path), pic)
        new_path = os.path.join(os.path.abspath(pic_path), ‘000‘ + format(str(i), ‘0>5‘) + ‘.jpg‘)
        os.renames(old_path, new_path)
        i = i + 1

批量合并文件夹内所有txt文件python代码:

import os
filedir = "D:/DET/"
filenames=os.listdir(filedir)
f=open(‘train.txt‘,‘w‘)
for filename in filenames:
    filepath = filedir+‘/‘+filename
    for line in open(filepath):
        f.writelines(line)
f.close()

将该train.txt转换成voc数据所需要的xml,matlab代码如下:

clc;
clear;

imgpath=‘D:/VOCdevkit/VOC2007/JPEGImages/‘;%图像存放文件夹
txtpath=‘D:/train.txt‘;%txt文件
xmlpath_new=‘D:/VOCdevkit/VOC2007/Annotations/‘;%修改后的xml保存文件夹
foldername=‘JPEGImages‘;
path=‘/home/zhangzhi/darknet/scripts/VOCdevkit/VOC2007/JPEGImages/‘;

fidin=fopen(txtpath,‘r‘);
lastname=‘begin‘;

while ~feof(fidin)
     tline=fgetl(fidin);
     str = regexp(tline, ‘ ‘,‘split‘);
     filepath=[imgpath,str{1}];
     ppath=[path,str{1}];
     img=imread(filepath);
     [h,w,d]=size(img);
%      imshow(img);
%      rectangle(‘Position‘,[str2double(str{3}),str2double(str{4}),str2double(str{5})-str2double(str{3}),str2double(str{6})-str2double(str{4})],‘LineWidth‘,4,‘EdgeColor‘,‘r‘);
      pause(0.1);

        if strcmp(str{1},lastname)%如果文件名相等,只需增加object
           object_node=Createnode.createElement(‘object‘);
           Root.appendChild(object_node);
           node=Createnode.createElement(‘name‘);
           node.appendChild(Createnode.createTextNode(sprintf(‘%s‘,str{2})));
           object_node.appendChild(node);

           node=Createnode.createElement(‘pose‘);
           node.appendChild(Createnode.createTextNode(sprintf(‘%s‘,‘Unspecified‘)));
           object_node.appendChild(node);

           node=Createnode.createElement(‘truncated‘);
           node.appendChild(Createnode.createTextNode(sprintf(‘%s‘,‘0‘)));
           object_node.appendChild(node);

           node=Createnode.createElement(‘difficult‘);
           node.appendChild(Createnode.createTextNode(sprintf(‘%s‘,‘0‘)));
           object_node.appendChild(node);

           bndbox_node=Createnode.createElement(‘bndbox‘);
           object_node.appendChild(bndbox_node);

           node=Createnode.createElement(‘xmin‘);
           node.appendChild(Createnode.createTextNode(sprintf(‘%s‘,num2str(str{3}))));
           bndbox_node.appendChild(node);

           node=Createnode.createElement(‘ymin‘);
           node.appendChild(Createnode.createTextNode(sprintf(‘%s‘,num2str(str{4}))));
           bndbox_node.appendChild(node);

           node=Createnode.createElement(‘xmax‘);
           node.appendChild(Createnode.createTextNode(sprintf(‘%s‘,num2str(str{5}))));
           bndbox_node.appendChild(node);

           node=Createnode.createElement(‘ymax‘);
           node.appendChild(Createnode.createTextNode(sprintf(‘%s‘,num2str(str{6}))));
           bndbox_node.appendChild(node);
        else
           copyfile(filepath, ‘JPEGImages‘);

           if exist(‘Createnode‘,‘var‘)
              tempname=lastname;
              tempname=strrep(tempname,‘.jpg‘,‘.xml‘);
              xmlwrite(tempname,Createnode);
           end

            Createnode=com.mathworks.xml.XMLUtils.createDocument(‘annotation‘);
            Root=Createnode.getDocumentElement;
            node=Createnode.createElement(‘folder‘);
            node.appendChild(Createnode.createTextNode(sprintf(‘%s‘,foldername)));
            Root.appendChild(node);
            node=Createnode.createElement(‘filename‘);
            node.appendChild(Createnode.createTextNode(sprintf(‘%s‘,str{1})));
            Root.appendChild(node);
            node=Createnode.createElement(‘path‘);
            node.appendChild(Createnode.createTextNode(sprintf(‘%s‘,ppath)));
            Root.appendChild(node);
            source_node=Createnode.createElement(‘source‘);
            Root.appendChild(source_node);
            node=Createnode.createElement(‘database‘);
            node.appendChild(Createnode.createTextNode(sprintf(‘My Database‘)));
            source_node.appendChild(node);

           size_node=Createnode.createElement(‘size‘);
           Root.appendChild(size_node);

          node=Createnode.createElement(‘width‘);
          node.appendChild(Createnode.createTextNode(sprintf(‘%s‘,num2str(w))));
          size_node.appendChild(node);

          node=Createnode.createElement(‘height‘);
          node.appendChild(Createnode.createTextNode(sprintf(‘%s‘,num2str(h))));
          size_node.appendChild(node);

         node=Createnode.createElement(‘depth‘);
         node.appendChild(Createnode.createTextNode(sprintf(‘%s‘,num2str(d))));
         size_node.appendChild(node);

          node=Createnode.createElement(‘segmented‘);
          node.appendChild(Createnode.createTextNode(sprintf(‘%s‘,‘0‘)));
          Root.appendChild(node);
          object_node=Createnode.createElement(‘object‘);
          Root.appendChild(object_node);
          node=Createnode.createElement(‘name‘);
          node.appendChild(Createnode.createTextNode(sprintf(‘%s‘,str{2})));
          object_node.appendChild(node);

          node=Createnode.createElement(‘pose‘);
          node.appendChild(Createnode.createTextNode(sprintf(‘%s‘,‘Unspecified‘)));
          object_node.appendChild(node);

          node=Createnode.createElement(‘truncated‘);
          node.appendChild(Createnode.createTextNode(sprintf(‘%s‘,‘0‘)));
          object_node.appendChild(node);

          node=Createnode.createElement(‘difficult‘);
          node.appendChild(Createnode.createTextNode(sprintf(‘%s‘,‘0‘)));
          object_node.appendChild(node);

          bndbox_node=Createnode.createElement(‘bndbox‘);
          object_node.appendChild(bndbox_node);

         node=Createnode.createElement(‘xmin‘);
         node.appendChild(Createnode.createTextNode(sprintf(‘%s‘,num2str(str{3}))));
         bndbox_node.appendChild(node);

         node=Createnode.createElement(‘ymin‘);
         node.appendChild(Createnode.createTextNode(sprintf(‘%s‘,num2str(str{4}))));
         bndbox_node.appendChild(node);

        node=Createnode.createElement(‘xmax‘);
        node.appendChild(Createnode.createTextNode(sprintf(‘%s‘,num2str(str{5}))));
        bndbox_node.appendChild(node);

        node=Createnode.createElement(‘ymax‘);
        node.appendChild(Createnode.createTextNode(sprintf(‘%s‘,num2str(str{6}))));
        bndbox_node.appendChild(node);

       lastname=str{1};
        end
        if feof(fidin)
            tempname=lastname;
            tempname=strrep(tempname,‘.jpg‘,‘.xml‘);
            xmlwrite(tempname,Createnode);
        end
end
fclose(fidin);

file=dir(pwd);
for i=1:length(file)
   if length(file(i).name)>=4 && strcmp(file(i).name(end-3:end),‘.xml‘)
    fold=fopen(file(i).name,‘r‘);
    fnew=fopen([xmlpath_new file(i).name],‘w‘);
    line=1;
    while ~feof(fold)
        tline=fgetl(fold);
        if line==1
           line=2;
           continue;
        end
        expression = ‘   ‘;
        replace=char(9);
        newStr=regexprep(tline,expression,replace);
        fprintf(fnew,‘%s\n‘,newStr);
    end
    fprintf(‘已处理%s\n‘,file(i).name);
    fclose(fold);
    fclose(fnew);
    delete(file(i).name);
   end
end

生成的xml如下所示

<annotation>
    <folder>JPEGImages</folder>
    <filename>00000000.jpg</filename>
    <path>/home/zhangzhi/darknet/scripts/VOCdevkit/VOC2007/JPEGImages/00000000.jpg</path>
    <source>
        <database>My Database</database>
    </source>
    <size>
        <width>512</width>
        <height>512</height>
        <depth>3</depth>
    </size>
    <segmented>0</segmented>
    <object>
        <name>car</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>277</xmin>
            <ymin>498</ymin>
            <xmax>304</xmax>
            <ymax>511</ymax>
        </bndbox>
    </object>
</annotation>

生成Main中的四个txt(train.txt,val.txt,test.txt,trainval.txt)

txt的内容为没有后缀名的图片名称:

000005
000027
000028
000033
000042
000045
000048
000058

即图片名字(无后缀),test.txt是测试集,train.txt是训练集,val.txt是验证集,trainval.txt是训练和验证集。VOC2007中,trainval大概是整个数据集的50%,test也大概是整个数据集的50%;train大概是trainval的50%,val大概是trainval的50%。可参考以下代码:

%%
%该代码根据已生成的xml,制作VOC2007数据集中的trainval.txt;train.txt;test.txt和val.txt
%trainval占总数据集的50%,test占总数据集的50%;train占trainval的50%,val占trainval的50%;
%上面所占百分比可根据自己的数据集修改,如果数据集比较少,test和val可少一些
%注意修改下面四个值
xmlfilepath=‘F:/VOCdevkit/VOC2007/Annotations/‘;
txtsavepath=‘F:/VOCdevkit/VOC2007/ImageSets/Main/;
trainval_percent=0.5;%trainval占整个数据集的百分比,剩下部分就是test所占百分比
train_percent=0.5;%train占trainval的百分比,剩下部分就是val所占百分比  

%%
xmlfile=dir(xmlfilepath);
numOfxml=length(xmlfile)-2;%减去.和..  总的数据集大小  

trainval=sort(randperm(numOfxml,floor(numOfxml*trainval_percent)));
test=sort(setdiff(1:numOfxml,trainval));  

trainvalsize=length(trainval);%trainval的大小
train=sort(trainval(randperm(trainvalsize,floor(trainvalsize*train_percent))));
val=sort(setdiff(trainval,train));  

ftrainval=fopen([txtsavepath ‘trainval.txt‘],‘w‘);
ftest=fopen([txtsavepath ‘test.txt‘],‘w‘);
ftrain=fopen([txtsavepath ‘train.txt‘],‘w‘);
fval=fopen([txtsavepath ‘val.txt‘],‘w‘);  

for i=1:numOfxml
    if ismember(i,trainval)
        fprintf(ftrainval,‘%s\n‘,xmlfile(i+2).name(1:end-4));
            if ismember(i,train)
                fprintf(ftrain,‘%s\n‘,xmlfile(i+2).name(1:end-4));
            else
                fprintf(fval,‘%s\n‘,xmlfile(i+2).name(1:end-4));
            end
    else
        fprintf(ftest,‘%s\n‘,xmlfile(i+2).name(1:end-4));
    end
end
fclose(ftrainval);
fclose(ftrain);
fclose(fval);
fclose(ftest);  

整合文件

新建立一个VOC2007文件夹,在该文件夹下面新建JPEGImages,Annotations,labels,ImageSets文件夹,将所有训练的图片均放置在JPEGImages文件夹下,将第二步生成的xml文件放置在Annotations文件夹中,在ImageSets下新建Main文件夹,将第三步生成的四个txt放入其中,将下面步骤生成的文件放置于labels文件夹中

上面步骤的代码均是在Windows下使用,下面代码在Ubuntu下使用。生成labels文件:

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join

#修改
#sets=[(‘2012‘, ‘train‘), (‘2012‘, ‘val‘), (‘2007‘, ‘train‘), (‘2007‘, ‘val‘), (‘2007‘, ‘test‘)]
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"]
classes = ["car", "van", "truck ", "bus"]

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]) + ‘\n‘)

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\n‘%(wd, year, image_id))
        convert_annotation(year, image_id)
    list_file.close()

#如果需要用train和val的数据一起用来训练,合并文件:
 os.system("cat 2007_train.txt 2007_val.txt > train.txt")
 os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt > train.all.txt")

2)修改yolov3的相关文件

修改cfg/voc.data文件,进行如下修改:

classes= 4  # 自己数据集的类别数
train  = /home/zhangzhi/darknet/VOCdevkit/2007_train.txt  # train文件的路径
valid  = /home/zhangzhi/darknet/VOCdevkit/2007_test.txt   # test文件的路径
names = data/voc.names
backup = backup  

修改data/voc.names文件,对应自己的数据集修改类别。

car
van
truck
bus

下载Imagenet上预先训练的权重

wget https://pjreddie.com/media/files/darknet53.conv.74

修改cfg/yolov3-voc.cfg

找到文件中类似的部分进行修改,共有3处:

[convolutional]
size=1
stride=1
pad=1
<span style="color:#FF6666;">filters=27</span>
activation=linear

[yolo]
mask = 0,1,2
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
<span style="color:#FF6666;">classes=4</span>
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1

需要改变filters为num/3(classes+1+4),即3(classes+1+4),参考https://github.com/pjreddie/darknet/issues/582,同时需要修改下面的classes的种类。

3)训练,测试

./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74

./darknet detector test cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_final.weights data/dog.jpg

原文地址:http://blog.51cto.com/13861859/2139883

时间: 2024-10-09 10:51:40

Yolo系列学习1-Yolov3训练福彩快三平台出租自己的数据的相关文章

dubbo源码福彩快三平台搭建分析22 -- consumer 发送与接收原理

在前面福彩快三平台搭建论坛:haozbbs.com Q1446595067的文章中,我们分析了 dubbo 从 provider 进行服务暴露,然后把服务信息注册到注册中心上面解耦 consumer 与 provider 的调用.consumer 通过 javassist 创建代理对象引用远程服务.当通过代理对象调用远程服务的时候,讲到进行真正调用的时候 dubbo 抽象出集群容错(Cluster.Directory.Router.LoadBalance)从服务多个暴露方选取出一个合适的 Inv

你是程序员,帮我修个电脑吧?吉林快三平台出租

试问有哪个程序员没被要求过帮忙修修电脑.帮忙看看网络怎么了?吉林快三平台出租Q 1152880099  vx: wowotou552  罔 www.1152880099.com/ 如果不是非常亲密的人,那能提出这种要求的人怕是情商智商都有点毛病. 情商上来说,修电脑这种需要高专业度且花个钱就能解决的事情,不适合随便拜托别人;智商上来说--朋友,你见过程序员找工作面试的时候,HR考他怎么修电脑的吗? 生活里这类例子多了去了. 遇到健身教练就想让人帮你3天瘦10斤,还得不打针.不吃药.不节食.不运动

直播答题助手江苏快三平台出租

"世界杯要搞答题直播江苏快三平台出租Q 1152880099  vx: wowotou552  罔 www.1152880099.com/,搜狐准备了百万奖金." 这是近日搜狐董事局主席兼CEO张朝阳在接受媒体采访时,对外界透露的信息. 从今年年初开始,直播答题一路火爆不减. 然而,在众多平台蜂拥进入直播答题领域时,一些问题也逐渐暴露出来,其中,最受关注的莫过于各种辅助类作弊软件的出现. 就在答题者对"答题助手"还处于爱恨交加之际,一则新闻引爆舆论--"百

何快速的提高快三平台出租嵌入式的水平呢?

随着计算快三平台出租haozbbs.comQ1446595067机行业的发展.智能产品的增多.嵌入式技术也日渐变得流行.但是目前国内从事嵌入式这方面的人才比较稀缺.俗话说物以稀为贵,职位也一样.嵌入式人才稀缺,身价自然就变高了,越有经验价格就越高,看到有这样的机会很多人也就按耐不住了.对于一些非专业的人士来说,怎么样学习嵌入式就成了他们头疼的问题.下面就有小编为大家介绍一下如何快速有效的学习嵌入式. 如何快速的提高嵌入式的水平呢? 1.多动手练习 我国的大学很少让学生有实践能力,尤其是在大量扩招

一篇文章总结幸运快三平台出租了JVM类加载机制

1.加载幸运快三平台出租haozbbs.comQ1446595067 把二进制表示的Class文件读进JVM中2.连接 验证(验证字节码的有效性) 准备(初始化静态变量的值) 解析(把符号引用转直接引用) 3.初始化为静态变量赋值二.什么时候需要开始加载类? 1.主动引用时需要加载类 使用new 关键字实例化对象 读取或设置一个类的静态字段(被final修饰.已在编译期把结果放入常量池的静态字段除外) 调用一个类的静态方法 2.被动引用时不需要加载类 在子类中引用父类的静态属性,不会触发子类的加

STM32把SD卡内极速快三平台出租搬运到内部FLASH

STM32操极速快三平台出租haozbbs.comQ1446595067 作访问flash,包括写入数据到flash和从flash读取数据 :https://blog.csdn.net/Ace_Shiyuan/article/details/78196648 这篇文章写得比较明白,但是它写的函数不饱满,没有把Flash充分写满.请看写数组的函数:FLASHStatus = FLASH_ProgramHalfWord(STARTADDR+WriteAddress+i*2, temp);//写入数据

分布式之抉择分布式锁快三平台出租

为什么写这篇文章?目前网上大部分的基于zookeeper快三平台出租请QQ2952777280[话仙源码论坛]http://hxforum.com [木瓜源码论坛]http://papayabbs.com ,和redis的分布式锁的文章都不够全面.要么就是特意避开集群的情况,要么就是考虑不全,读者看着还是一脸迷茫.坦白说,这种老题材,很难写出新创意,博主内心战战兢兢,如履薄冰,文中有什么不严谨之处,欢迎批评.博主的这篇文章,不上代码,只讲分析.(1)在redis方面,有开源redisson的ja

ArrayList.add() 方法吉林快-三平台出租源码解析

吉林快-三平台出租Q1446595067解析源码的方法>>> list.add("hello"); 该方法涉及到的方法被我复制到了一个类中,至于解释,全在注释上.初次解析,别喷我!!! 如有不足望评论,随时补充. package com.nc.sourceCode; import java.lang.reflect.Array;import java.util.ArrayList;import java.util.Arrays;import java.util.Lis

使用saltstack部署极速快三平台搭建

极速快三平台搭建搭建环境: 1.服务器列表: 企 娥:217 1793 408salt-master: 192.168.42.131 salt-minion: 192.168.42.128(minion-192.168.42.128) 192.168.42.130(minion-192.168.42.130) 2.环境: (1)服务器之间互相可以通信(火墙关闭或者火墙允许通信) (2)master对minion的主机名和ip做好解析 部署步骤 1.确定整个配置的目录文件结构: pcre软件安装