利用爬虫制作并整理出自己的数据集
Author:Wenretium
最近在捣鼓些有的没的,需要用到各种各种的数据集。
但是想要的数据集并没有现成的,那就自己收集制作一个吧!
1. 爬取网络图片
用python在bing上进行爬取,使用了这份代码。
![](https://img-blog.csdnimg.cn/20210403231049328.png?)
2. 初步筛选和整理图像
接下来,对爬取到的图片进行处理。
1)手动初步筛选
大致浏览一遍,先手动删除加载失败或明显不符合格式要求的图像(数据集规模较大的话,当然也可以编程来筛选)。
![image-20210403230355126](https://img-blog.csdnimg.cn/20210403231154572.png?)
2)去除重复图像
实现方法参考自这篇博客。
3)对图像重新编号
读取一个路径下的文件,逐个按顺序重命名后,再写入另一个路径下。注意这里需要用到两个不同的路径(文件夹),因为在一个文件夹下同时读取、重写入,会覆盖掉命名相同的文件,导致混乱。(踩坑实录1)
![](https://img-blog.csdnimg.cn/20210403231234715.png?)
3. 再次筛选和整理图像
经过上面的步骤,现在已经得到一个完整清晰的数据集了。但是为了后续使用过程的质量,通常需要再次对图像进行人工筛选。
比如不符合主题的图像,删掉!
比如不符合心意的图像,删掉!
各种奇奇怪怪的图像,删掉!
![image-20210403230814382](https://img-blog.csdnimg.cn/20210403231307139.png)
最后,经过精心挑选,就会得到一个大大缩水质量较高的数据集了!
最终,再经过一次整理。为什么上个步骤要进行整理?是为了先去重,避免这里人工筛选的重复工作(踩坑实录2)
![](https://img-blog.csdnimg.cn/20210403231335475.png?)
数据集就做好了!
整理步骤的代码实现
# 整理.py
import os
import cv2
import glob
import hashlib
import shutil
# 删除文件
def removefile(imgpath, delList):
for filePath in delList:
if os.path.isfile(filePath):
os.remove(filePath)
print(filePath + " was removed!")
print
"Directory: " + filePath + " was removed!"
# 获取文件的MD5值
def getmd5(file):
if not os.path.isfile(file):
return
fd = open(file,'rb')
md5 = hashlib.md5()
md5.update(fd.read())
fd.close()
return md5.hexdigest()
# 创建文件夹
def mkdir(path):
path = path.strip() # 去除首位空格
path = path.rstrip("\\") # 去除尾部 \ 符号
# 判断路径是否存在
isExists = os.path.exists(path)
if not isExists:
# 如果不存在则创建目录
os.makedirs(path)
print(path + ' 创建成功')
return True
else:
# 如果目录存在则不创建,并提示目录已存在
print(path + ' 目录已存在')
return False
if __name__ == "__main__":
# imgpath:图像所在文件夹
# saveimgpath:处理后存储图像的文件夹
imgpath = "..\\biying\\imgs0\\"
saveimgpath = "..\\biying\\imgs\\"
md5list = []
identicallist = []
errorlist = []
# 去重
allfile = glob.glob(imgpath+"*")
print('对{}下图像查重,图像有:'.format(imgpath), allfile)
#根据MD5值比较
for photo in allfile:
md5sum = getmd5(photo)
if md5sum not in md5list:
md5list.append(md5sum)
else:
identicallist.append(photo)
print("相同的图像数:" + str(len(identicallist)))
print("原总图像数:" + str(len(allfile)))
print("去重后图像数:" + str(len(allfile)-len(identicallist)))
removefile(imgpath, identicallist)
# 重编号
mkdir(saveimgpath)
index = 1 # 起始命名序号
print('对{}中图像进行重编号后存入{},从序号{}开始'.format(imgpath,saveimgpath,index))
files = glob.glob(imgpath+"*")
for file in files:
img = cv2.imread(file)
if img is None:
print('图像{}读取失败'.format(file))
errorlist.append(file)
continue
cv2.imwrite(saveimgpath+'{}.jpg'.format(index),img)
index += 1
print('读取失败的图像:',errorlist)
print('完成!!')
其他记录
- 用代码整理图像前,最好备份一份,以防万一,不然可能就要重新爬取一遍图片了。(踩坑实录3)
- 爬取过程直接用的项目代码,没有更改路径,图像保存在’D:/图片/'下。这里要注意,用cv2读取图像时,图像路径不能带有中文,否则会读取失败。我的解决方案是将’整理.py’放到D盘下来运行,用相对路径来避免中文路径的问题。也可以更改爬取保存路径名等等。
- 还是上面的问题,cv2读取图像时路径不能带有中文,所以各种文件夹路径都要注意命名。如果所有图片都读取报错,基本就是这个原因。(踩坑实录4)
- 爬取得到的图片,遇到过这些异常情况:
图像显示字节数为0、也打不开,我猜测是外网原因下载失败。
图像能打开浏览,但是cv2无法读取,其中有的看起来是爬取时由gif转为jpg而来,所以无法读取,另外的不知道原因。