摸鱼日志:利用爬虫制作并整理出自己的数据集

利用爬虫制作并整理出自己的数据集

Author:Wenretium

最近在捣鼓些有的没的,需要用到各种各种的数据集。

但是想要的数据集并没有现成的,那就自己收集制作一个吧!

1. 爬取网络图片

用python在bing上进行爬取,使用了这份代码

2. 初步筛选和整理图像

接下来,对爬取到的图片进行处理。

1)手动初步筛选

大致浏览一遍,先手动删除加载失败或明显不符合格式要求的图像(数据集规模较大的话,当然也可以编程来筛选)。

image-20210403230355126
2)去除重复图像

实现方法参考自这篇博客

3)对图像重新编号

读取一个路径下的文件,逐个按顺序重命名后,再写入另一个路径下。注意这里需要用到两个不同的路径(文件夹),因为在一个文件夹下同时读取、重写入,会覆盖掉命名相同的文件,导致混乱。(踩坑实录1)

3. 再次筛选和整理图像

经过上面的步骤,现在已经得到一个完整清晰的数据集了。但是为了后续使用过程的质量,通常需要再次对图像进行人工筛选。

比如不符合主题的图像,删掉!

比如不符合心意的图像,删掉!

各种奇奇怪怪的图像,删掉!

image-20210403230814382

最后,经过精心挑选,就会得到一个大大缩水质量较高的数据集了!

最终,再经过一次整理。为什么上个步骤要进行整理?是为了先去重,避免这里人工筛选的重复工作(踩坑实录2)

数据集就做好了!

整理步骤的代码实现

# 整理.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('完成!!')

其他记录

  1. 用代码整理图像前,最好备份一份,以防万一,不然可能就要重新爬取一遍图片了。(踩坑实录3)
  2. 爬取过程直接用的项目代码,没有更改路径,图像保存在’D:/图片/'下。这里要注意,用cv2读取图像时,图像路径不能带有中文,否则会读取失败。我的解决方案是将’整理.py’放到D盘下来运行,用相对路径来避免中文路径的问题。也可以更改爬取保存路径名等等。
  3. 还是上面的问题,cv2读取图像时路径不能带有中文,所以各种文件夹路径都要注意命名。如果所有图片都读取报错,基本就是这个原因。(踩坑实录4)
  4. 爬取得到的图片,遇到过这些异常情况:
    图像显示字节数为0、也打不开,我猜测是外网原因下载失败。
    图像能打开浏览,但是cv2无法读取,其中有的看起来是爬取时由gif转为jpg而来,所以无法读取,另外的不知道原因。
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值