使用Python和OpenCV训练AI检测安全帽

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

这是一个重要的用例,因为许多公司必须确保工人有适当的安全设备。但所学到的远不止检测安全帽。到本系列结束时,将能够使用AI检测图像或视频流中几乎所有类型的物体。

现在正在阅读的是本系列的第4篇文章,共6篇:

  • 安装OpenCVImageAI进行对象检测
  • 为OpenCV和ImageAI对象检测寻找训练数据
  • 使用预训练模型检测OpenCV和ImageAI的对象
  • 使用OpenCV和ImageAI准备图像进行对象检测
  • 使用OpenCV和ImageAI训练自定义模型
  • 使用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工具。从左侧菜单中选择“Open Dir”并指定目录"hardhat/train/images"。这个目录中的第一张图像将出现。接下来,选择“Change Save Dir”,进入"hardhat/train"文件夹,创建一个名为"annotations"的新文件夹,然后选择这个文件夹。现在准备好注释了。将需要四个热键:

  • w - 开始一个新的边界框准备选择对象。左键点击开始一个框,然后再次左键点击完成。然后输入一个标签(person hardhat)。
  • space - 使用与图像相同的文件名将带有注释的图像保存到保存目录。例如,一个名为testimage.jpg的图像将保存一个名为testimage.xml的。
  • d - 移动到下一张图像,但如果尚未保存,则会提示。
  • a - 移动到前一张图像,但如果尚未保存,则会提示。

注释的图像越多,模型就会训练得越好。这并不会使这个过程变得不那么繁琐,但这绝对是值得的!一旦完成了训练文件夹,也需要注释"validation"文件夹。如果真的不想做,可以在这里下载注释好的图像。

完成后,将有一个包含大量XML文件的文件夹。如果下载了并查看Labeling,将注意到两件事。首先,不需要注释一切,只需要更好的图像。其次,有些图像没有注释,因为没有合适的人佩戴安全帽。这是一个主观决定。用最好的判断力——真的没有对错。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485