生成用于训练 CNN 的图像数据集

数据挖掘 神经网络 数据集 咖啡
2021-10-06 04:27:43

我想建立一个系统,从图像中识别(具有给定的不确定性)汽车的品牌和型号。我决定使用卷积神经网络,特别是Caffe框架。

我的下一个决定是如何最好地构建我的数据集。根据本书,每个类我需要大约 5000 个数据点(所以可以说大约 500k 图像)。

我已经阅读了一些关于这里和其他资源的信息,似乎Google 自定义搜索 API是一个潜在的选择;但这限制了我每天最多 100 次搜索(免费)。我考虑构建一个脚本来抓取像Autotrader这样的网站;但我抓取网页的经验为零。

有没有人有生成这种大小的图像数据集的经验?您可以与我分享任何智慧的珍珠吗?我很乐意花时间和精力学习Beautiful Soup或这个 Google API,但我不想浪费时间去错误的兔子洞。

3个回答

我决定把我的评论变成答案。

如果您想成为专业人士,请使用诸如scrapy之类的框架。

就个人而言,我发现它们过于繁琐,并且我已经成功使用以下方法。我认为你的用例很简单,对你也有用。

假设您也使用 Python3,您可以轻松抓取网页,然后使用 XPath 表示法获取您想要的内容。

from lxml import html
import urllib.request

# keep running until there are no "next" pages
for page in range(999):  
    url = 'http://blablabla.com/?page=%d' % page
    text = urllib.request.urlopen(url).read()
    tree = html.fromstring(text)
    images = tree.xpath('//img[@class="car"]/href()')
    types = tree.xpath('//div[@class="type"]/text()')
    if not images:
        break
    for i, (cartype, image) in enumerate(zip(types, images)):
        urllib.request.urlretrieve(image, '%s-page%d-img%d.png' % (cartype, page, i))

(纯粹是说明性的例子。)

现在尽可能调整。XPath 是一种非常强大的访问 XML 节点的表示法。比我在这里写的要多得多。学习本教程了解完整的 XPath 语法。

一些网页设计师使得访问任何你想要的东西变得更加困难,因为他们没有正确地class-ify 他们的 HTML 对象。在这些情况下,您可能必须访问父节点并询问他们的子节点。或者访问兄弟姐妹,然后获取兄弟姐妹。无论如何,XPath 和 Python 的lxml包使这一切变得异常简单。

任何现代浏览器(如 Chrome 和 Firefox)也可以让您轻松浏览任何网页的 DOM。只需右键单击并按检查或转到工具菜单中的开发人员工具或类似的东西。

注意:一些网站,例如scholar.google.com不允许使用爬虫,并且非常擅长检测您是否正在这样做。您可以为 urllib 指定一个用户代理,但这可能是徒劳的。即使是高级框架也可能无法为您提供帮助。

编辑:我发表了一篇博文,我在其中详细说明了一点。

你看过斯坦福汽车数据集吗?它有大约 200 辆汽车的 16k 张图像。虽然它没有您要查找的图像数量,但它似乎足以构建分类器(请参阅下面的参考资料)

Justin Chien 的这篇博客文章很好地概述了使用 CNN 在此数据上构建分类器的方法。本文还概述了几种不同的方法

那里有许多不同的公开可用的数据集,大多数都附有描述如何获取数据集的论文。几乎没有人拿起相机自己开始拍摄数千张照片。通过查看这些论文并调整他们查找图像的方法,您可能会找到一些灵感。

一种非常流行的方式是从Flickr下载图像:这是一个照片平台,用户可以在其中分享他们的照片并添加评论或标签,描述图像的内容。Flickr 还有一个用于查找和下载图像的API 。

几个测试查询表明有数千张照片可用:

Query            No of Matches
-------------------------------
VW Passat             57,702
Ford Focus           187,344
Toyota Corolla        81,529
Mitsubishi Lancer    126,242

然而,这不是一个干净的高质量数据集:它包括旧模型、错误标签、内部照片等等。尽管如此,这可能是获取大量图像的一个很好的起点。

数据集清理

也许你可以忍受一些低质量的图像,但我想更好的方法是清理数据集。有很多不同的可能步骤 - 在您的情况下可能不需要一些步骤,您可能需要其他或额外的步骤:

  • 删除非汽车照片。您可能不想要汽车内部的照片,或者根本不显示汽车的照片。例如,您可以使用 ImageNet 分类器对所有图像进行分类,并丢弃所有未被识别为“汽车”的图像。
  • 使用图像检索算法(例如 SIFT 描述符和匹配)来构建包含所有图像及其相似性的图,如 [1] 中所述。丢弃与其余图像几乎没有相似性的所有图像(或至少查看这些图像)。
  • 人工贴标。这是确保您拥有真正高质量数据集的最佳方式。让某人检查所有图像并确保它们满足您拥有的所有条件并正确标记。这是非常非常昂贵的,但肯定会给你最好的结果。如果你真的不需要 - 不要这样做。如果必须,您可以依赖Mechanical Turk或类似网站。

许可

Flickr 的 API 描述说:

Flickr API 可供外部开发人员用于非商业用途。事先安排可用于商业用途。

重要提示:所有照片均为其各自所有者的财产。Flickr 上的所有图片都有特定的许可条件,您也可以通过 API 查询。Flickr 上可用许可证的列表可在其网站上找到。必须确保不侵犯各自所有者的版权。特别是如果你的作品是商业的,这会使事情变得复杂。

参考

[1]:Gordo, A.、Almazan, J.、Revaud, J. 和 Larlus, D. (2016)。深度图像检索:学习图像搜索的全局表示。arXiv:1604.01325