ImageAI 中文文档

ImageAI

ImageAI是一个python库,旨在使开发人员能够使用简单的几行代码构建具有包含深度学习和计算机视觉功能的应用程序和系统。 这个AI Commons项目https://commons.specpal.scienceMoses OlafenwaJohn Olafenwa开发和维护


ImageAI本着简洁的原则,支持最先进的机器学习算法,用于图像预测,自定义图像预测,物体检测,视频检测,视频对象跟踪和图像预测训练。ImageAI目前支持使用在ImageNet-1000数据集上训练的4种不同机器学习算法进行图像预测和训练。ImageAI还支持使用在COCO数据集上训练的RetinaNet进行对象检测,视频检测和对象跟踪。 最终,ImageAI将为计算机视觉提供更广泛和更专业化的支持,包括但不限于特殊环境和特殊领域的图像识别。

新版本:ImageAI 2.0.1

新功能:

  • 添加了 SqueezeNet,ResNet50,InceptionV3 和 DenseNet121 模型进行自定义图像预测训练
  • 添加了自定义训练模型和json文件进行导入和导出自定义图像
  • 预览版:添加视频对象检测和视频自定义对象检测(对象跟踪)
  • 为所有图像预测和对象检测任务添加文件,numpy数组和流输入类型(仅用于视频检测的文件输入)
  • 添加文件和numpy数组输出类型,用于图像中的对象检测和自定义对象检测
  • 引入4种速度模式(’normal’, ‘fast’, ‘faster’ and ‘fastest’)进行图像预测,在’fastest’速度模式下预测时间将缩短50%,同时保持预测精准度
  • 为图像所有物体检测和视频物体检测任务引入5种速度模式(’normal’, ‘fast’, ‘faster’, ‘fastest’ and ‘flash’),在’flash’速度模式下预测时间将缩短80%以上并且精准度与minimum_percentage_probability保持一致,请将该值调至较低
  • 引入帧检测率,允许开发人员调整视频中的检测间隔frame_detection_interval,有利于达到特定效果。

依赖

在应用程序开发中使用ImageAI之前必须安装以下依赖项:

  • Python 3.5.1(及更高版本) 下载(即将推出支持Python 2.7)
  • pip3 安装
  • Tensorflow 1.4.0(及更高版本) 安装 或 通过pip安装
    pip3 install --upgrade tensorflow
  • Numpy 1.13.1(及更高版本) 安装或 通过pip安装
    pip3 install numpy
  • SciPy 0.19.1(及更高版本) 安装或 通过pip安装
    pip3 install scipy
  • OpenCV 安装或 通过pip安装
    pip3 install opencv-python
  • pillow 安装或 通过pip安装
    pip3 install pillow
  • Matplotlib 安装或 通过pip安装
    pip3 install matplotlib
  • h5py 安装或 通过pip安装
    pip3 install h5py
  • Keras 2.x 安装或 通过pip安装
    pip3 install keras

安装

请在命令行中运行如下命令来安装 ImageAI
pip3 install https://github.com/OlafenwaMoses/ImageAI/releases/download/2.0.1/imageai-2.0.1-py3-none-any.whl

或者下载Python Wheel imageai-2.0.1-py3-none-any.whl 安装文件并在命令行中指定安装文件的路径来安装ImageAI
pip3 install C:\User\MyUser\Downloads\imageai-2.0.1-py3-none-any.whl

图像预测

ImageAI 提供4种不同的算法及模型来执行图像预测,并在ImageNet-1000数据集上进行训练。提供用于图像预测的4种算法包括 SqueezeNetResNetInceptionV3DenseNet。您将在下面看到的示例是使用ResNet50模型进行图像预测的结果。单击图像下方的“教程和文档”链接以查看完整的示例代码,相关说明,最佳实践指南和文档。

https://github.com/OlafenwaMoses/ImageAI/raw/master/images/1.jpg

convertible : 52.459555864334106
sports_car : 37.61284649372101
pickup : 3.1751200556755066
car_wheel : 1.817505806684494
minivan : 1.7487050965428352

>>>教程和文档

对象检测

ImageAI 提供了非常方便和强大的方法来对图像执行对象检测并从图像中提取每个对象。用于对象检测的类仅支持当前最先进的RetinaNet目标检测算法,但提供了性能调整和实时处理参数。您将在下面看到的示例是使用RetinaNet模型进行对象检测的结果。单击图像下方的“教程和文档”链接以查看完整的示例代码,相关说明,最佳实践指南和文档。

输入图像

https://github.com/OlafenwaMoses/ImageAI/raw/master/images/image2.jpg

输出图像

https://github.com/OlafenwaMoses/ImageAI/raw/master/images/image2new.jpg

person : 91.946941614151
person : 73.61021637916565
laptop : 90.24320840835571
laptop : 73.6881673336029
laptop : 95.16398310661316
person : 87.10319399833679

>>>教程和文档

视频对象检测和跟踪

ImageAI 提供了非常方便和强大的方法来在视频中执行对象检测并跟踪特定对象。用于视频对象检测的类仅支持当前最先进的RetinaNet目标检测算法,但提供了性能调整和实时处理参数。您将在下面看到的示例是使用RetinaNet模型进行对象检测的结果。单击图像下方的“教程和文档”链接以查看完整的示例代码,相关说明,最佳实践指南和文档。

视频对象检测

下面是检测到对象的视频快照。

https://github.com/OlafenwaMoses/ImageAI/raw/master/images/video1.jpg

视频自定义对象检测(对象跟踪)

以下是仅检测到人,自行车和摩托车的视频快照。

https://github.com/OlafenwaMoses/ImageAI/raw/master/images/video2.jpg

>>>教程和文档

自定义预测模型训练

ImageAI 为您提供了一些类和方法,用于训练可以对您自定义对象执行预测的新模型。您可以使用 SqueezeNet,ResNet50,InceptionV3 或 DenseNet 算法在不到12行代码中训练您自定义的模型。单击图像下方的“教程和文档”链接可查看完整视频,示例代码,相关说明,最佳实践指南和文档。

在 IdenProf 数据集中训练模型用于预测专业人员。

https://github.com/OlafenwaMoses/ImageAI/raw/master/images/idenprof.jpg

>>>教程和文档

自定义图像预测

ImageAI 为您提供了类和方法,您可以使用 ImageAI 模型训练类训练您自定义的模型并在图像中预测您自定义的对象。您可以使用使用 SqueezeNet,ResNet50,InceptionV3 或 DenseNet 训练自定义模型和包含自定义对象名称映射的JSON文件。单击图像下方的“教程和文档”链接以查看完整的示例代码,相关说明,最佳实践指南和文档。

在 IdenProf 数据集中训练模型用于预测专业人员。

https://github.com/OlafenwaMoses/ImageAI/raw/master/images/4.jpg

mechanic : 76.82620286941528
chef : 10.106072574853897
waiter : 4.036874696612358
police : 2.6663416996598244
pilot : 2.239348366856575

>>>教程和文档

实时和高性能实施

ImageAI 提供了先进计算机视觉技术的抽象和方便的实现。所有 ImageAI 代码都可以在中等CPU核心数的计算机系统上运行。但是,CPU上的图像预测、对象检测等操作的处理速度很慢,不适合实时应用。要以高性能执行实时计算机视觉操作,您需要使用支持GPU的技术。

ImageAI 基于 Tensorflow 进行计算机视觉操作。Tensorflow 支持 CPU 和 GPU(特别是NVIDIA GPU),要使用支持 GPU 的 Tensorflow,请点击以下链接进行安装:

样本应用

如果您需要用 ImageAI 进行演示,可以使用我们在Windows平台上基于 ImageAIKivy 构建的人工智能照片库 IntelliP 。点击此 链接下载应用程序页面及其源代码。

我们也欢迎您提交任何基于ImageAI构建的应用程序和系统。如果你需要获得开发者的支持,你可以通过下面的联系方式联系开发者。

AI实践建议

对于任何有兴趣建立人工智能系统并将其用于商业,经济,社会和研究目的的人来说,至关重要的是该人员知道这些技术的使用所产生的积极和消极影响。他们还需要听从那些具有经验丰富的行业专家们的实践建议和方法,以确保人工智能的每次使用都为人类带来整体利益。因此,我们建议所有希望使用ImageAI和其他人工智能工具的人阅读微软2018年1月出版的题为“未来计算:人工智能及其在社会中的作用”的出版物。请点击以下链接下载该出版物。

https://blogs.microsoft.com/blog/2018/01/17/future-computed-artificial-intelligence-role-society

联系开发者

Moses Olafenwa
Email: guymodscientist@gmail.com
Website: https://moses.specpal.science
Twitter: @OlafenwaMoses
Medium : @guymodscientist
Facebook : moses.olafenwa

John Olafenwa
Email: johnolafenwa@gmail.com
Website: https://john.specpal.science
Twitter: @johnolafenwa
Medium : @johnolafenwa
Facebook : olafenwajohn

参考文献

  1. Somshubra Majumdar, DenseNet Implementation of the paper, Densely Connected Convolutional Networks in Keras
    https://github.com/titu1994/DenseNet/
  2. Broad Institute of MIT and Harvard, Keras package for deep residual networks
    https://github.com/broadinstitute/keras-resnet
  3. Fizyr, Keras implementation of RetinaNet object detection
    https://github.com/fizyr/keras-retinanet
  4. Francois Chollet, Keras code and weights files for popular deeplearning models
    https://github.com/fchollet/deep-learning-models
  5. Forrest N. et al, SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size
    https://arxiv.org/abs/1602.07360
  6. Kaiming H. et al, Deep Residual Learning for Image Recognition
    https://arxiv.org/abs/1512.03385
  7. Szegedy. et al, Rethinking the Inception Architecture for Computer Vision
    https://arxiv.org/abs/1512.00567
  8. Gao. et al, Densely Connected Convolutional Networks
    https://arxiv.org/abs/1608.06993
  9. Tsung-Yi. et al, Focal Loss for Dense Object Detection
    https://arxiv.org/abs/1708.02002
  10. O Russakovsky et al, ImageNet Large Scale Visual Recognition Challenge
    https://arxiv.org/abs/1409.0575
  11. TY Lin et al, Microsoft COCO: Common Objects in Context
    https://arxiv.org/abs/1405.0312
  12. Moses & John Olafenwa, A collection of images of identifiable professionals.
    https://github.com/OlafenwaMoses/IdenProf

ImageAI:图像预测

AI共享项目https://commons.specpal.science


ImageAI 提供4种不同的算法及模型来执行图像预测,通过以下简单几个步骤即可对任何图片执行图像预测。提供用于图像预测的4种算法包括 SqueezeNetResNetInceptionV3DenseNet。这些算法中的每一个都有单独的模型文件,您必须根据所选算法使用相对应的模型文件,请单击以下链接下载所选算法的模型文件:

- SqueezeNet(文件大小:4.82 MB,预测时间最短,精准度适中)
- ResNet50 by Microsoft Research (文件大小:98 MB,预测时间较快,精准度高)
- InceptionV3 by Google Brain team (文件大小:91.6 MB,预测时间慢,精度更高)
- DenseNet121 by Facebook AI Research (文件大小:31.6 MB,预测时间较慢,精度最高)

很好!下载对应模型文件后,启动一个新的python项目,然后将模型文件复制到python文件(.py文件)所在的项目文件夹中。下载下面的图像,或者您所拍摄的任何图像并将其复制到python项目的文件夹中。然后创建一个python文件并为其命名; 例如FirstPrediction.py。然后将下面的代码写入python文件中:

FirstPrediction.py

from imageai.Prediction import ImagePrediction
import os
execution_path = os.getcwd()

prediction = ImagePrediction()
prediction.setModelTypeAsResNet()
prediction.setModelPath(os.path.join(execution_path, "resnet50_weights_tf_dim_ordering_tf_kernels.h5"))
prediction.loadModel()

predictions, probabilities = prediction.predictImage(os.path.join(execution_path, "1.jpg"), result_count=5 )
for eachPrediction, eachProbability in zip(predictions, probabilities):
    print(eachPrediction + " : " + eachProbability)

示例结果:
https://github.com/OlafenwaMoses/ImageAI/raw/master/images/1.jpg

