把标注TXT文件转化为VOC的xml文件

参考链接:点击打开链接

我自己的数据集格式为filename lable xmin ymin xmax ymax

1 通过别的模板转换

VOC数据集的xml格式为:


    
    
  1. <annotation>
  2. <folder>VOC2007 </folder>
  3. <filename>000002.jpg </filename>    //文件名  
  4. <size>                            //图像尺寸(长宽以及通道数
  5. <width>335 </width>
  6. <height>500 </height>
  7. <depth>3 </depth>
  8. </size>
  9. <object>        //检测到的物体
  10. <name>cat </name>    //物体类别
  11. <pose>Unspecified </pose>    //拍摄角度
  12. <truncated>0 </truncated>    //是否被截断(0表示完整
  13. <difficult>0 </difficult>    //目标是否难以识别(0表示容易识别)
  14. <bndbox>                    //bounding-box(包含左下角和右上角xy坐标)
  15. <xmin>139 </xmin>
  16. <ymin>200 </ymin>
  17. <xmax>207 </xmax>
  18. <ymax>301 </ymax>
  19. </bndbox>
  20. </object>
  21. </annotation>

所以我们把它当作模板然后修改成自己的数据集。注意object 可能不止一个。

转换代码:


    
    
import copy
from lxml.etree import Element, SubElement, tostring, ElementTree
import cv2

# 修改为你自己的路径
template_file = ‘G:\dataset\WJ-data\anno.xml’
target_dir = ‘G:\dataset\WJ-data\Annotations\
image_dir = ‘G:\dataset\train\# 图片文件夹
train_file = ‘G:\dataset\train.txt’ # 存储了图片信息的txt文件

with open(train_file) as f:
trainfiles = f.readlines() # 标注数据 格式(filename label x_min y_min x_max y_max)

file_names = []
tree = ElementTree()

for line in trainfiles:
trainFile = line.split()
file_name = trainFile[0]
print(file_name)

<span style="color:#808080;"><em># 如果没有重复,则顺利进行。这给的数据集一张图片的多个框没有写在一起。

if file_name not in file_names:
file_names.append(file_name)
lable = trainFile[1]
xmin = trainFile[2]
ymin = trainFile[3]
xmax = trainFile[4]
ymax = trainFile[5]

    tree.parse(template_file)
    root = tree.getroot()
    root.find(<span style="color:#008080;"><strong>'filename'</strong></span>).text = file_name

    <span style="color:#808080;"><em># size

sz = root.find(‘size’)
im = cv2.imread(image_dir + file_name)#读取图片信息

sz.find(‘height’).text = str(im.shape[0])
sz.find(‘width’).text = str(im.shape[1])
sz.find(‘depth’).text = str(im.shape[2])

    <span style="color:#808080;"><em># object 因为我的数据集都只有一个框

obj = root.find(‘object’)

    obj.find(<span style="color:#008080;"><strong>'name'</strong></span>).text = lable
    bb = obj.find(<span style="color:#008080;"><strong>'bndbox'</strong></span>)
    bb.find(<span style="color:#008080;"><strong>'xmin'</strong></span>).text = xmin
    bb.find(<span style="color:#008080;"><strong>'ymin'</strong></span>).text = ymin
    bb.find(<span style="color:#008080;"><strong>'xmax'</strong></span>).text = xmax
    bb.find(<span style="color:#008080;"><strong>'ymax'</strong></span>).text = ymax
    <span style="color:#808080;"><em># 如果重复,则需要添加object框

else:
lable = trainFile[1]
xmin = trainFile[2]
ymin = trainFile[3]
xmax = trainFile[4]
ymax = trainFile[5]

    xml_file = file_name.replace(<span style="color:#008080;"><strong>'jpg'</strong></span>, <span style="color:#008080;"><strong>'xml'</strong></span>)
    tree.parse(target_dir + xml_file)<span style="color:#808080;"><em>#如果已经重复

