自行准备深度学习训练数据

来源:互联网 发布:c语言线程同算法 编辑:程序博客网 时间:2024/06/06 03:22

深度学习的模型训练中,数据的收集十分重要,取得足够的数据集对于最终模型的表现有十分重要的意义。但是开源的数据集都指定了特定的目标进行标注,如行人,车辆。当要训练自己所需要的特定检测模型,却又没有开源数据集的时候,就需要自己去收集和标注图像数据用于训练了。

1.数据收集

目前主要通过从百度图片上爬图片来进行数据收集,爬虫脚本如下:

#-*- coding:utf-8 -*-  import re  import requests  import sys,os  type=sys.getfilesystemencoding()  def dowmloadPic(html,keyword , i ):      pic_url = re.findall('"objURL":"(.*?)",',html,re.S)         print '找到关键词:'+keyword+'的图片,现在开始下载图片...'      for each in pic_url:          print u'正在下载第'+str(i+1)+u'张图片,图片地址:'+str(each)          try:              pic= requests.get(each, timeout=50)          except  Exception,ex :              print u'【错误】当前图片无法下载'               continue          string = 'pictures\\'+keyword+'_'+str(i) + '.jpg'          #resolve the problem of encode, make sure that chinese name could be store          fp = open(string.decode('utf-8').encode('cp936'),'wb')          fp.write(pic.content)          fp.close()          i += 1      return i  if __name__ == '__main__':      word =  raw_input('Input keywords:')      #url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word='+word+'&ct=201326592&v=flip'      pnMax = input('Input max pn:')      pncount = 0      gsm = 80       str_gsm =str(gsm)      if not os.path.exists('pictures'):          os.mkdir('pictures')      while pncount<pnMax:          str_pn = str(pncount)          url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word='+word+'&pn='+str_pn+'&gsm='+str_gsm+'&ct=&ic=0&lm=-1&width=0&height=0'          result = requests.get(url)          pncount = dowmloadPic(result.text,word ,pncount)      print u'下载完毕'   

需要预先安装request模块,新建个.py文件,将上面的代码复制到其中,然后在终端中切换到.py文件的路径,用python (文件名).py执行即可。如图,输入关键词和数量即可。

这里写图片描述

2.图像重命名

下载的图像还可以按照自己的命名规则进行存储,但有些情况下你拿到的图片的名字不符合你的要求,我们希望能把图片按照顺序来排列。以下给出个小脚本进行图像的批量重命名:

# 先输入下面两行指令,按序号为所有文件命名,而且为了避免与之前的名字冲突(比如之前的名字中有数字的情况),所有名字后面加上字母adeclare -i num=0;for name in `ls`;do mv -f $name `echo $num"a.jpg"`; num=num+1; done # 再输入下面两行指令,按照序号重新给所有文件命名declare -i num=0;for name in `ls`;do mv -f $name `echo $num".jpg"`; num=num+1; done 

将终端路径定到数据所在的文件夹,然后再终端里输入以上四行代码,就可以实现图片按1.jpg,2.jpg,3.jpg,4.jpg,…的顺序重命名

备注:重命名过程中可能遇到文件名中含有空格等符号的情况,当空格出现,一个文件的名字将被空格隔开而看作两个文件名,从而导致重命名失败。这时,需要先用rename命令将空格替代为其他字符,如下:

rename -v 's/ /s/' *

对于rename命令,如果将-v用-n替代,则之会在终端显示重命名过后的名字,但不会对文件名作出修改(方便大家先确认重命名是否正确),而用-v则会对文件进行重命名操作。(一般可以先用-n查看,确认无误后再用-v)之后的's/s2/s3/'表示用字符s3将s2替换,'s/ /s/'表示用s来替换空格,最后的添加表示需要重命名的文件,*是正则匹配符,表示该路径下所有文件,如果需要对所有的.jpg文件进行处理,则*.jpg即可。

3.数据标定

取得了数据后还需要对图像中目标的位置进行标定。在此推介labelImg,其可以直接把你利用你在图上画的框自动生成pascal格式的xml文件。
在此地址去下载labelImg源码 https://github.com/tzutalin/labelImg ,然后用终端进入到labelImg-master文件夹,输入python labelImg.py启动labelImg程序。

  • 快捷键Ctrl+R设置保存xml的路径(路径不能有中文)
  • 源码文件夹中使用notepad++打开data/predefined_classes.txt,可以修改默认类别
  • “Open Dir” 打开图片文件夹,选择第一张图片开始进行标注,使用 “Create RectBox” 或者 “Ctrl+N” 开始画框,单击结束画框,再双击选择类别。完成一张图片后点击 “Save” 保存,此时相应的XML文件已经保存到本地了;点击 “Next Image” 转到下一张图片
  • 标注过程中可随时返回已编辑过的图片并进行修改,后保存的XML文件将会覆盖之前的XML文件
阅读全文
0 0
原创粉丝点击