convertible : 52.459555864334106
sports_car : 37.61284649372101
pickup : 3.1751200556755066
car_wheel : 1.817505806684494
minivan : 1.7487050965428352

让我们对示例中的图像预测代码进行解读:

from imageai.Prediction import ImagePrediction
import os 

上面的代码导入了ImageAI库和 python os 类。

execution_path = os.getcwd()

上面的代码获取包含python文件的文件夹路径(在本例中python文件为FirstPrediction.py)。

prediction = ImagePrediction()
prediction.setModelTypeAsResNet()
prediction.setModelPath(os.path.join(execution_path, "resnet50_weights_tf_dim_ordering_tf_kernels.h5"))
prediction.loadModel()

在上面的代码中,我们对ImagePrediction()类进行了实例化,第二行调用了.setModelTypeAsResNet()函数将预测对象的模型类型设置为ResNet,第三行设置了模型文件(resnet50_weights_tf_dim_ordering_tf_kernels.h5)的路径,第四行载入模型。

predictions, probabilities = prediction.predictImage(os.path.join(execution_path, "1.jpg"), result_count=5 )

在上面的代码中,我们定义了两个变量,他们的值将由所调用的函数predictImage()返回,其中predictImage()函数接受了两个参数,一个是指定要进行图像预测的图像文件路径,另一个参数result_count用于设置我们想要预测结果的数量(该参数的值可选1 to 100)。最后,predictImage()函数将返回预测的对象名和相应的百分比概率(percentage_probabilities)。

for eachPrediction, eachProbability in zip(predictions, probabilities):
    print(eachPrediction + " : " + eachProbability)

在上面的代码获取了predictions变量中的每个对象名,并从probabilities变量中获取相应的百分比概率,最后将两者的结果打印到终端。

多图像预测

您可以多次调用.predictImage()函数来对多张图像进行预测,但是我们提供了一个简单的方法,您只需调用一次.predictMultipleImages()函数即可对多张图像进行预测。它的工作原理如下:

  • 定义普通的ImagePrediction实例
  • 通过.setModelTypeAsResNet()设置模型类型和.setModelPath()模型路径
  • 调用.loadModel()函数载入模型
  • 创建一个数组并将所有要预测的图像的路径添加到数组中。
  • 然后通过调用.predictMultipleImages()函数解析包含图像路径的数组并执行图像预测,通过解析result_count_per_image(默认值为2)的值来设定每个图像需要预测多少种可能的结果

以下是示例代码:

from imageai.Prediction import ImagePrediction
import os

execution_path = os.getcwd()

multiple_prediction = ImagePrediction()
multiple_prediction.setModelTypeAsResNet()
multiple_prediction.setModelPath(os.path.join(execution_path, "resnet50_weights_tf_dim_ordering_tf_kernels.h5"))
multiple_prediction.loadModel()

all_images_array = []

all_files = os.listdir(execution_path)
for each_file in all_files:
    if(each_file.endswith(".jpg") or each_file.endswith(".png")):
        all_images_array.append(each_file)

results_array = multiple_prediction.predictMultipleImages(all_images_array, result_count_per_image=5)

for each_result in results_array:
    predictions, percentage_probabilities = each_result["predictions"], each_result["percentage_probabilities"]
    for index in range(len(predictions)):
        print(predictions[index] + " : " + percentage_probabilities[index])
    print("-----------------------")

在上面的代码中,.predictMultipleImages()函数将返回一个由dict组成的array,每个dict包含了每张图像所预测出的可能图像名list和相应的百分比概率list,并把所有可能的对象名和概率打印到终端。

示例结果:
https://github.com/OlafenwaMoses/ImageAI/raw/master/images/1.jpg https://github.com/OlafenwaMoses/ImageAI/raw/master/images/2.jpg https://github.com/OlafenwaMoses/ImageAI/raw/master/images/3.jpg

convertible : 52.459555864334106
sports_car : 37.61284649372101
pickup : 3.1751200556755066
car_wheel : 1.817505806684494
minivan : 1.7487050965428352
-----------------------
toilet_tissue : 13.99008333683014
jeep : 6.842949986457825
car_wheel : 6.71963095664978
seat_belt : 6.704962253570557
minivan : 5.861184373497963
-----------------------
bustard : 52.03368067741394
vulture : 20.936034619808197
crane : 10.620515048503876
kite : 10.20539253950119
white_stork : 1.6472270712256432
-----------------------

预测速度

ImageAI 为图像预测任务添加了预测速度调节功能,最多可使预测时间缩短60%。可选的速度模式有normal(default), fast, faster , fastest 。您只需要在调用loadModel()函数是指定参数prediction_speed的值为你想要的速度模式即可,如下所示。

prediction.loadModel(prediction_speed="fast")

为了观察不同速度模式间的差异,请查看下面不同速度模式下相同图像预测所花费的时间。(实验环境 OS:Windows 8, CPU:Intel Celeron N2820 2.13GHz)

速度模式=”normal”,花费时间= 5.9秒

convertible : 52.459555864334106
sports_car : 37.61284649372101
pickup : 3.1751200556755066
car_wheel : 1.817505806684494
minivan : 1.7487050965428352
-----------------------
toilet_tissue : 13.99008333683014
jeep : 6.842949986457825
car_wheel : 6.71963095664978
seat_belt : 6.704962253570557
minivan : 5.861184373497963
-----------------------
bustard : 52.03368067741394
vulture : 20.936034619808197
crane : 10.620515048503876
kite : 10.20539253950119
white_stork : 1.6472270712256432
-----------------------

速度模式=”fast”,花费时间= 3.4秒

sports_car : 55.5136501789093
pickup : 19.860029220581055
convertible : 17.88402795791626
tow_truck : 2.357563190162182
car_wheel : 1.8646160140633583
-----------------------
drum : 12.241223454475403
toilet_tissue : 10.96322312951088
car_wheel : 10.776633024215698
dial_telephone : 9.840480983257294
toilet_seat : 8.989936858415604
-----------------------
vulture : 52.81011462211609
bustard : 45.628002285957336
kite : 0.8065823465585709
goose : 0.3629807382822037
crane : 0.21266008261591196
-----------------------

速度模式=”faster”,花费时间= 2.7秒

sports_car : 79.90474104881287
tow_truck : 9.751049429178238
convertible : 7.056044787168503
racer : 1.8735893070697784
car_wheel : 0.7379394955933094
-----------------------
oil_filter : 73.52778315544128
jeep : 11.926891654729843
reflex_camera : 7.9965077340602875
Polaroid_camera : 0.9798810817301273
barbell : 0.8661789819598198
-----------------------
vulture : 93.00530552864075
bustard : 6.636220961809158
kite : 0.15161558985710144
bald_eagle : 0.10513027664273977
crane : 0.05982434959150851
-----------------------

速度模式=”fastest”,花费时间= 2.2秒

tow_truck : 62.5033438205719
sports_car : 31.26143217086792
racer : 2.2139860317111015
fire_engine : 1.7813067883253098
ambulance : 0.8790366351604462
-----------------------
reflex_camera : 94.00787949562073
racer : 2.345871739089489
jeep : 1.6016140580177307
oil_filter : 1.4121259562671185
lens_cap : 0.1283118617720902
-----------------------
kite : 98.5377550125122
vulture : 0.7469987496733665
bustard : 0.36855682265013456
bald_eagle : 0.2437378279864788
great_grey_owl : 0.0699841941241175
-----------------------

请注意:

在需要调整速度模式时,最好使用具有更高精度的模型(DenseNet or InceptionV3),或者预测图像是标志性的(明显的);这样更能确保预测的精准度。

图像输入类型

旧版本 ImageAI 图像预测功能仅支持指定图像文件路径的图像输入方式。新版本 ImageAI 图像预测功能支持3种输入类型,即 file path to image file(默认),numpy array of imageimage file stream。这意味着您在进行图像预测时可以使用上述格式返回文件到系统中。

要使用 numpy arrayfile stream 类型进行图像输入时,您只需要在.predictImage().predictMultipleImages()函数中声明input_type参数为arraystream即可,示例如下:

predictions, probabilities = prediction.predictImage(image_array, result_count=5 , input_type="array" ) # For numpy array input type
predictions, probabilities = prediction.predictImage(image_stream, result_count=5 , input_type="stream" ) # For file stream input type

多线程预测

当您在默认线程上开发像用户界面(UI)这样任务繁重的程序时,您应该考虑在新线程中运行图像预测。在新线程中使用ImageAI运行图像预测时注意以下事项:

  • 您可以创建ImagePrediction类的实例,设置其模型类型setModelTypeAsResNet()和模型文件路径setModelPath()
  • loadModel()predictImage() 函数必须在新线程中调用。

以下是使用多线程进行图像预测的示例代码:

from imageai.Prediction import ImagePrediction
import os
import threading
execution_path = os.getcwd()

prediction = ImagePrediction()
prediction.setModelTypeAsResNet()
prediction.setModelPath( os.path.join(execution_path, "resnet50_weights_tf_dim_ordering_tf_kernels.h5"))

picturesfolder = os.environ["USERPROFILE"] + "\Pictures\"
allfiles = os.listdir(picturesfolder)

class PredictionThread(threading.Thread):
    def init(self):
        threading.Thread.init(self)
    def run(self):
        prediction.loadModel()
    for eachPicture in allfiles:
        if eachPicture.endswith(".png") or eachPicture.endswith(".jpg"):
            predictions, probabilities = prediction.predictImage(picturesfolder + eachPicture, result_count=1)
            for prediction, percentage_probability in zip(predictions, probabilities):
                print(prediction + " : " + percentage_probability)

predictionThread = PredictionThread()
predictionThread.start()

文档

imageai.Prediction.ImagePrediction class


在任何的Python程序中通过实例化ImagePrediction类并调用下面的函数即可进行图像预测:

  • setModelTypeAsSqueezeNet() 如果您选择使用 SqueezeNet 模型文件来预测图像,你只需调用一次该函数。

  • setModelTypeAsResNet() 如果您选择使用 ResNet 模型文件来预测图像,你只需调用一次该函数。

  • setModelTypeAsInceptionV3() 如果您选择使用 InceptionV3Net 模型文件来预测图像,你只需调用一次该函数。

  • setModelTypeAsDenseNet() 如果您选择使用 DenseNet 模型文件来预测图像,你只需调用一次该函数。

  • setModelPath() 该函数用于设定模型文件的路径。模型文件必须与您设置的模型类型相对应。

  • loadModel() 该函数用于载入模型,在调用predictImage()函数之前需要调用此函数一次。该函数接收一个prediction_speed参数。该参数用于指定图像预测的速度模式,当速度模式设置为’fastest’时预测时间可缩短60%左右,具体取决于图像的质量。

    • prediction_speed(可选); 可接受的值是”normal”, “fast”, “faster”, “fastest”
  • predictImage() 此函数用于通过接收以下参数来预测指定图像:

    • input_type(可选),指定需要解析的输入类型。可接受的值是”file”, “array” and “stream” 。
    • image_input,指定图像的 file path/numpy array/image file stream 。
    • result_count(可选),指定要预测出多少种可能的对象类(默认预测出5中可能的对象类),可接受的范围是 1到1000之间的整数。

    此函数返回2个数组,即prediction_resultsprediction_probabilities。其中prediction_results包含可能的对象类;prediction_probabilities包含每个对象类的概率。 prediction_results数组中每个对象类的位置按prediction_probabilities数组中概率降序排列。

    :param input_type:
    :param image_input:
    :param result_count:
    :return prediction_results,prediction_probabilities:

  • predictMultipleImages() 此函数用于通过接收以下参数来预测指定图像:

    • input_type,指定需要解析的输入类型。可接受的值是”file”, “array” and “stream” 。
    • sent_images_array,指定图像的 file path array / numpy array / image file stream 。
    • result_count_per_image(可选),指定每张图像要预测出多少种可能的对象类(默认每张图像预测出2种可能的对象类),可接受的范围是1到1000之间的整数。

    此函数返回一个字典数组,每个字典包含2个数组,即prediction_resultsprediction_probabilitiesprediction_results包含可能的对象类;prediction_probabilities包含每个对象类的概率。prediction_results数组中每个对象类的位置按prediction_probabilities数组中概率降序排列。

    :param input_type:
    :param sent_images_array:
    :param result_count_per_image:
    :return output_array:

