在本文中,将探讨如何使用OpenCV和ImageAI这两个强大的库来训练人工智能,以检测工人是否佩戴了安全帽。这是一个重要的用例,因为许多公司必须确保工人拥有适当的安全设备。但将学到的知识远不止于此,它对于检测图像或视频流中的任何物体都非常有用。
在开始使用计算机视觉来提高工作场所安全之前,需要安装必要的工具:OpenCV和ImageAI。OpenCV是一个开源的计算机视觉库,支持C++、Python、Java和MATLAB接口。ImageAI是一个机器学习库,它简化了AI训练和图像中的对象检测。这两个库使得解决图像和视频中的许多对象检测问题变得非常容易。将直接跳入解决方案,使用Python在Jupyter Notebook(在Windows上)设置这些库。
假设已经安装了Anaconda Python数据科学平台,并使用基本的默认设置进行了配置。要创建一个Jupyter Notebook来开始编写检测器,必须使用Anaconda安装特定版本的OpenCV、Tensorflow、Keras和ImageAI。从开始菜单中找到并运行Anaconda命令提示符,并输入以下命令:
conda create -n ImageAI -c anaconda keras=2.3.1 tensorflow=1.15.0 tensorflow-gpu=1.15.0 jupyter
第一条命令将Keras、TensorFlow(CPU和GPU版本)、Jupyter及其所有先决条件安装到虚拟环境中。根据ImageAI的需求选择库版本。
接下来,将切换到ImageAI环境,并使用pip安装OpenCV和ImageAI:
conda activateImageAI
pip install opencv-python==4.1.2.30 imageai
使用的是ImageAI的最新版本2.1.5。如果这个版本发生变化,一些先决条件也可能发生变化。
还需要安装一个额外的库——requests库,以便可以使用一些特定的HTML方法。使用以下命令进行安装:
pip install requests
现在让在Jupyter中创建一个新的笔记本。打开Anaconda资源管理器,启动一个新的笔记本——将其命名为"Hard-Hat-Detector"——并添加以下代码块来初始化库:
import cv2 as cv
from imageai.Detection import ObjectDetection as od
import numpy as np
import requests as req
import os as os
这里两个关键的导入是OpenCV(在cv变量中)和ImageAI的检测组件(在od变量中)。其他三个库是通用的Python特定库:numpy用于大型数组和矩阵;requests让可以处理HTTP请求,os用于处理操作系统特定的功能。
现在让测试一下,确保可以处理OpenCV库。首先,让获取一张带有安全帽的人的随机图像来测试获取数据:
url = 'https://p7.hiclipart.com/preview/124/937/193/architectural-engineering-engineer.jpg'
r = req.get(url)
with open('testimage.jpg', 'wb') as outfile:
outfile.write(r.content)
这段代码使用requests库从hiclipart.com获取图像,并将其保存为Jupyter Notebook目录中的文件。它使用了requests库的两种方法:
.get(url) – retrieves the web content at a specific URL
.content – provides access to the raw content retrieved from the URL
很快就会使用类似的过程来获取检测模型的训练数据。
现在已经下载了一个文件,让编写一些代码来使用OpenCV创建一个窗口,然后加载图像并在新窗口中显示它:
img = cv.imread('testimage.jpg')
window_name = 'image'
cv.imshow(window_name, img)
cv.waitKey(0)
cv.destroyAllWindows()
代码使用了许多与OpenCV库相关联的基本方法:
.imread – reads an image from a file
.imshow – shows an image using an OpenCV window
.waitKey – pauses until a keypress is detected
.destroyAllWindows – closes any windows OpenCV created
现在运行代码,应该可以在新窗口中显示戴安全帽的人。按下任意键应该关闭窗口。将经常这样做,所以让清除这个测试,并改变代码,使用一个显示窗口函数,如下所示:
def showImage(img):
window_name = 'image'
cv.imshow(window_name, img)
cv.waitKey(0)
cv.destroyAllWindows()