root = tree.getroot()

    obj_ori = root.find(<span style="color:#008080;"><strong>'object'</strong></span>)

    obj = copy.deepcopy(obj_ori)  <span style="color:#808080;"><em># 注意这里深拷贝


obj.find(‘name’).text = lable
bb = obj.find(‘bndbox’)
bb.find(‘xmin’).text = xmin
bb.find(‘ymin’).text = ymin
bb.find(‘xmax’).text = xmax
bb.find(‘ymax’).text = ymax
root.append(obj)

xml_file = file_name.replace(<span style="color:#008080;"><strong>'jpg'</strong></span>, <span style="color:#008080;"><strong>'xml'</strong></span>)
tree.write(target_dir + xml_file, <span style="color:#660099;">encoding</span>=<span style="color:#008080;"><strong>'utf-8'</strong></span>)</pre><p style="font-family:'-apple-system', 'SF UI Text', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif, SimHei, SimSun;background-color:rgb(255,255,255);"><span style="font-size:18px;">2.将xml转为符合YOLO的txt</span></p><p style="font-family:'-apple-system', 'SF UI Text', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif, SimHei, SimSun;background-color:rgb(255,255,255);"><span style="background-color:rgb(255,255,255);">标注文件.txt里的数据格式是这样的:</span><br></p><p style="font-family:'-apple-system', 'SF UI Text', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif, SimHei, SimSun;background-color:rgb(255,255,255);"><span style="background-color:rgb(255,255,255);"><img src="https://img-blog.csdn.net/2018062520393841?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI5NzYyOTQx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt=""><br></span></p><p style="font-family:'-apple-system', 'SF UI Text', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif, SimHei, SimSun;background-color:rgb(255,255,255);">转换代码如下:</p><pre onclick="hljs.copyCode(event)"><code class="language-cpp hljs"><ol class="hljs-ln" style="width:854px"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-meta"># box里保存的是ROI感兴趣区域的坐标(x,y的最大值和最小值)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"># 返回值为ROI中心点相对于图片大小的比例坐标,和ROI的w、h相对于图片大小的比例</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-function"><span class="hljs-function">def <span class="hljs-title">convert</span><span class="hljs-params">(size, box)</span>:</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-function">    dw </span>= <span class="hljs-number">1.</span>/(size[<span class="hljs-number">0</span>])</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    dh = <span class="hljs-number">1.</span>/(size[<span class="hljs-number">1</span>])</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    x = (box[<span class="hljs-number">0</span>] + box[<span class="hljs-number">1</span>])/<span class="hljs-number">2.0</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    y = (box[<span class="hljs-number">2</span>] + box[<span class="hljs-number">3</span>])/<span class="hljs-number">2.0</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    w = box[<span class="hljs-number">1</span>] - box[<span class="hljs-number">0</span>]</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    h = box[<span class="hljs-number">3</span>] - box[<span class="hljs-number">2</span>]</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    x = x*dw</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    w = w*dw</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    y = y*dh</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    h = h*dh</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="14"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    <span class="hljs-keyword">return</span> (x, y, w, h)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="15"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="16"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="17"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"># 对于单个xml的处理</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="18"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">def convert_annotation(image_add):</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="19"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    # image_add进来的是带地址的.jpg</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="20"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    #image_add = os.path.split(image_add,<span class="hljs-string">' '</span>)[<span class="hljs-number">1</span>]  # 截取文件名</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="21"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    image_name = image_add.split()[<span class="hljs-number">0</span>]</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="22"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    print(image_name)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="23"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    image_name = image_name.replace(<span class="hljs-string">'.jpg'</span>, <span class="hljs-string"><span class="hljs-string">'')  # 删除后缀,现在只有文件名</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="24"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-string">    in_file = open('</span>G:\\dataset\\WJ-data\\Annotations\\<span class="hljs-string">' + image_name + '</span>.xml')  # 图片对应的xml地址</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="25"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    out_file = open(<span class="hljs-string">'G:\\dataset\\WJ-data\\labels\\%s.txt'</span> % (image_name), <span class="hljs-string">'w'</span>)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="26"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="27"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    tree = ET.parse(in_file)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="28"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    root = tree.getroot()</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="29"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="30"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    size = root.find(<span class="hljs-string">'size'</span>)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="31"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="32"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    w = <span class="hljs-keyword">int</span>(size.find(<span class="hljs-string">'width'</span>).text)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="33"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    h = <span class="hljs-keyword">int</span>(size.find(<span class="hljs-string">'height'</span>).text)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="34"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="35"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    # 在一个XML中每个Object的迭代</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="36"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    <span class="hljs-keyword">for</span> obj in root.iter(<span class="hljs-string">'object'</span>):</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="37"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        # iter()方法可以递归遍历元素/树的所有子元素</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="38"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        difficult = obj.find(<span class="hljs-string">'difficult'</span>).text</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="39"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        cls = obj.find(<span class="hljs-string">'name'</span>).text</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="40"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        # 如果训练标签中的品种不在程序预定品种,或者difficult = <span class="hljs-number">1</span>,跳过此object</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="41"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        <span class="hljs-keyword">if</span> cls <span class="hljs-keyword">not</span> in classes <span class="hljs-keyword">or</span> <span class="hljs-keyword">int</span>(difficult) == <span class="hljs-number">1</span>:</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="42"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">            <span class="hljs-keyword">continue</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="43"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        cls_id = classes.index(cls)#这里取索引,避免类别名是中文,之后运行yolo时要在cfg将索引与具体类别配对</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="44"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        xmlbox = obj.find(<span class="hljs-string">'bndbox'</span>)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="45"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="46"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        b = (<span class="hljs-keyword">float</span>(xmlbox.find(<span class="hljs-string">'xmin'</span>).text), <span class="hljs-keyword">float</span>(xmlbox.find(<span class="hljs-string">'xmax'</span>).text), <span class="hljs-keyword">float</span>(</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="47"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">            xmlbox.find(<span class="hljs-string">'ymin'</span>).text), <span class="hljs-keyword">float</span>(xmlbox.find(<span class="hljs-string">'ymax'</span>).text))</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="48"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        bb = convert((w, h), b)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="49"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        out_file.write(str(cls_id) + <span class="hljs-string">" "</span> + <span class="hljs-string">" "</span>.join([str(a) <span class="hljs-keyword">for</span> a in bb]) + <span class="hljs-string">'\n'</span>)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="50"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="51"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="52"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> os.path.exists(<span class="hljs-string">'G:\\dataset\\WJ-data\\labels\\'</span>):#不存在文件夹</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="53"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    os.makedirs(<span class="hljs-string">'G:\\dataset\\WJ-data\\labels\\'</span>)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="54"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="55"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">image_adds = open(<span class="hljs-string">"G:\\dataset\\train.txt"</span>)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="56"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">for</span> image_add in image_adds:</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="57"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    image_add = image_add.strip()</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="58"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    convert_annotation(image_add)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="59"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="60"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">print(<span class="hljs-string">"Finished"</span>)</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p><span style="font-size:18px;">3.构建训练集与交叉验证集:</span></p><pre onclick="hljs.copyCode(event)"><code class="language-python hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-string"><span class="hljs-string">"""</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-string">分割训练集和验证集</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-string">分别存储了图片的路径</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-string">"""</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">from</span> sklearn.model_selection <span class="hljs-keyword">import</span> train_test_split</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">img_add = <span class="hljs-string">'G:\\dataset\\train.txt'</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">data_set = [x.strip() <span class="hljs-keyword">for</span> x <span class="hljs-keyword">in</span> open(img_add).readlines()]</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">train_X, test_X = train_test_split(data_set, test_size=<span class="hljs-number">0.2</span>, random_state=<span class="hljs-number">0</span>)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">print(train_X)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">print(test_X)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="14"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">train_file = open(<span class="hljs-string">'G:\\dataset\\WJ-data\\train_file.txt'</span>, <span class="hljs-string">'w'</span>)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="15"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">for</span> x <span class="hljs-keyword">in</span> train_X:</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="16"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    x = x.split(<span class="hljs-string">' '</span>)[<span class="hljs-number">0</span>]</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="17"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    print(x)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="18"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    train_file.write(<span class="hljs-string">'G:\\dataset\\train'</span>+x+<span class="hljs-string">'\n'</span>)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="19"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="20"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">test_file = open(<span class="hljs-string">'G:\\dataset\\WJ-data\\valid_file.txt'</span>, <span class="hljs-string">'w'</span>)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="21"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">for</span> x <span class="hljs-keyword">in</span> test_X:</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="22"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    x = x.split(<span class="hljs-string">' '</span>)[<span class="hljs-number">0</span>]</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="23"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    test_file.write(<span class="hljs-string">'G:\\dataset\\train'</span>+x+<span class="hljs-string">'\n'</span>)</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p><span style="font-size:24px;">4.&nbsp;生成类别名文件:</span></p><pre onclick="hljs.copyCode(event)"><code class="language-python hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">with</span> open(<span class="hljs-string">'G:\\dataset\\WJ-data\\obj.names'</span>, <span class="hljs-string">'w'</span>) <span class="hljs-keyword">as</span> f:</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">    <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(<span class="hljs-number">61</span>):</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">        f.write(str(i)+<span class="hljs-string">'\n'</span>)</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p style="font-family:'-apple-system', 'SF UI Text', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif, SimHei, SimSun;background-color:rgb(255,255,255);">参考链接:</p><ol style="list-style:none;color:rgb(51,51,51);font-family:'-apple-system', 'SF UI Text', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif, SimHei, SimSun;font-size:14px;background-color:rgb(255,255,255);"><li><a href="http://www.cnblogs.com/blog4ljy/p/9195752.html" rel="nofollow" target="_blank">一次将自己的数据集制作成PASCAL VOC格式的惨痛经历</a></li><li><a href="http://www.yueye.org/2018/convert-your-own-custom-dataset-to-pascal-voc.html" rel="nofollow" target="_blank">转换</a></li><li><a href="https://blog.csdn.net/u012135425/article/details/80294884" rel="nofollow" target="_blank">YOLOv3训练自己的数据(GPU版本)</a></li><li><a href="https://blog.csdn.net/shangpapa3/article/details/77483324" rel="nofollow" target="_blank">【YOLO】数据集处理训练自己的数据集</a><br></li></ol>            </div>
            </div>## 标题

