65.9K
CodeProject 正在变化。 阅读更多。
Home

为使用 OpenCV 和 ImageAI 的对象检测准备图像

starIconstarIconstarIconstarIconstarIcon

5.00/5 (8投票s)

2020年6月9日

CPOL

5分钟阅读

viewsIcon

24328

downloadIcon

956

在本文中,我们将训练自己的自定义模型来检测人们是否戴着安全帽。

在本系列中,我们将学习如何使用Python、OpenCV(一个开源计算机视觉库)和ImageAI(一个用于视觉的深度学习库)来训练AI,以检测工人是否佩戴安全帽。在此过程中,我们将创建一个可用于现实生活中的端到端解决方案——这不仅仅是一个学术练习!

这是一个重要的用例,因为许多公司必须确保工人拥有适当的安全设备。但我们学到的东西不仅仅局限于检测安全帽。在本系列结束时,您将能够使用AI检测图像或视频流中的几乎任何类型的对象。

您当前位于第 6 篇文章中的第 4 篇

  1. 为对象检测安装 OpenCV 和 ImageAI
  2. 为 OpenCV 和 ImageAI 对象检测查找训练数据
  3. 使用预训练模型通过OpenCV和ImageAI检测对象
  4. 为使用 OpenCV 和 ImageAI 的对象检测准备图像
  5. 使用OpenCV和ImageAI训练自定义模型
  6. 使用OpenCV和ImageAI检测自定义模型对象

既然我们已经准备好了一些图像和一个检测器,那么让我们训练自己的自定义模型来检测人们是否戴着安全帽。为了使我们的模型获得最佳结果,我们需要确保我们用来训练数据是准确的。我们还需要标注我们的数据,并保留一部分用于模型训练完成后的验证。

清理数据

即使只是简要地,手动检查数据集也总是一个好主意,以确保您使用的数据是干净的。但是,由于我们已经有了一个相当可靠的检测器,我们将让检测器来清理我们的数据。清除包含显示随机图像的代码块,并用以下代码替换它

hardhatImages = os.listdir("hardhat")
peopleOnly = detector.CustomObjects(person=True)

for i in hardhatImages:
    imageFile = "hardhat/{0}".format(i)
    detectedImage, detections = detector.detectCustomObjectsFromImage(custom_objects=peopleOnly, output_type="array", input_image=imageFile, minimum_percentage_probability=30)
    if len(detections) < 1:
        os.remove(imageFile)       

此代码块获取我们下载的安全帽图像列表,并定义检测器,使其仅检测人。因为我们知道所有图像都涉及安全帽,并且因为我们只想在佩戴安全帽的人身上训练我们的模型,所以我们可以使用此检测器来确保我们的数据基本正确。然后,代码遍历每个图像并尝试检测图像中的人。如果没有检测到人,则删除该图像。

此过程进行得相当快,您应该会得到大约 560 张图像。

拆分数据

下一步是将我们的数据集分成两部分。一个部分将用于训练模型,另一个部分将用于验证我们训练好的模型。我们可以手动拆分数据,也可以编写一些代码来拆分它。为了尽可能自动化这些过程,让我们以编程方式拆分数据。开始一个新的代码块并添加以下内容

if not os.path.exists('hardhat/train/images'):
    os.makedirs('hardhat/train/images')
if not os.path.exists('hardhat/validation/images'):
    os.makedirs('hardhat/validation/images')

hardhatImages = os.listdir("hardhat")
hardhatTrainNums = round(len(hardhatImages) * 0.90)

for i in range(0, hardhatTrainNums):
    file = "hardhat/" + hardhatImages[i]
    if os.path.isfile(file):
        os.rename(file, "hardhat/train/images/" + hardhatImages[i])
    
hardhatImages = os.listdir("hardhat")

for i in hardhatImages:
    if i.is_file():
        file = "hardhat/" + i
        os.rename(file, "hardhat/validation/images/" + i)

此代码块使用“os”库中的一些方法将文件拆分为训练数据和验证数据。总体流程是

  • 创建训练和验证文件夹 (os.makedirs)
  • 列出源中的图像并标记其中 90% (os.listdir)
  • 将 90% 的文件移动到 train/images 文件夹 (os.rename)
  • 再次标记源中的其余图像 (os.listdir)
  • 再次将其余图像移动到 validation/images 文件夹 (os.rename)

完成后,我们将拥有两组已排序、已清理的数据,可用于训练检测佩戴安全帽的人的模型,然后验证该模型的有效性。

标注图像

一旦我们有了训练数据,我们就需要标注图像。有时您会找到已标注的图像,但大多数时候您需要通过在要检测的对象周围定义边界框来完成此操作。您可以使用 PASCAL VOC 完成此操作,这是一种使图像数据集标准化以用于对象识别的 XML 格式。幸运的是,有一个名为 LabelImg 的实用工具可以使此过程更容易一些。

下载并运行 LabelImg 实用工具。从左侧菜单中,选择打开目录并指定“hardhat/train/images”目录。此目录中的第一张图像将出现。接下来,选择更改保存目录,进入“hardhat/train”文件夹,创建一个名为“annotations”的新文件夹,然后选择此文件夹。现在我们准备好进行标注了。我们将需要的四个热键是

  • w – 启动一个新边界框,准备选择我们的对象。单击鼠标左键开始框,然后再次单击鼠标左键完成。然后输入一个标签(person hardhat)。
  • 空格 – 使用与图像相同的名称将图像及其标注保存到我们的保存目录。例如,名为 testimage.jpg 的图像将保存一个名为 testimage.xml 的文件。
  • d – 转到下一张图像,但如果尚未保存,则会提示。
  • a – 转到上一张图像,但如果尚未保存,则会提示。

标注的图像越多,您的模型训练得越好。这并不能减轻过程的艰辛,但绝对值得您花时间!完成 train 文件夹后,您还需要标注“validation”文件夹。如果您真的不想这样做,可以在此处下载我标注的图像。

完成后,您将拥有一个包含大量 XML 文件的文件夹。如果您下载了我的文件并在 Labeling 中查看,您会注意到两点。首先,您不需要标注所有内容,只需标注更好的图像即可。其次,我没有标注某些图像,因为没有人戴着合适安全帽。这是一个主观决定。运用您的最佳判断——真的没有对错之分。

接下来

我们已经了解了清理和准备图像数据集以供训练 AI 模型所需的知识。

这一步可能看起来有点令人失望。毕竟,我们在这里是为了训练和使用 AI,而不是为了筛选数据。但是,在使用 AI 时,您会遇到与许多计算领域相同的规则:“垃圾进,垃圾出”。如果您希望模型生成良好的结果,就需要用好的数据来训练它。

现在我们有了一个干净的数据集可以使用,我们将学习如何训练它

© . All rights reserved.