ImageAI:对象检测

AI共享项目https://commons.specpal.science


ImageAI 提供了非常方便和强大的方法来对图像执行对象检测并从图像中提取每个对象。目前仅支持当前最先进的 RetinaNet 算法进行对象检测,后续版本会加入对其他算法的支持。在开始对象检测任务前,您必须通过以下链接下载 RetinaNet 模型文件:

- RetinaNet(文件大小= 145 MB)

下载 RetinaNet 模型文件后,应将模型文件复制到.py文件所在的项目文件夹中。然后创建一个python文件并为其命名; 例如 FirstObjectDetection.py 。然后将下面的代码写入python文件中:

FirstObjectDetection.py

from imageai.Detection import ObjectDetection
import os

execution_path = os.getcwd()

detector = ObjectDetection()
detector.setModelTypeAsRetinaNet()
detector.setModelPath( os.path.join(execution_path , "resnet50_coco_best_v2.0.1.h5"))
detector.loadModel()
detections = detector.detectObjectsFromImage(input_image=os.path.join(execution_path , "image2.jpg"), output_image_path=os.path.join(execution_path , "image2new.jpg"))

for eachObject in detections:
    print(eachObject["name"] + " : " + eachObject["percentage_probability"] )
    print("--------------------------------")

示例结果:

输入图像
https://github.com/OlafenwaMoses/ImageAI/raw/master/images/image2.jpg

输出图像
https://github.com/OlafenwaMoses/ImageAI/raw/master/images/image2new.jpg

person : 91.946941614151
--------------------------------
person : 73.61021637916565
--------------------------------
laptop : 90.24320840835571
--------------------------------
laptop : 73.6881673336029
--------------------------------
laptop : 95.16398310661316
--------------------------------
person : 87.10319399833679
--------------------------------

让我们对示例中的对象检测代码进行解读:

from imageai.Detection import ObjectDetection
import os

execution_path = os.getcwd()

在上面的代码中,我们在第一行导入ImageAI Object Detection类,在第二行导入os库,在第三行获得当前python文件的文件夹的路径。

detector = ObjectDetection()
detector.setModelTypeAsRetinaNet()
detector.setModelPath( os.path.join(execution_path , "resnet50_coco_best_v2.0.1.h5"))
detector.loadModel()

在上面的代码中,我们在第一行创建了ObjectDetection类的新实例,在第二行中将模型类型设置为RetinaNet,第三行将模型路径设置为我们下载的RetinaNet模型文件所在文件夹的路径,第四行载入模型。

detections = detector.detectObjectsFromImage(input_image=os.path.join(execution_path , "image2.jpg"), output_image_path=os.path.join(execution_path , "image2new.jpg"))

for eachObject in detections:
    print(eachObject["name"] + " : " + eachObject["percentage_probability"] )
print("--------------------------------")

在上面的代码中,我们调用了detectObjectsFromImage()函数并传入input_image参数和output_image_path参数来指定输入文件和输出文件的路径。然后该函数返回一个字典数组,每个字典包含图像中检测到的对象信息,字典中的对象信息有name(对象类名)和 percentage_probability(概率)

物体检测,提取和微调

在我们上面使用的示例中,它的工作原理是将检测到的对象返回到数组中,然后利用数组中的数据在每个对象上绘制矩形标记来生成新图像。在下面的示例中,我们将从输入图像中提取每个检测到的对象并保存到文件夹中。

在下面的示例代码中,它与先前的对象检测代码非常相似,我们将检测到的每个对象保存为单独的图像。

from imageai.Detection import ObjectDetection
import os

execution_path = os.getcwd()

detector = ObjectDetection()
detector.setModelTypeAsRetinaNet()
detector.setModelPath( os.path.join(execution_path , "resnet50_coco_best_v2.0.1.h5"))
detector.loadModel()

detections, objects_path = detector.detectObjectsFromImage(input_image=os.path.join(execution_path , "image3.jpg"), output_image_path=os.path.join(execution_path , "image3new.jpg"), extract_detected_objects=True)

for eachObject, eachObjectPath in zip(detections, objects_path):
    print(eachObject["name"] + " : " + eachObject["percentage_probability"] )
    print("Object's image saved in " + eachObjectPath)
    print("--------------------------------")

示例结果:

输入图像
https://github.com/OlafenwaMoses/ImageAI/raw/master/images/image3.jpg

输出图像
https://github.com/OlafenwaMoses/ImageAI/raw/master/images/image3new.jpg

https://github.com/OlafenwaMoses/ImageAI/raw/master/images/image3new.jpg-objects/person-1.jpg

https://github.com/OlafenwaMoses/ImageAI/raw/master/images/image3new.jpg-objects/person-2.jpg

https://github.com/OlafenwaMoses/ImageAI/raw/master/images/image3new.jpg-objects/person-3.jpg

https://github.com/OlafenwaMoses/ImageAI/raw/master/images/image3new.jpg-objects/person-4.jpg

https://github.com/OlafenwaMoses/ImageAI/raw/master/images/image3new.jpg-objects/motorcycle-5.jpg
摩托车

https://github.com/OlafenwaMoses/ImageAI/raw/master/images/image3new.jpg-objects/dog-6.jpg

https://github.com/OlafenwaMoses/ImageAI/raw/master/images/image3new.jpg-objects/car-7.jpg
汽车

https://github.com/OlafenwaMoses/ImageAI/raw/master/images/image3new.jpg-objects/person-8.jpg

让我们回顾一下执行对象检测并提取图像的代码部分:

detections, objects_path = detector.detectObjectsFromImage(input_image=os.path.join(execution_path , "image3.jpg"), output_image_path=os.path.join(execution_path , "image3new.jpg"), extract_detected_objects=True)

for eachObject, eachObjectPath in zip(detections, objects_path):
print(eachObject["name"] + " : " + eachObject["percentage_probability"] )
print("Object's image saved in " + eachObjectPath)
print("--------------------------------")

在上面的代码中,我们在调用detectObjectsFromImage()函数时新增了extract_detected_objects=True参数;此参数的作用是将每个检测到的对象提取并保存为当单独的图像。默认情况下该参数的值为false;设置为true后,该函数将创建一个名为output_image_path+"-objects"的目录,然后它将所有提取的图像以detected object name+"-number"命名保存到这个新目录中。

我们添加的这个新参数(extract_detected_objects=True)将会把检测到的对象提取并保存为单独的图像;这将使函数返回2个值,第一个是字典数组,每个字典对应一个检测到的对象信息(包含对象类名和概率),第二个是所有提取出对象的图像保存路径,并且它们按照对象在第一个数组中的顺序排列。

您需要知道的一个重要功能!

您是否还记得detectObjectsFromImage()函数返回的信息中包每个检测到的对象的百分比概率。该函数有一个重要的参数 minimum_percentage_probability,该参数用于设定预测概率的阈值,其默认值为50(范围在0-100之间)。如果保持默认值,这意味着只有当百分比概率大于等于50时,该函数才会返回检测到的对象。使用默认值可以确保检测结果的完整性,但是在检测过程中可能会跳过许多对象。因此,您可以通过将minimum_percentage_probability设置更小的值以检测更多的对象或更高的值来检测更少的对象。

自定义对象检测

对象检测模型(由RetinaNet支持)ImageAI 可以检测80种不同类型的对象。他们包括:

          person,   bicycle,   car,   motorcycle,   airplane,
          bus,   train,   truck,   boat,   traffic light,   fire hydrant,   stop_sign,
          parking meter,   bench,   bird,   cat,   dog,   horse,   sheep,   cow,   elephant,   bear,   zebra,
          giraffe,   backpack,   umbrella,   handbag,   tie,   suitcase,   frisbee,   skis,   snowboard,
          sports ball,   kite,   baseball bat,   baseball glove,   skateboard,   surfboard,   tennis racket,
          bottle,   wine glass,   cup,   fork,   knife,   spoon,   bowl,   banana,   apple,   sandwich,   orange,
          broccoli,   carrot,   hot dog,   pizza,   donot,   cake,   chair,   couch,   potted plant,   bed,
          dining table,   toilet,   tv,   laptop,   mouse,   remote,   keyboard,   cell phone,   microwave,
          oven,   toaster,   sink,   refrigerator,   book,   clock,   vase,   scissors,   teddy bear,   hair dryer,
          toothbrush.

有趣的是,ImageAI 允许您同时对上面的多个对象执行检测。这意味着您可以自定义要在图像中检测的对象。我们来看看下面的代码:

from imageai.Detection import ObjectDetection
import os

execution_path = os.getcwd()

detector = ObjectDetection()
detector.setModelTypeAsRetinaNet()
detector.setModelPath( os.path.join(execution_path , "resnet50_coco_best_v2.0.1.h5"))
detector.loadModel()

custom_objects = detector.CustomObjects(car=True, motorcycle=True)
detections = detector.detectCustomObjectsFromImage(custom_objects=custom_objects, input_image=os.path.join(execution_path , "image3.jpg"), output_image_path=os.path.join(execution_path , "image3custom.jpg"))

for eachObject in detections:
print(eachObject["name"] + " : " + eachObject["percentage_probability"] )
print("--------------------------------")

结果:
https://github.com/OlafenwaMoses/ImageAI/raw/master/images/image3custom.jpg

让我们看看使这成为可能的代码:

custom_objects = detector.CustomObjects(car=True, motorcycle=True)
detections = detector.detectCustomObjectsFromImage(custom_objects=custom_objects, input_image=os.path.join(execution_path , "image3.jpg"), output_image_path=os.path.join(execution_path , "image3custom.jpg"))

在上面的代码中,我们定义了一个新变量custom_objects = detector.CustomObjects(),其中我们将car和motorcycle属性设置为True,这是为了告诉模型只检测我们设置为True的对象。然后我们调用detector.detectCustomObjectsFromImage()函数并传入了我们定义的变量custom_objects来指定我们需要从图像中识别的对象。

检测速度

ImageAI 为对象检测任务添加了速度调节参数detection_speed,结合minimum_percentage_probability参数使用效果更佳,最多可使检测时间缩短60%且几乎不影响检测结果的精准度。可用的检测速度是 “normal”(default), “fast”, “faster” , “fastest” and “flash”。您只要在加载模型时说明您想要的速度模式,如下所示。

detector.loadModel(detection_speed="fast")

为了观察不同速度模式间的差异,请查看下面不同速度模式下(结合调整minimum_percentage_probability参数)检测相同图像所花费的时间(实验环境 OS:Windows 8, CPU:Intel Celeron N2820 2.13GHz):

检测速度=”normal”,最小百分比概率= 50(默认值),检测时间= 63.5秒
https://github.com/OlafenwaMoses/ImageAI/raw/master/images/5normal.jpg

检测速度=”fast”,最小百分比概率= 40(默认值),检测时间= 20.8秒
https://github.com/OlafenwaMoses/ImageAI/raw/master/images/5fast.jpg

检测速度=”faster”,最小百分比概率= 30(默认值),检测时间= 11.2秒
https://github.com/OlafenwaMoses/ImageAI/raw/master/images/5faster.jpg

检测速度=”fastest”,最小百分比概率= 30(默认值),检测时间= 7.6秒
https://github.com/OlafenwaMoses/ImageAI/raw/master/images/5fastest.jpg

检测速度=”flash”,最小百分比概率= 10(默认值),检测时间= 3.67秒
https://github.com/OlafenwaMoses/ImageAI/raw/master/images/5flash.jpg

您会注意到,在”flash”检测速度下,检测速度最快但准确度最低,那是因为图片中没有任何标志性的对象。在输入图像是代表性的(包含一个标志性图像)的时候,”flash”检测速度是最适合的。请查看下面的示例,以便了解何为标志性(代表性)图像下的检测:

检测速度=”flash”,最小百分比概率= 30(默认值),检测时间= 3.85秒
https://github.com/OlafenwaMoses/ImageAI/raw/master/images/6flash.jpg

图像输入和输出类型

旧版本 ImageAI 对象检测功能仅支持指定图像文件路径的图像输入方式。新版本 ImageAI 对象检测功能支持3种输入类型,即 file path to image file(默认),numpy array of imageimage file stream;以及2种输出类型,即 image file默认) 和 numpy array of image 这意味着您在进行对象检测时可以使用上述格式返回文件到系统中。