参考链接:点击打开链接

我自己的数据集格式为filename lable xmin ymin xmax ymax

1 通过别的模板转换

VOC数据集的xml格式为:


  
  
  1. <annotation>
  2. <folder>VOC2007 </folder>
  3. <filename>000002.jpg </filename>    //文件名  
  4. <size>                            //图像尺寸(长宽以及通道数
  5. <width>335 </width>
  6. <height>500 </height>
  7. <depth>3 </depth>
  8. </size>
  9. <object>        //检测到的物体
  10. <name>cat </name>    //物体类别
  11. <pose>Unspecified </pose>    //拍摄角度
  12. <truncated>0 </truncated>    //是否被截断(0表示完整
  13. <difficult>0 </difficult>    //目标是否难以识别(0表示容易识别)
  14. <bndbox>                    //bounding-box(包含左下角和右上角xy坐标)
  15. <xmin>139 </xmin>
  16. <ymin>200 </ymin>
  17. <xmax>207 </xmax>
  18. <ymax>301 </ymax>
  19. </bndbox>
  20. </object>
  21. </annotation>

所以我们把它当作模板然后修改成自己的数据集。注意object 可能不止一个。

转换代码:


  
  
import copy
from lxml.etree import Element, SubElement, tostring, ElementTree
import cv2

猜你喜欢

转载自blog.csdn.net/weixin_43202256/article/details/83185089
今日推荐