要使用 numpy arrayfile stream 类型进行图像输入时,您只需要在.detectObjectsFromImage().detectCustomObjectsFromImage()函数中声明input_type参数为arraystream即可,示例如下:

detections = detector.detectObjectsFromImage(input_type="array", input_image=image_array , output_image_path=os.path.join(execution_path , "image.jpg")) # For numpy array input type
detections = detector.detectObjectsFromImage(input_type="stream", input_image=image_stream , output_image_path=os.path.join(execution_path , "test2new.jpg")) # For file stream input type

要使用 numpy array 输出格式时,您只需要在.detectObjectsFromImage().detectCustomObjectsFromImage()函数中声明input_type参数为array即可,示例如下:

detected_image_array, detections = detector.detectObjectsFromImage(output_type="array", input_image="image.jpg" ) # For numpy array output type

文档

imageai.Detection.ObjectDetection class


在任何的Python程序中通过实例化ObjectDetection类并调用下面的函数即可进行对象检测:

  • setModelTypeAsRetinaNet() 如果您选择使用RetinaNet 模型文件来进行对象检测,你只需调用一次该函数。
  • setModelPath() 该函数用于设定模型文件的路径。模型文件必须与您设置的模型类型相对应。
  • loadModel() 该函数用于载入模型。该函数接收一个prediction_speed参数。该参数用于指定对象检测的速度模式,当速度模式设置为’fastest’时预测时间可缩短60%左右,具体取决于图像的质量。
    • detection_speed(可选); 可接受的值是”normal”, “fast”, “faster” and “fastest”
  • detectObjectsFromImage() 此函数用于通过接收以下参数来进行对象检测:
    • input_image 该参数用于指定输入图像的 file path/numpy array/image file stream 。
    • output_image_path 如果output_type=file,该参数用于指定输出(包含检测框和标签)图像的文件路径,。
    • input_type(可选),指定需要解析的输入类型。可接受的值是”file”, “array” and “stream” 。
    • output_type(可选),指定需要输出的类型。可接受的值是”file”, “array”
    • extract_detected_objects(可选,默认为 false),用于将每个检测到的对象单独保存为图像并返回每个图像路径的数组。
    • minimum_percentage_probability(可选,默认为50),用于设定预测概率的阈值,只有当百分比概率大于等于该值时才会返回检测到的对象。

此函数返回的值取决于所设置的参数。可返回的值如下所示

  • 如果extract_detected_objects = False或其默认值和output_type =file或其 默认值,则必须将output_image_path解析为输出检测结果的路径,该函数将返回:
    1. 一个字典数组,每个字典对应于在图像中检测到的对象。每个字典包含以下属性:
      • name
      • percentage_probability
  • 如果extract_detected_objects = False或其默认值并且output_type =array,则该函数将返回:
    1. 检测到的图像的numpy数组
    2. 字典数组,每个字典对应于图像中检测到的对象。每个字典都包含以下属性:
      • name
      • percentage_probability
  • 如果extract_detected_objects = Trueoutput_type =file或 默认值,您必须将output_image_path解析为输出检测结果的路径,该函数将返回:
    1. 一个字典数组,每个字典对应于图像中检测到的对象。每个字典包含以下属性:
      • name
      • percentage_probability
    2. 一个字符串数组,包含了从图像中提取的每个对象的图像所保存的路径
  • 如果extract_detected_objects = Trueoutput_type =array,则该函数将返回:
    1. 检测到的图像的numpy数组
    2. 一个字典数组,每个字典对应于图像中检测到的对象。每个字典包含以下属性:
      • name
      • percentage_probability
    3. 图像中检测到的每个对象的numpy数组

:param input_image:
:param output_image_path:
:param input_type:
:param output_type:
:param extract_detected_objects:
:param minimum_percentage_probability:
:return output_objects_array:
:return detected_copy:
:return detected_detected_objects_image_array:

  • CustomObjecs() 调用此函数来选择需要在图像中进行检测的对象。这些对象在函数变量中预先创建并定义为 False。您可以将任何预创建的对象设置为true,最终此函数将返回一个字典被detectCustomObjectsFromImage()函数的一个参数custom_objects所使用。
  • detectCustomObjectsFromImage 此函数通过接收以下参数在图像中对指定对象进行检测:
    • custom_objects,一个CustomObject类的实例,用于指定在图像中需要检测的对象
    • input_image,可以是图像文件路径/图像numpy数组/图像文件流
    • output_image_path,如果output_type=file,则该参数指定为输出包含检测框和标签的图像文件路径
    • input_type(可选),指定图像输入的类型,可选值为 “file”, “array”, “stream”
    • output_type(可选), 指定图像输入的类型,可选值为 “file”, “array”
    • extract_detected_objects(可选,默认为False),该参数用于将每个检测到的对象单独保存为图像,并返回包含图像路径的数组。
    • minimum_percentage_probability(可选,默认为50),用于设定预测概率的阈值,只有当百分比概率大于等于该值时才会返回检测到的对象。

此函数返回的值取决于所设置的参数。可返回的可能值如下所示:

  • 如果extract_detected_objects=False或其默认值并且output_type=file或默认值,则必须将output_image_path解析为输出检测结果的路径,该函数将返回:
    1. 一个字典数组,每个字典对应于图像中检测到的对象。每个字典包含以下属性:
      • name
      • percentage_probability
  • 如果extract_detected_objects=False或其默认值并且output_type=array,则该函数将返回:
    1. 检测到的图像的numpy数组
    2. 一个字典数组,每个字典对应于图像中检测到的对象。每个字典包含以下属性:
      • name
      • percentage_probability
  • 如果extract_detected_objects=Trueoutput_type=file或 默认值,则必须将output_image_path解析为输出检测结果的路径,该函数将返回:
    1. 一个字典数组,每个字典对应于图像中检测到的对象。每个字典都包含以下属性:
      • name
      • percentage_probability
    2. 一个字符串数组,包含了从图像中提取的每个对象的图像所保存的路径
  • 如果extract_detected_objects=Trueoutput_type=array,则该函数将返回:
    1. 检测到的图像的numpy数组
    2. 字典数组,每个字典对应于图像中检测到的对象。每个字典都包含以下属性:
      • name
      • percentage_probability
    3. 图像中检测到的每个对象的numpy数组

:param input_image:
:param output_image_path:
:param input_type:
:param output_type:
:param extract_detected_objects:
:param minimum_percentage_probability:
:return output_objects_array:
:return detected_copy:
:return detected_detected_objects_image_array:

ImageAI:视频对象检测和跟踪(预览版)

AI共享项目 https://commons.specpal.science


ImageAI 提供方便,灵活和强大的方法来对视频进行对象检测和跟踪。目前仅支持当前最先进的 RetinaNet 算法进行对象检测和跟踪,后续版本会加入对其他算法的支持。虽然这只是预览版本,但提供了很多令人难以置信的选项。在开始视频对象检测和跟踪任务前,您必须通过以下链接下载 RetinaNet 模型文件:

- RetinaNet (文件大小=145MB)

由于视频对象检测是非常消耗硬件资源的任务,所以我们建议您使用安装了 NVIDIA GPU 和 GPU 版 Tensorflow 的计算机来完成此实验。使用CPU进行视频对象检测将比使用 NVIDIA GPU 驱动的计算机慢。您也可以使用 Google Colab 进行此实验,因为它具有可用的 NVIDIA K80 GPU。

下载 RetinaNet 模型文件后,应将模型文件复制到.py文件所在的项目文件夹中。然后创建一个python文件并为其命名; 例如 FirstVideoObjectDetection.py 。然后将下面的代码写入python文件中:

FirstVideoObjectDetection.py

from imageai.Detection import VideoObjectDetection
import os

execution_path = os.getcwd()

detector = VideoObjectDetection()
detector.setModelTypeAsRetinaNet()
detector.setModelPath( os.path.join(execution_path, "resnet50_coco_best_v2.0.1.h5"))
detector.loadModel()

video_path = detector.detectObjectsFromVideo(input_file_path=os.path.join(execution_path, "traffic.mp4"), output_file_path=os.path.join(execution_path, "traffic_detected"), frames_per_second=20, log_progress=True)
print(video_path)

输入视频(时长1分钟24秒)
https://github.com/kangvcar/ImageAI/raw/master/images/video--1.jpg

输出视频
https://github.com/kangvcar/ImageAI/raw/master/images/video-2.jpg
C:\Users\User\PycharmProjects\ImageAITest\traffic_detected.avi

让我们对示例中的视频对象检测代码进行解读:

from imageai.Detection import VideoObjectDetection
import os

execution_path = os.getcwd()

在上面的代码中,我们在第一行导入ImageAI video object detection类,在第二行导入os库,在第三行获得当前python文件的文件夹的路径。

detector = VideoObjectDetection()
detector.setModelTypeAsRetinaNet()
detector.setModelPath( os.path.join(execution_path , "resnet50_coco_best_v2.0.1.h5"))
detector.loadModel()

在上面的代码中,我们在第一行创建了VideoObjectDetection类的新实例,在第二行中将模型类型设置为RetinaNet,第三行将模型路径设置为我们下载的RetinaNet模型文件所在文件夹的路径,第四行载入模型。

video_path = detector.detectObjectsFromVideo(input_file_path=os.path.join(execution_path, "traffic.mp4"),
output_file_path=os.path.join(execution_path, "traffic_detected")
, frames_per_second=20, log_progress=True)
print(video_path)

在上面的代码中,我们调用了detectObjectsFromVideo()函数并传入了4个参数,其中input_file_path参数用于指定输入视频文件的路径;output_file_path参数用于指定输出视频文件的路径(没有扩展名,默认保存.avi格式的视频);frames_per_second参数用于指定输出视频每秒帧数(fps),log_progress参数用于指定是否在控制台中输出检测进度。最后,该函数返回检测后所保存的视频路径,该视频包含在每个对象上绘制矩形标记和百分比概率。

自定义视频对象检测

ImageAI 视频对象检测模型(由RetinaNet支持),并且可以检测 80 种不同类型的对象。他们包括:

          person,   bicycle,   car,   motorcycle,   airplane,
          bus,   train,   truck,   boat,   traffic light,   fire hydrant,   stop_sign,
          parking meter,   bench,   bird,   cat,   dog,   horse,   sheep,   cow,   elephant,   bear,   zebra,
          giraffe,   backpack,   umbrella,   handbag,   tie,   suitcase,   frisbee,   skis,   snowboard,
          sports ball,   kite,   baseball bat,   baseball glove,   skateboard,   surfboard,   tennis racket,
          bottle,   wine glass,   cup,   fork,   knife,   spoon,   bowl,   banana,   apple,   sandwich,   orange,
          broccoli,   carrot,   hot dog,   pizza,   donot,   cake,   chair,   couch,   potted plant,   bed,
          dining table,   toilet,   tv,   laptop,   mouse,   remote,   keyboard,   cell phone,   microwave,
          oven,   toaster,   sink,   refrigerator,   book,   clock,   vase,   scissors,   teddy bear,   hair dryer,
          toothbrush.

有趣的是,ImageAI 允许您同时对上面的多个对象执行检测。这意味着您可以自定义要在图像中检测的对象。我们来看看下面的代码:

from imageai.Detection import VideoObjectDetection
import os

execution_path = os.getcwd()

detector = VideoObjectDetection()
detector.setModelTypeAsRetinaNet()
detector.setModelPath( os.path.join(execution_path , "resnet50_coco_best_v2.0.1.h5"))
detector.loadModel()

custom_objects = detector.CustomObjects(person=True, bicycle=True, motorcycle=True)

video_path = detector.detectCustomObjectsFromVideo(custom_objects=custom_objects, input_file_path=os.path.join(execution_path, "traffic.mp4"), output_file_path=os.path.join(execution_path, "traffic_custom_detected"), frames_per_second=20, log_progress=True)
print(video_path)

让我们看看使这成为可能的代码:

custom_objects = detector.CustomObjects(person=True, bicycle=True, motorcycle=True)

video_path = detector.detectCustomObjectsFromVideo(custom_objects=custom_objects, input_file_path=os.path.join(execution_path, "traffic.mp4"), output_file_path=os.path.join(execution_path, "traffic_custom_detected"), frames_per_second=20, log_progress=True)

在上面的代码中,我们定义了一个新变量custom_objects = detector.CustomObjects(),其中我们将person,car和motorcycle属性设置为True,这是为了告诉模型只检测我们设置为True的对象。然后我们调用detector.detectCustomObjectsFromVideo()函数并传入了我们定义的变量custom_objects来指定我们需要从图像中识别的对象。

输出视频
https://github.com/kangvcar/ImageAI/raw/master/images/video-3.jpg
C:\Users\User\PycharmProjects\ImageAITest\traffic_custom_detected.avi

视频检测速度

ImageAI 为对象检测任务添加了速度调节参数detection_speed,结合minimum_percentage_probability参数使用效果更佳,最多可使检测时间缩短80%且几乎不影响检测结果的精准度。可用的检测速度是 “normal”(default), “fast”, “faster” , “fastest” and “flash”。您只要在加载模型时说明您想要的速度模式,如下所示。

detector.loadModel(detection_speed="fast")

为了观察不同速度模式间的差异,请查看下面不同速度模式下(结合调整minimum_percentage_probability参数)检测相同图像所花费的时间(在NVIDIA K80 GPU)。下面提供每个视频的下载链接:

视频长度= 1分钟24秒,检测速度=”normal”,最小百分比概率= 50(默认值),检测时间= 29分钟3秒
https://github.com/kangvcar/ImageAI/raw/master/images/video-4.jpg

视频长度= 1分钟24秒,检测速度=”fast”,最小百分比概率= 40,检测时间= 11分钟6秒
>>>下载以速度”fast”检测的视频

视频长度= 1分钟24秒,检测速度=”faster”,最小百分比概率= 30,检测时间= 7分47秒
>>>下载以速度”faster”检测的视频

视频长度= 1分钟24秒,检测速度=”fastest”,最小百分比概率= 20,检测时间= 6分钟20秒
>>>下载以速度”fastest”检测的视频

视频长度= 1分钟24秒,检测速度=”flash”,最小百分比概率= 10,检测时间= 3分55
>>>下载以速度”flash”检测的视频

如果您使用功能更强大的NVIDIA GPU,检测时间将更加短。

帧检测间隔

上述视频对象检测任务检测了视频的每一帧。 ImageAI 为视频对象检测任务添加了帧检测间隔参数frame_detection_interval以加快视频检测过程。在调用.detectObjectsFromVideo().detectCustomObjectsFromVideo()函数时,通过指定参数frame_detection_interval的值来设置每隔多少帧检测一次对象,该参数的值可设置为5-20之间。 如果可检测的对象较模糊且对象移动速度较慢时此功能非常有用。我们通过设置参数frame_detection_interval=5对上面示例中的视频进行视频对象检测(实验环境:NVIDIA K80 GPU)。点击链接下载对应视频:

视频长度= 1分钟24秒,检测速度=”normal” ,最小百分比概率= 50(默认值),帧检测间隔= 5,检测时间= 15分49秒
>>>以速度”normal” 和间隔= 5检测对象的视频

视频长度= 1分钟24秒,检测速度=”fast”,最小百分比概率= 40,帧检测间隔= 5,检测时间= 5分钟6秒
>>>以速度”fast” 和间隔= 5检测对象的视频

视频长度= 1分钟24秒,检测速度=”faster”,最小百分比概率= 30,帧检测间隔= 5,检测时间= 3分钟18秒
>>>以速度”faster” 和间隔= 5检测对象的视频

视频长度= 1分钟24秒,检测速度=”fastest”,最小百分比概率= 20,帧检测间隔= 5,检测时间= 2分钟18秒
https://github.com/kangvcar/ImageAI/raw/master/images/video-3.jpg

视频长度= 1分钟24秒,检测速度=”flash”,最小百分比概率= 10,帧检测间隔= 5,检测时间= 1分27秒
>>>以速度”flash” 和间隔= 5检测对象的视频

文档

imageai.Detection.VideoObjectDetection class


在任何的Python程序中通过实例化VideoObjectDetection类并调用下面的函数即可进行视频对象检测:

  • setModelTypeAsRetinaNet() 如果您选择使用RetinaNet 模型文件来进行对象检测,你只需调用一次该函数。
  • setModelPath() 该函数用于设定模型文件的路径。模型文件必须与您设置的模型类型相对应。
  • loadModel() 该函数用于载入模型。该函数接收一个prediction_speed参数。该参数用于指定对象检测的速度模式,当速度模式设置为’fastest’时预测时间可缩短60%左右,具体取决于图像的质量。
    • detection_speed(可选); 可接受的值是”normal”, “fast”, “faster” and “fastest”
  • detectObjectsFromVideo() 此函数用于通过接收以下参数来进行视频对象检测:
    • input_file_path,该参数用于指定输入视频的文件路径
    • output_file_path,该参数用于指定输出视频的文件路径
    • frames_per_second 该参数用于指定输出视频中的每秒帧数fps
    • frame_detection_interval(可选,默认为1)),该参数用于指定视频检测的帧间隔,即间隔多少帧检测一次。
    • minimum_percentage_probability(可选,默认为50),用于设定预测概率的阈值,只有当百分比概率大于等于该值时才会返回检测到的对象。
    • log_progress(可选),该参数用于指定是否将检测进度输出到控制台

:param input_file_path:
:param output_file_path:
:param frames_per_second:
:param frame_detection_interval:
:param minimum_percentage_probability:
:param log_progress:
:return output_video_filepath:

  • CustomObjecs() 调用此函数来选择需要在视频中进行检测的对象。这些对象在函数变量中预先创建并定义为 False。您可以将任何预创建的对象设置为true,最终此函数将返回一个字典被detectCustomObjectsFromVideo()函数的一个参数custom_objects所使用。
  • detectCustomObjectsFromVideo() 此函数通过接收以下参数在视频中对指定对象进行检测:
    • custom_objects,一个CustomObject类的实例,用于指定在视频中需要检测的对象
    • input_file_path 该参数用于指定输入视频的文件路径
    • output_file_path 该参数用于指定输出视频的文件路径
    • frames_per_second 该参数用于指定输出视频中的每秒帧数fps
    • frame_detection_interval(可选,默认为1)),该参数用于指定视频检测的帧间隔,即间隔多少帧检测一次。
    • minimum_percentage_probability(可选,默认为50),用于设定预测概率的阈值,只有当百分比概率大于等于该值时才会返回检测到的对象。
    • log_progress(可选),该参数用于指定是否将检测进度输出到控制台

:param custom_objects:
:param input_file_path:
:param output_file_path:
:param frames_per_second:
:param frame_detection_interval:
:param minimum_percentage_probability:
:param log_progress:
:return output_video_filepath:

ImageAI:自定义预测模型训练


ImageAI 提供4种不同的算法及模型来执行自定义预测模型训练,通过以下简单几个步骤即可实现自定义预测模型训练。提供用于自定义预测模型训练的4种算法包括 SqueezeNetResNetInceptionV3DenseNet。您可以将其中一种算法加载到imageai.Prediction.Custom.CustomImagePrediction类中,这允许您在任何对象/人的图像集上训练您自己的模型。训练过程生成一个 JSON 文件,用于映射图像数据集和许多模型中的对象类型。然后,您就可以使用生成的 JSON 文进行高精度自定义图像预测。

由于视频模型训练是非常消耗硬件资源的任务,所以我们建议您使用安装了 NVIDIA GPU 和 GPU 版 Tensorflow 的计算机来完成此实验。因为在 CPU 上执行模型培训将需要数小时或数天,但使用安装了 NVIDIA GPU 的计算机可能只需几个小时。您也可以使用 Google Colab 进行此实验,因为它具有可用的 NVIDIA K80 GPU。

要进行自定义预测模型训​​练,您需要准备要用于训练的图像。您需要按如下方式提供图像:

  1. 创建一个数据集文件夹并命名(如 pets)
  2. 在数据集文件中创建一个名称为 train 的子文件夹
  3. 在数据集文件中创建一个名称为 test 的子文件夹
  4. train 文件夹中,为每个你要训练的对象创建文件夹并命名(如 dog,cat,squirrel,snake)
  5. test 文件夹中,为每个你要训练的对象创建文件夹并命名(如 dog,cat,squirrel,snake)
  6. 把每个对象的图像放在 train 文件夹下对应名称的子文件夹,这些图像是用于训练模型的图像,为了训练出精准度较高的模型,我建议每个对象收集大约500张以上图像。
  7. 把每个对象用于测试的图像放在 test 文件夹下对应名称的子文件夹,为了训练出精准度较高的模型,我建议每个对象用于测试的图像在100~200张。用于训练模型时在这些图像中识别出要训练的对象。
  8. 按照上述步骤操作完成后,图像数据集文件夹的结构应如下所示:
pets >
train >> dog >>> dog_train_images
      >> cat >>> cat_train_images
      >> squirrel >>> squirrel_train_images
      >> snake >> snake_train_images
test  >> dog >>> dog_test_images
      >> cat >>> cat_test_images
      >> squirrel >>> squirrel_test_images
      >> snake >>> snake_test_images

然后您的训练代码如下:

from imageai.Prediction.Custom import ModelTraining
model_trainer = ModelTraining()
model_trainer.setModelTypeAsResNet()
model_trainer.setDataDirectory("pets")
model_trainer.trainModel(num_objects=4, num_experiments=100, enhance_data=True, batch_size=32, show_network_summary=True)

没错! 只需 5 行代码,就可以在您的数据集上使用所支持的4种深度学习算法来训练自定义模型。现在让我们来看看上面的代码是如何工作的:

from imageai.Prediction.Custom import ModelTraining

model_trainer = ModelTraining()
model_trainer.setModelTypeAsResNet()
model_trainer.setDataDirectory("pets")

在上面的代码中,第一行导入 ImageAIModelTraining类,第二行创建了ModelTraining类的新实例,第三行将模型类型设置为ResNet,第四行设置我们想要训练的数据集的路径。

model_trainer.trainModel(num_objects=4, num_experiments=100, enhance_data=True, batch_size=32, show_network_summary=True)

在上面的代码中,我们开始了模型训练,参数如下:

  • num_objects:该参数用于指定图像数据集中对象的数量
  • num_experiments:该参数用于指定将对图像训练的次数,也称为epochs
  • enhance_data(可选):该参数用于指定是否生成训练图像的副本以获得更好的性能。
  • batch_size:该参数用于指定批次数量。由于内存限制,需要分批训练,直到所有批次训练集都完成为止。
  • show_network_summary:该参数用于指定是否在控制台中显示训练的过程。

当您开始训练时,您应该在控制台中看到类似的内容:

____________________________________________________________________________________________________
Layer (type)                     Output Shape          Param #     Connected to
====================================================================================================
input_2 (InputLayer)             (None, 224, 224, 3)   0
____________________________________________________________________________________________________
conv2d_1 (Conv2D)                (None, 112, 112, 64)  9472        input_2[0][0]
____________________________________________________________________________________________________
batch_normalization_1 (BatchNorm (None, 112, 112, 64)  256         conv2d_1[0][0]
____________________________________________________________________________________________________
activation_1 (Activation)        (None, 112, 112, 64)  0           batch_normalization_1[0][0]
____________________________________________________________________________________________________
max_pooling2d_1 (MaxPooling2D)   (None, 55, 55, 64)    0           activation_1[0][0]
____________________________________________________________________________________________________
conv2d_3 (Conv2D)                (None, 55, 55, 64)    4160        max_pooling2d_1[0][0]
____________________________________________________________________________________________________
batch_normalization_3 (BatchNorm (None, 55, 55, 64)    256         conv2d_3[0][0]
____________________________________________________________________________________________________
activation_2 (Activation)        (None, 55, 55, 64)    0           batch_normalization_3[0][0]
____________________________________________________________________________________________________
conv2d_4 (Conv2D)                (None, 55, 55, 64)    36928       activation_2[0][0]
____________________________________________________________________________________________________
batch_normalization_4 (BatchNorm (None, 55, 55, 64)    256         conv2d_4[0][0]
____________________________________________________________________________________________________
activation_3 (Activation)        (None, 55, 55, 64)    0           batch_normalization_4[0][0]
____________________________________________________________________________________________________
conv2d_5 (Conv2D)                (None, 55, 55, 256)   16640       activation_3[0][0]
____________________________________________________________________________________________________
conv2d_2 (Conv2D)                (None, 55, 55, 256)   16640       max_pooling2d_1[0][0]
____________________________________________________________________________________________________
batch_normalization_5 (BatchNorm (None, 55, 55, 256)   1024        conv2d_5[0][0]
____________________________________________________________________________________________________
batch_normalization_2 (BatchNorm (None, 55, 55, 256)   1024        conv2d_2[0][0]
____________________________________________________________________________________________________
add_1 (Add)                      (None, 55, 55, 256)   0           batch_normalization_5[0][0]
                                                                   batch_normalization_2[0][0]
____________________________________________________________________________________________________
activation_4 (Activation)        (None, 55, 55, 256)   0           add_1[0][0]
____________________________________________________________________________________________________
conv2d_6 (Conv2D)                (None, 55, 55, 64)    16448       activation_4[0][0]
____________________________________________________________________________________________________
batch_normalization_6 (BatchNorm (None, 55, 55, 64)    256         conv2d_6[0][0]
____________________________________________________________________________________________________
activation_5 (Activation)        (None, 55, 55, 64)    0           batch_normalization_6[0][0]
____________________________________________________________________________________________________
conv2d_7 (Conv2D)                (None, 55, 55, 64)    36928       activation_5[0][0]
____________________________________________________________________________________________________
batch_normalization_7 (BatchNorm (None, 55, 55, 64)    256         conv2d_7[0][0]
____________________________________________________________________________________________________
activation_6 (Activation)        (None, 55, 55, 64)    0           batch_normalization_7[0][0]
____________________________________________________________________________________________________
conv2d_8 (Conv2D)                (None, 55, 55, 256)   16640       activation_6[0][0]
____________________________________________________________________________________________________
batch_normalization_8 (BatchNorm (None, 55, 55, 256)   1024        conv2d_8[0][0]
____________________________________________________________________________________________________
add_2 (Add)                      (None, 55, 55, 256)   0           batch_normalization_8[0][0]
                                                                   activation_4[0][0]
____________________________________________________________________________________________________
activation_7 (Activation)        (None, 55, 55, 256)   0           add_2[0][0]
____________________________________________________________________________________________________
conv2d_9 (Conv2D)                (None, 55, 55, 64)    16448       activation_7[0][0]
____________________________________________________________________________________________________
batch_normalization_9 (BatchNorm (None, 55, 55, 64)    256         conv2d_9[0][0]
____________________________________________________________________________________________________
activation_8 (Activation)        (None, 55, 55, 64)    0           batch_normalization_9[0][0]
____________________________________________________________________________________________________
conv2d_10 (Conv2D)               (None, 55, 55, 64)    36928       activation_8[0][0]
____________________________________________________________________________________________________
batch_normalization_10 (BatchNor (None, 55, 55, 64)    256         conv2d_10[0][0]
____________________________________________________________________________________________________
activation_9 (Activation)        (None, 55, 55, 64)    0           batch_normalization_10[0][0]
____________________________________________________________________________________________________
conv2d_11 (Conv2D)               (None, 55, 55, 256)   16640       activation_9[0][0]
____________________________________________________________________________________________________
batch_normalization_11 (BatchNor (None, 55, 55, 256)   1024        conv2d_11[0][0]
____________________________________________________________________________________________________
add_3 (Add)                      (None, 55, 55, 256)   0           batch_normalization_11[0][0]
                                                                   activation_7[0][0]
____________________________________________________________________________________________________
activation_10 (Activation)       (None, 55, 55, 256)   0           add_3[0][0]
____________________________________________________________________________________________________
conv2d_13 (Conv2D)               (None, 28, 28, 128)   32896       activation_10[0][0]
____________________________________________________________________________________________________
batch_normalization_13 (BatchNor (None, 28, 28, 128)   512         conv2d_13[0][0]
____________________________________________________________________________________________________
activation_11 (Activation)       (None, 28, 28, 128)   0           batch_normalization_13[0][0]
____________________________________________________________________________________________________
conv2d_14 (Conv2D)               (None, 28, 28, 128)   147584      activation_11[0][0]
____________________________________________________________________________________________________
batch_normalization_14 (BatchNor (None, 28, 28, 128)   512         conv2d_14[0][0]
____________________________________________________________________________________________________
activation_12 (Activation)       (None, 28, 28, 128)   0           batch_normalization_14[0][0]
____________________________________________________________________________________________________
conv2d_15 (Conv2D)               (None, 28, 28, 512)   66048       activation_12[0][0]
____________________________________________________________________________________________________
conv2d_12 (Conv2D)               (None, 28, 28, 512)   131584      activation_10[0][0]
____________________________________________________________________________________________________
batch_normalization_15 (BatchNor (None, 28, 28, 512)   2048        conv2d_15[0][0]
____________________________________________________________________________________________________
batch_normalization_12 (BatchNor (None, 28, 28, 512)   2048        conv2d_12[0][0]
____________________________________________________________________________________________________
add_4 (Add)                      (None, 28, 28, 512)   0           batch_normalization_15[0][0]
                                                                   batch_normalization_12[0][0]
____________________________________________________________________________________________________
activation_13 (Activation)       (None, 28, 28, 512)   0           add_4[0][0]
____________________________________________________________________________________________________
conv2d_16 (Conv2D)               (None, 28, 28, 128)   65664       activation_13[0][0]
____________________________________________________________________________________________________
batch_normalization_16 (BatchNor (None, 28, 28, 128)   512         conv2d_16[0][0]
____________________________________________________________________________________________________
activation_14 (Activation)       (None, 28, 28, 128)   0           batch_normalization_16[0][0]
____________________________________________________________________________________________________
conv2d_17 (Conv2D)               (None, 28, 28, 128)   147584      activation_14[0][0]
____________________________________________________________________________________________________
batch_normalization_17 (BatchNor (None, 28, 28, 128)   512         conv2d_17[0][0]
____________________________________________________________________________________________________
activation_15 (Activation)       (None, 28, 28, 128)   0           batch_normalization_17[0][0]
____________________________________________________________________________________________________
conv2d_18 (Conv2D)               (None, 28, 28, 512)   66048       activation_15[0][0]
____________________________________________________________________________________________________
batch_normalization_18 (BatchNor (None, 28, 28, 512)   2048        conv2d_18[0][0]
____________________________________________________________________________________________________
add_5 (Add)                      (None, 28, 28, 512)   0           batch_normalization_18[0][0]
                                                                   activation_13[0][0]
____________________________________________________________________________________________________
activation_16 (Activation)       (None, 28, 28, 512)   0           add_5[0][0]
____________________________________________________________________________________________________
conv2d_19 (Conv2D)               (None, 28, 28, 128)   65664       activation_16[0][0]
____________________________________________________________________________________________________
batch_normalization_19 (BatchNor (None, 28, 28, 128)   512         conv2d_19[0][0]
____________________________________________________________________________________________________
activation_17 (Activation)       (None, 28, 28, 128)   0           batch_normalization_19[0][0]
____________________________________________________________________________________________________
conv2d_20 (Conv2D)               (None, 28, 28, 128)   147584      activation_17[0][0]
____________________________________________________________________________________________________
batch_normalization_20 (BatchNor (None, 28, 28, 128)   512         conv2d_20[0][0]
____________________________________________________________________________________________________
activation_18 (Activation)       (None, 28, 28, 128)   0           batch_normalization_20[0][0]
____________________________________________________________________________________________________
conv2d_21 (Conv2D)               (None, 28, 28, 512)   66048       activation_18[0][0]
____________________________________________________________________________________________________
batch_normalization_21 (BatchNor (None, 28, 28, 512)   2048        conv2d_21[0][0]
____________________________________________________________________________________________________
add_6 (Add)                      (None, 28, 28, 512)   0           batch_normalization_21[0][0]
                                                                   activation_16[0][0]
____________________________________________________________________________________________________
activation_19 (Activation)       (None, 28, 28, 512)   0           add_6[0][0]
____________________________________________________________________________________________________
conv2d_22 (Conv2D)               (None, 28, 28, 128)   65664       activation_19[0][0]
____________________________________________________________________________________________________
batch_normalization_22 (BatchNor (None, 28, 28, 128)   512         conv2d_22[0][0]
____________________________________________________________________________________________________
activation_20 (Activation)       (None, 28, 28, 128)   0           batch_normalization_22[0][0]
____________________________________________________________________________________________________
conv2d_23 (Conv2D)               (None, 28, 28, 128)   147584      activation_20[0][0]
____________________________________________________________________________________________________
batch_normalization_23 (BatchNor (None, 28, 28, 128)   512         conv2d_23[0][0]
____________________________________________________________________________________________________
activation_21 (Activation)       (None, 28, 28, 128)   0           batch_normalization_23[0][0]
____________________________________________________________________________________________________
conv2d_24 (Conv2D)               (None, 28, 28, 512)   66048       activation_21[0][0]
____________________________________________________________________________________________________
batch_normalization_24 (BatchNor (None, 28, 28, 512)   2048        conv2d_24[0][0]
____________________________________________________________________________________________________
add_7 (Add)                      (None, 28, 28, 512)   0           batch_normalization_24[0][0]
                                                                   activation_19[0][0]
____________________________________________________________________________________________________
activation_22 (Activation)       (None, 28, 28, 512)   0           add_7[0][0]
____________________________________________________________________________________________________
conv2d_26 (Conv2D)               (None, 14, 14, 256)   131328      activation_22[0][0]
____________________________________________________________________________________________________
batch_normalization_26 (BatchNor (None, 14, 14, 256)   1024        conv2d_26[0][0]
____________________________________________________________________________________________________
activation_23 (Activation)       (None, 14, 14, 256)   0           batch_normalization_26[0][0]
____________________________________________________________________________________________________
conv2d_27 (Conv2D)               (None, 14, 14, 256)   590080      activation_23[0][0]
____________________________________________________________________________________________________
batch_normalization_27 (BatchNor (None, 14, 14, 256)   1024        conv2d_27[0][0]
____________________________________________________________________________________________________
activation_24 (Activation)       (None, 14, 14, 256)   0           batch_normalization_27[0][0]
____________________________________________________________________________________________________
conv2d_28 (Conv2D)               (None, 14, 14, 1024)  263168      activation_24[0][0]
____________________________________________________________________________________________________
conv2d_25 (Conv2D)               (None, 14, 14, 1024)  525312      activation_22[0][0]
____________________________________________________________________________________________________
batch_normalization_28 (BatchNor (None, 14, 14, 1024)  4096        conv2d_28[0][0]
____________________________________________________________________________________________________
batch_normalization_25 (BatchNor (None, 14, 14, 1024)  4096        conv2d_25[0][0]
____________________________________________________________________________________________________
add_8 (Add)                      (None, 14, 14, 1024)  0           batch_normalization_28[0][0]
                                                                   batch_normalization_25[0][0]
____________________________________________________________________________________________________
activation_25 (Activation)       (None, 14, 14, 1024)  0           add_8[0][0]
____________________________________________________________________________________________________
conv2d_29 (Conv2D)               (None, 14, 14, 256)   262400      activation_25[0][0]
____________________________________________________________________________________________________
batch_normalization_29 (BatchNor (None, 14, 14, 256)   1024        conv2d_29[0][0]
____________________________________________________________________________________________________
activation_26 (Activation)       (None, 14, 14, 256)   0           batch_normalization_29[0][0]
____________________________________________________________________________________________________
conv2d_30 (Conv2D)               (None, 14, 14, 256)   590080      activation_26[0][0]
____________________________________________________________________________________________________
batch_normalization_30 (BatchNor (None, 14, 14, 256)   1024        conv2d_30[0][0]
____________________________________________________________________________________________________
activation_27 (Activation)       (None, 14, 14, 256)   0           batch_normalization_30[0][0]
____________________________________________________________________________________________________
conv2d_31 (Conv2D)               (None, 14, 14, 1024)  263168      activation_27[0][0]
____________________________________________________________________________________________________
batch_normalization_31 (BatchNor (None, 14, 14, 1024)  4096        conv2d_31[0][0]
____________________________________________________________________________________________________
add_9 (Add)                      (None, 14, 14, 1024)  0           batch_normalization_31[0][0]
                                                                   activation_25[0][0]
____________________________________________________________________________________________________
activation_28 (Activation)       (None, 14, 14, 1024)  0           add_9[0][0]
____________________________________________________________________________________________________
conv2d_32 (Conv2D)               (None, 14, 14, 256)   262400      activation_28[0][0]
____________________________________________________________________________________________________
batch_normalization_32 (BatchNor (None, 14, 14, 256)   1024        conv2d_32[0][0]
____________________________________________________________________________________________________
activation_29 (Activation)       (None, 14, 14, 256)   0           batch_normalization_32[0][0]
____________________________________________________________________________________________________
conv2d_33 (Conv2D)               (None, 14, 14, 256)   590080      activation_29[0][0]
____________________________________________________________________________________________________
batch_normalization_33 (BatchNor (None, 14, 14, 256)   1024        conv2d_33[0][0]
____________________________________________________________________________________________________
activation_30 (Activation)       (None, 14, 14, 256)   0           batch_normalization_33[0][0]
____________________________________________________________________________________________________
conv2d_34 (Conv2D)               (None, 14, 14, 1024)  263168      activation_30[0][0]
____________________________________________________________________________________________________
batch_normalization_34 (BatchNor (None, 14, 14, 1024)  4096        conv2d_34[0][0]
____________________________________________________________________________________________________
add_10 (Add)                     (None, 14, 14, 1024)  0           batch_normalization_34[0][0]
                                                                   activation_28[0][0]
____________________________________________________________________________________________________
activation_31 (Activation)       (None, 14, 14, 1024)  0           add_10[0][0]
____________________________________________________________________________________________________
conv2d_35 (Conv2D)               (None, 14, 14, 256)   262400      activation_31[0][0]
____________________________________________________________________________________________________
batch_normalization_35 (BatchNor (None, 14, 14, 256)   1024        conv2d_35[0][0]
____________________________________________________________________________________________________
activation_32 (Activation)       (None, 14, 14, 256)   0           batch_normalization_35[0][0]
____________________________________________________________________________________________________
conv2d_36 (Conv2D)               (None, 14, 14, 256)   590080      activation_32[0][0]
____________________________________________________________________________________________________
batch_normalization_36 (BatchNor (None, 14, 14, 256)   1024        conv2d_36[0][0]
____________________________________________________________________________________________________
activation_33 (Activation)       (None, 14, 14, 256)   0           batch_normalization_36[0][0]
____________________________________________________________________________________________________
conv2d_37 (Conv2D)               (None, 14, 14, 1024)  263168      activation_33[0][0]
____________________________________________________________________________________________________
batch_normalization_37 (BatchNor (None, 14, 14, 1024)  4096        conv2d_37[0][0]
____________________________________________________________________________________________________
add_11 (Add)                     (None, 14, 14, 1024)  0           batch_normalization_37[0][0]
                                                                   activation_31[0][0]
____________________________________________________________________________________________________
activation_34 (Activation)       (None, 14, 14, 1024)  0           add_11[0][0]
____________________________________________________________________________________________________
conv2d_38 (Conv2D)               (None, 14, 14, 256)   262400      activation_34[0][0]
____________________________________________________________________________________________________
batch_normalization_38 (BatchNor (None, 14, 14, 256)   1024        conv2d_38[0][0]
____________________________________________________________________________________________________
activation_35 (Activation)       (None, 14, 14, 256)   0           batch_normalization_38[0][0]
____________________________________________________________________________________________________
conv2d_39 (Conv2D)               (None, 14, 14, 256)   590080      activation_35[0][0]
____________________________________________________________________________________________________
batch_normalization_39 (BatchNor (None, 14, 14, 256)   1024        conv2d_39[0][0]
____________________________________________________________________________________________________
activation_36 (Activation)       (None, 14, 14, 256)   0           batch_normalization_39[0][0]
____________________________________________________________________________________________________
conv2d_40 (Conv2D)               (None, 14, 14, 1024)  263168      activation_36[0][0]
____________________________________________________________________________________________________
batch_normalization_40 (BatchNor (None, 14, 14, 1024)  4096        conv2d_40[0][0]
____________________________________________________________________________________________________
add_12 (Add)                     (None, 14, 14, 1024)  0           batch_normalization_40[0][0]
                                                                   activation_34[0][0]
____________________________________________________________________________________________________
activation_37 (Activation)       (None, 14, 14, 1024)  0           add_12[0][0]
____________________________________________________________________________________________________
conv2d_41 (Conv2D)               (None, 14, 14, 256)   262400      activation_37[0][0]
____________________________________________________________________________________________________
batch_normalization_41 (BatchNor (None, 14, 14, 256)   1024        conv2d_41[0][0]
____________________________________________________________________________________________________
activation_38 (Activation)       (None, 14, 14, 256)   0           batch_normalization_41[0][0]
____________________________________________________________________________________________________
conv2d_42 (Conv2D)               (None, 14, 14, 256)   590080      activation_38[0][0]
____________________________________________________________________________________________________
batch_normalization_42 (BatchNor (None, 14, 14, 256)   1024        conv2d_42[0][0]
____________________________________________________________________________________________________
activation_39 (Activation)       (None, 14, 14, 256)   0           batch_normalization_42[0][0]
____________________________________________________________________________________________________
conv2d_43 (Conv2D)               (None, 14, 14, 1024)  263168      activation_39[0][0]
____________________________________________________________________________________________________
batch_normalization_43 (BatchNor (None, 14, 14, 1024)  4096        conv2d_43[0][0]
____________________________________________________________________________________________________
add_13 (Add)                     (None, 14, 14, 1024)  0           batch_normalization_43[0][0]
                                                                   activation_37[0][0]
____________________________________________________________________________________________________
activation_40 (Activation)       (None, 14, 14, 1024)  0           add_13[0][0]
____________________________________________________________________________________________________
conv2d_45 (Conv2D)               (None, 7, 7, 512)     524800      activation_40[0][0]
____________________________________________________________________________________________________
batch_normalization_45 (BatchNor (None, 7, 7, 512)     2048        conv2d_45[0][0]
____________________________________________________________________________________________________
activation_41 (Activation)       (None, 7, 7, 512)     0           batch_normalization_45[0][0]
____________________________________________________________________________________________________
conv2d_46 (Conv2D)               (None, 7, 7, 512)     2359808     activation_41[0][0]
____________________________________________________________________________________________________
batch_normalization_46 (BatchNor (None, 7, 7, 512)     2048        conv2d_46[0][0]
____________________________________________________________________________________________________
activation_42 (Activation)       (None, 7, 7, 512)     0           batch_normalization_46[0][0]
____________________________________________________________________________________________________
conv2d_47 (Conv2D)               (None, 7, 7, 2048)    1050624     activation_42[0][0]
____________________________________________________________________________________________________
conv2d_44 (Conv2D)               (None, 7, 7, 2048)    2099200     activation_40[0][0]
____________________________________________________________________________________________________
batch_normalization_47 (BatchNor (None, 7, 7, 2048)    8192        conv2d_47[0][0]
____________________________________________________________________________________________________
batch_normalization_44 (BatchNor (None, 7, 7, 2048)    8192        conv2d_44[0][0]
____________________________________________________________________________________________________
add_14 (Add)                     (None, 7, 7, 2048)    0           batch_normalization_47[0][0]
                                                                   batch_normalization_44[0][0]
____________________________________________________________________________________________________
activation_43 (Activation)       (None, 7, 7, 2048)    0           add_14[0][0]
____________________________________________________________________________________________________
conv2d_48 (Conv2D)               (None, 7, 7, 512)     1049088     activation_43[0][0]
____________________________________________________________________________________________________
batch_normalization_48 (BatchNor (None, 7, 7, 512)     2048        conv2d_48[0][0]
____________________________________________________________________________________________________
activation_44 (Activation)       (None, 7, 7, 512)     0           batch_normalization_48[0][0]
____________________________________________________________________________________________________
conv2d_49 (Conv2D)               (None, 7, 7, 512)     2359808     activation_44[0][0]
____________________________________________________________________________________________________
batch_normalization_49 (BatchNor (None, 7, 7, 512)     2048        conv2d_49[0][0]
____________________________________________________________________________________________________
activation_45 (Activation)       (None, 7, 7, 512)     0           batch_normalization_49[0][0]
____________________________________________________________________________________________________
conv2d_50 (Conv2D)               (None, 7, 7, 2048)    1050624     activation_45[0][0]
____________________________________________________________________________________________________
batch_normalization_50 (BatchNor (None, 7, 7, 2048)    8192        conv2d_50[0][0]
____________________________________________________________________________________________________
add_15 (Add)                     (None, 7, 7, 2048)    0           batch_normalization_50[0][0]
                                                                   activation_43[0][0]
____________________________________________________________________________________________________
activation_46 (Activation)       (None, 7, 7, 2048)    0           add_15[0][0]
____________________________________________________________________________________________________
conv2d_51 (Conv2D)               (None, 7, 7, 512)     1049088     activation_46[0][0]
____________________________________________________________________________________________________
batch_normalization_51 (BatchNor (None, 7, 7, 512)     2048        conv2d_51[0][0]
____________________________________________________________________________________________________
activation_47 (Activation)       (None, 7, 7, 512)     0           batch_normalization_51[0][0]
____________________________________________________________________________________________________
conv2d_52 (Conv2D)               (None, 7, 7, 512)     2359808     activation_47[0][0]
____________________________________________________________________________________________________
batch_normalization_52 (BatchNor (None, 7, 7, 512)     2048        conv2d_52[0][0]
____________________________________________________________________________________________________
activation_48 (Activation)       (None, 7, 7, 512)     0           batch_normalization_52[0][0]
____________________________________________________________________________________________________
conv2d_53 (Conv2D)               (None, 7, 7, 2048)    1050624     activation_48[0][0]
____________________________________________________________________________________________________
batch_normalization_53 (BatchNor (None, 7, 7, 2048)    8192        conv2d_53[0][0]
____________________________________________________________________________________________________
add_16 (Add)                     (None, 7, 7, 2048)    0           batch_normalization_53[0][0]
                                                                   activation_46[0][0]
____________________________________________________________________________________________________
activation_49 (Activation)       (None, 7, 7, 2048)    0           add_16[0][0]
____________________________________________________________________________________________________
global_avg_pooling (GlobalAverag (None, 2048)          0           activation_49[0][0]
____________________________________________________________________________________________________
dense_1 (Dense)                  (None, 10)            20490       global_avg_pooling[0][0]
____________________________________________________________________________________________________
activation_50 (Activation)       (None, 10)            0           dense_1[0][0]
====================================================================================================
Total params: 23,608,202
Trainable params: 23,555,082
Non-trainable params: 53,120
____________________________________________________________________________________________________
Using Enhanced Data Generation
Found 4000 images belonging to 4 classes.
Found 800 images belonging to 4 classes.
JSON Mapping for the model classes saved to  C:\Users\User\PycharmProjects\ImageAITest\pets\json\model_class.json
Number of experiments (Epochs) :  100

训练过程开始后,您将在控制台中看到如下结果:

Epoch 1/100
 1/25 [>.............................] - ETA: 52s - loss: 2.3026 - acc: 0.2500
 2/25 [=>............................] - ETA: 41s - loss: 2.3027 - acc: 0.1250
 3/25 [==>...........................] - ETA: 37s - loss: 2.2961 - acc: 0.1667
 4/25 [===>..........................] - ETA: 36s - loss: 2.2980 - acc: 0.1250
 5/25 [=====>........................] - ETA: 33s - loss: 2.3178 - acc: 0.1000
 6/25 [======>.......................] - ETA: 31s - loss: 2.3214 - acc: 0.0833
 7/25 [=======>......................] - ETA: 30s - loss: 2.3202 - acc: 0.0714
 8/25 [========>.....................] - ETA: 29s - loss: 2.3207 - acc: 0.0625
 9/25 [=========>....................] - ETA: 27s - loss: 2.3191 - acc: 0.0556
10/25 [===========>..................] - ETA: 25s - loss: 2.3167 - acc: 0.0750
11/25 [============>.................] - ETA: 23s - loss: 2.3162 - acc: 0.0682
12/25 [=============>................] - ETA: 21s - loss: 2.3143 - acc: 0.0833
13/25 [==============>...............] - ETA: 20s - loss: 2.3135 - acc: 0.0769
14/25 [===============>..............] - ETA: 18s - loss: 2.3132 - acc: 0.0714
15/25 [=================>............] - ETA: 16s - loss: 2.3128 - acc: 0.0667
16/25 [==================>...........] - ETA: 15s - loss: 2.3121 - acc: 0.0781
17/25 [===================>..........] - ETA: 13s - loss: 2.3116 - acc: 0.0735
18/25 [====================>.........] - ETA: 12s - loss: 2.3114 - acc: 0.0694
19/25 [=====================>........] - ETA: 10s - loss: 2.3112 - acc: 0.0658
20/25 [=======================>......] - ETA: 8s - loss: 2.3109 - acc: 0.0625
21/25 [========================>.....] - ETA: 7s - loss: 2.3107 - acc: 0.0595
22/25 [=========================>....] - ETA: 5s - loss: 2.3104 - acc: 0.0568
23/25 [==========================>...] - ETA: 3s - loss: 2.3101 - acc: 0.0543
24/25 [===========================>..] - ETA: 1s - loss: 2.3097 - acc: 0.0625Epoch 00000: saving model to C:\Users\Moses\Documents\Moses\W7\AI\Custom Datasets\IDENPROF\idenprof-small-test\idenprof\models\model_ex-000_acc-0.100000.h5

25/25 [==============================] - 51s - loss: 2.3095 - acc: 0.0600 - val_loss: 2.3026 - val_acc: 0.1000

让我们解释一下上面显示的细节:

  1. Epoch 1/100 这行表示正在进行第100个目标的第1次训练
  2. 1/25 [>………………………..] - ETA: 52s - loss: 2.3026 - acc: 0.2500 表示本实验中正在训练的批次数
  3. Epoch 00000: saving model to C:\Users\Moses\Documents\Moses\W7\AI\Custom Datasets\IDENPROF\idenprof-small-test\idenprof\models\model_ex-000_acc-0.100000.h5 是指本实验后保存的模型文件。该 ex_000 表示实验的阶段,而 acc_0.100000val_acc:0.1000 表示本实验完成后测试图像上模型的精准度(最大精准度为1.0)。此结果有助于了解可用于自定义图像预测的最佳模型。

完成自定义模型的训练后,可以使用CustomImagePrediction类对自定义模型执行图像预测。只需点击以下链接即可查看完整示例。

https://github.com/OlafenwaMoses/ImageAI/blob/master/imageai/Prediction/CUSTOMPREDICTION.md

在 IdenProf 数据集上训练

来自 IdenProf 数据集的样本用于训练模型以预测专业人员。

https://github.com/kangvcar/ImageAI/raw/master/images/idenprof.jpg

下面我们提供的示例代码在IdenProf数据集中进行包含10名穿制服专业人员图像的训练:

from io import open
import requests
import shutil
from zipfile import ZipFile
import os
from imageai.Prediction.Custom import ModelTraining

execution_path = os.getcwd()


TRAIN_ZIP_ONE = os.path.join(execution_path, "idenprof-train1.zip")
TRAIN_ZIP_TWO = os.path.join(execution_path, "idenprof-train2.zip")
TEST_ZIP = os.path.join(execution_path, "idenprof-test.zip")


DATASET_DIR = os.path.join(execution_path, "idenprof")
DATASET_TRAIN_DIR = os.path.join(DATASET_DIR, "train")
DATASET_TEST_DIR = os.path.join(DATASET_DIR, "test")


if(os.path.exists(DATASET_DIR) == False):
    os.mkdir(DATASET_DIR)
if(os.path.exists(DATASET_TRAIN_DIR) == False):
    os.mkdir(DATASET_TRAIN_DIR)
if(os.path.exists(DATASET_TEST_DIR) == False):
    os.mkdir(DATASET_TEST_DIR)


if(len(os.listdir(DATASET_TRAIN_DIR)) < 10):
    if(os.path.exists(TRAIN_ZIP_ONE) == False):
        print("Downloading idenprof-train1.zip")
        data = requests.get("https://github.com/OlafenwaMoses/IdenProf/releases/download/v1.0/idenprof-train1.zip", stream = True)
        with open(TRAIN_ZIP_ONE, "wb") as file:
            shutil.copyfileobj(data.raw, file)
            del data
    if (os.path.exists(TRAIN_ZIP_TWO) == False):
        print("Downloading idenprof-train2.zip")
        data = requests.get("https://github.com/OlafenwaMoses/IdenProf/releases/download/v1.0/idenprof-train2.zip", stream=True)
        with open(TRAIN_ZIP_TWO, "wb") as file:
            shutil.copyfileobj(data.raw, file)
            del data
    print("Extracting idenprof-train1.zip")
    extract1 = ZipFile(TRAIN_ZIP_ONE)
    extract1.extractall(DATASET_TRAIN_DIR)
    extract1.close()
    print("Extracting idenprof-train2.zip")
    extract2 = ZipFile(TRAIN_ZIP_TWO)
    extract2.extractall(DATASET_TRAIN_DIR)
    extract2.close()


if(len(os.listdir(DATASET_TEST_DIR)) < 10):
    if (os.path.exists(TEST_ZIP) == False):
        print("Downloading idenprof-test.zip")
        data = requests.get("https://github.com/OlafenwaMoses/IdenProf/releases/download/v1.0/idenprof-test.zip", stream=True)
        with open(TEST_ZIP, "wb") as file:
            shutil.copyfileobj(data.raw, file)
            del data
    print("Extracting idenprof-test.zip")
    extract = ZipFile(TEST_ZIP)
    extract.extractall(DATASET_TEST_DIR)
    extract.close()


model_trainer = ModelTraining()
model_trainer.setModelTypeAsResNet()
model_trainer.setDataDirectory(DATASET_DIR)
model_trainer.trainModel(num_objects=10, num_experiments=100, enhance_data=True, batch_size=32, show_network_summary=True)

文档

imageai.Prediction.Custom.ModelTraining class


在任何的Python程序中通过实例化ModelTraining类并调用下面的函数即可定制训练模型:

  • setModelTypeAsSqueezeNet 如果您选择使用 SqueezeNet 模型文件来预测图像,你只需调用一次该函数。
  • setModelTypeAsResNet 如果您选择使用 ResNet 模型文件来预测图像,你只需调用一次该函数。
  • setModelTypeAsInceptionV3 如果您选择使用 InceptionV3Net 模型文件来预测图像,你只需调用一次该函数。
  • setModelTypeAsDenseNet 如果您选择使用 DenseNet 模型文件来预测图像,你只需调用一次该函数。
  • setDataDirectory 该函数设置用于训练的数据/数据集的路径。
  • trainModel 该函数用于启动模型训练。它接受以下参数:
    • num_objects,该参数用于指定图像数据集中对象的数量
    • num_experiments 该参数用于指定将对图像训练的次数,也称为epochs
    • enhance_data(可选),该参数用于指定是否生成训练图像的副本以获得更好的性能
    • batch_size(可选,默认为32),该参数用于指定批次数量。由于内存限制,需要分批训练,直到所有批次训练集都完成为止。您可以根据具体训练的数量进行调整该值,batch_size通常设置为16,32,64,128。
    • initial_learning_rate(可选),此值用于调整训练模型的权重。如果您对此概念没有深刻理解,建议您保持默认值。
    • show_network_summary(可选,默认为 False),该参数用于指定是否在控制台中显示训练的过程。

:param num_objects:
:param num_experiments:
:param enhance_data:
:param batch_size:
:param initial_learning_rate:
:param show_network_summary:
:return:

提交自定义模型

我们欢迎所有使用此库的人提交您的训练模型及其JSON文件,并将其加入此repository中。通过以下联系方式提交您的训练模型及其JSON文件。

联系开发人员

Moses Olafenwa

Email: guymodscientist@gmail.com
Website: https://moses.specpal.science
Twitter:@OlafenwaMoses
Medium: @guymodscientist
Facebook: moses.olafenwa

ImageAI:自定义图像预测

AI共享项目https://commons.specpal.science


ImageAI 提供4种不同的算法和模型,使你可以用您自定义的模型执行图像预测。您将使用 ImageAI 已训练的模型和相应的 JSON 文件来预测自定义对象。在这个例子中,我们将使用在IdenProf上进行20次实验训练出的模型,IdenProf是一个专业人员的数据集,在测试数据集上达到65.17%的准确度(您可以使用自己训练的模型并生成JSON文件。此”CLASS”主要的目的是使你可以使用自己训练的模型。)通过以下链接下载ResNet模型和JSON文件:

- ResNet(文件大小= 90.4MB)
- IdenProf model_class.json file

很好!下载模型文件和JSON文件后,启动一个新的python项目,然后将模型文件和JSON文件复制到python文件(.py文件)所在的项目文件夹中。下载下面的图像,或者在您的计算机上拍摄任何包含以下专业人员(厨师,医生,工程师 ,农民,消防员,法官,机械师,飞行员,警察和服务员)的图像,并将其复制到您的python项目文件夹中。然后创建一个python文件并为其命名; 例如FirstCustomPrediction.py。然后将下面的代码写入python文件中:

FirstCustomPrediction.py

from imageai.Prediction.Custom import CustomImagePrediction
import os
execution_path = os.getcwd()


prediction = CustomImagePrediction()
prediction.setModelTypeAsResNet()
prediction.setModelPath(os.path.join(execution_path, "resnet_model_ex-020_acc-0.651714.h5"))
prediction.setJsonPath(os.path.join(execution_path, "model_class.json"))
prediction.loadModel(num_objects=10)

predictions, probabilities = prediction.predictImage(os.path.join(execution_path, "4.jpg"), result_count=5)

for eachPrediction, eachProbability in zip(predictions, probabilities):
    print(eachPrediction + " : " + eachProbability)

示例结果:

https://github.com/kangvcar/ImageAI/raw/master/images/4.jpg

mechanic : 76.82620286941528
chef : 10.106072574853897
waiter : 4.036874696612358
police : 2.6663416996598244
pilot : 2.239348366856575

让我们对示例代码进行解读:

from imageai.Prediction.Custom import CustomImagePrediction
import os

上面的代码导入了ImageAI库的CustomImagePrediction类和Python os类。

execution_path = os.getcwd()

上面的代码获取包含python文件的文件夹路径(在本例中python文件为FirstCustomPrediction.py)

prediction = CustomImagePrediction()
prediction.setModelTypeAsResNet()
prediction.setModelPath(os.path.join(execution_path, "resnet_model_ex-020_acc-0.651714.h5"))
prediction.setJsonPath(os.path.join(execution_path, "model_class.json"))
prediction.loadModel(num_objects=10)

在上面的代码中,我们在第一行我们对CustomImagePrediction类进行了实例化,第二行调用了.setModelTypeAsResNet()函数将预测对象的模型类型设置为ResNet,,第三行设置了模型文件(resnet_model_ex-020_acc-0.651714.h5)的路径,第四行设置JSON文件(** model_class.json**)的路径,第五行载入模型并设置需要预测的对象数。

predictions, probabilities = prediction.predictImage(os.path.join(execution_path, "4.jpg"), result_count=5)

在上面的代码中,我们定义了两个变量,他们的值将由所调用的函数predictImage()返回,其中predictImage()函数接受了两个参数,一个是指定要进行图像预测的图像文件路径,另一个参数result_count用于设置我们想要预测结果的数量(该参数的值可选1 to 100)。最后,predictImage()函数将返回预测的对象名和相应的百分比概率(percentage_probabilities)。

for eachPrediction, eachProbability in zip(predictions, probabilities):
    print(eachPrediction + " : " + eachProbability)

在上面的代码获取了predictions变量中的每个对象名,并从probabilities变量中获取相应的百分比概率,最后将两者的结果打印到终端。

CustomImagePrediction类还支持ImagePrediction类中包含的多图像预测,输入类型和预测速度功能。点击此链接查看详细介绍。