利用 ImageAI 在 COCO 上学习目标检测

ImageAI是一个python库,旨在使开发人员能够使用简单的几行代码构建具有包含深度学习和计算机视觉功能的应用程序和系统。 这个 AI Commons 项目https://commons.specpal.science 由 Moses Olafenwa 和 John Olafenwa 开发和维护。为了更好的使用 ImageAI,我将其 Fork 到 CodeXZone/ImageAI。同时,ImageAI 也提供了中文手册:imageai。下面我将借助该教程一步一步的学习目标检测。

利用 cocoz 载入 COCO 数据集

首先,利用 cocoz 载入 COCOZ:

import sys
# 将 cocoapi 添加进入环境变量
sys.path.append(r‘D:\API\cocoapi\PythonAPI‘)
from pycocotools.cocoz import AnnZ, ImageZ, COCOZ
# ------------------

import numpy as np
from matplotlib import pyplot as plt
from IPython import display

def use_svg_display():
    # 用矢量图显示, 效果更好
    display.set_matplotlib_formats(‘svg‘)

def show_imgs(imgs, k=4):
    ‘‘‘
    展示 多张图片
    ‘‘‘
    n = len(imgs)
    h, w = k, n // k
    assert n == h * w, "图片数量不匹配"
    use_svg_display()
    _, ax = plt.subplots(h, w, figsize=(5, 5))  # 设置图的尺寸
    K = np.arange(n).reshape((h, w))
    for i in range(h):
        for j in range(w):
            img = imgs[K[i, j]]
            ax[i][j].imshow(img)
            ax[i][j].axes.get_yaxis().set_visible(False)
            ax[i][j].set_xticks([])
    plt.show()
dataDir = r‘E:\Data\coco\images‘   # COCO 数据根目录
dataType = ‘train2017‘
imgZ = ImageZ(dataDir, dataType)

show_imgs(imgZ[300:316])

物体检测,提取和微调

import sys
sys.path.append(‘D:/API/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()  # 载入预训练模型

由于 detector.detectObjectsFromImage 比较容易支持解压后的图片,所以我们可以提取出一张图片来做测试:

input_image = imgZ.Z.extract(imgZ.names[0]) # 输入文件的路径
output_image = os.path.join(execution_path, "image2new.jpg")  # 输出文件的路径

detections = detector.detectObjectsFromImage(
    input_image=input_image, output_image_path=output_image)

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

detectObjectsFromImage() 函数返回一个字典列表,每个字典包含图像中检测到的对象信息,字典中的对象信息有 name(对象类名)和 percentage_probability(概率)以及 box_points(图片的左上角与右下角的坐标)。

detections
[{‘name‘: ‘motorcycle‘,
  ‘percentage_probability‘: 99.99607801437378,
  ‘box_points‘: array([ 34,  92, 546, 427])}]

下面我们看看其标注框:

img = plt.imread(output_image)
plt.imshow(img)
plt.show()

为了直接使用压缩文件,我们可以修改 detectObjectsFromImage 的默认参数 input_type=‘file‘input_type=‘array‘

input_image = imgZ[202]  # 输入文件的路径
output_image = os.path.join(execution_path, "image2.jpg")  # 输出文件的路径

detections = detector.detectObjectsFromImage(
    input_image=input_image, output_image_path=output_image, input_type=‘array‘)

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

img = plt.imread(output_image)
plt.imshow(img)
plt.show()
tennis racket :  54.25310730934143
--------------------------------
person :  99.85058307647705
--------------------------------

detections, objects_path = detector.detectObjectsFromImage(
    input_image=imgZ[900], input_type = ‘array‘,
    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("--------------------------------")
person :  56.35678172111511
Object‘s image saved in  D:\API\CVX\draft\image3new.jpg-objects\person-1.jpg
--------------------------------
person :  75.83483457565308
Object‘s image saved in  D:\API\CVX\draft\image3new.jpg-objects\person-2.jpg
--------------------------------
person :  60.49004793167114
Object‘s image saved in  D:\API\CVX\draft\image3new.jpg-objects\person-3.jpg
--------------------------------
person :  85.2730393409729
Object‘s image saved in  D:\API\CVX\draft\image3new.jpg-objects\person-4.jpg
--------------------------------
person :  83.12703967094421
Object‘s image saved in  D:\API\CVX\draft\image3new.jpg-objects\person-5.jpg
--------------------------------
bus :  99.7751772403717
Object‘s image saved in  D:\API\CVX\draft\image3new.jpg-objects\bus-6.jpg
--------------------------------

extract_detected_objects=True 将会把检测到的对象提取并保存为单独的图像;这将使函数返回 2 个值,第一个是字典数组,每个字典对应一个检测到的对象信息,第二个是所有提取出对象的图像保存路径,并且它们按照对象在第一个数组中的顺序排列。我们先看看原图:

plt.imshow(imgZ[900])
plt.show()

显示识别出来的对象:

show_imgs([plt.imread(fname) for fname in objects_path], 2)

还有一个十分重要的参数 minimum_percentage_probability 用于设定预测概率的阈值,其默认值为 50(范围在 \(0-100\)之间)。如果保持默认值,这意味着只有当百分比概率大于等于 50 时,该函数才会返回检测到的对象。使用默认值可以确保检测结果的完整性,但是在检测过程中可能会跳过许多对象。下面我们看看修改后的效果:

detections = detector.detectObjectsFromImage(
    input_image=imgZ[900],
    input_type=‘array‘,
    output_image_path=os.path.join(execution_path, "image3new.jpg"),
    minimum_percentage_probability=70)

for eachObject in detections:
    print(eachObject["name"] + " : ", eachObject["percentage_probability"])
    print("--------------------------------")
person :  75.83483457565308
--------------------------------
person :  85.2730393409729
--------------------------------
person :  83.12703967094421
--------------------------------
bus :  99.7751772403717
--------------------------------

我们将 minimum_percentage_probability 设置为 70,此时仅仅只能检测到 4 个。

原文地址:https://www.cnblogs.com/q735613050/p/10165709.html

时间: 2024-08-01 10:57:06

利用 ImageAI 在 COCO 上学习目标检测的相关文章

深度学习 目标检测算法 SSD 论文简介

深度学习 目标检测算法 SSD 论文简介 一.论文简介: ECCV-2016 Paper:https://arxiv.org/pdf/1512.02325v5.pdf  Slides:http://www.cs.unc.edu/~wliu/papers/ssd_eccv2016_slide.pdf 二.代码训练测试: https://github.com/weiliu89/caffe/tree/ssd  一.论文算法大致流程: 1.类似"anchor"机制: 如上所示:在 featur

深度学习之目标检测常用算法原理+实践精讲

第1章 课程介绍本章节主要介绍课程的主要内容.核心知识点.课程涉及到的应用案例.深度学习算法设计通用流程.适应人群.学习本门课程的前置条件.学习后达到的效果等,帮助大家从整体上了解本门课程的整体脉络. 第2章 目标检测算法基础介绍本章节主要介绍目标检测算法的基本概念.传统的目标检测算法.目前深度学习目标检测主流方法(one-stage.two-stage.多任务网络).相关算法的基本流程.算法性能的评价指标.不同算法的优缺点和性能比较等,并结合实际的应用场景和案例来介绍目标检测算法的重要性和实用

深度学习之目标检测常用算法原理+实践精讲 YOLO / Faster RCNN / SSD / 文本检测 / 多任务网络

深度学习之目标检测常用算法原理+实践精讲 YOLO / Faster RCNN / SSD / 文本检测 / 多任务网络 资源获取链接:点击这里 第1章 课程介绍 本章节主要介绍课程的主要内容.核心知识点.课程涉及到的应用案例.深度学习算法设计通用流程.适应人群.学习本门课程的前置条件.学习后达到的效果等,帮助大家从整体上了解本门课程的整体脉络. 1-1 课程导学 第2章 目标检测算法基础介绍 本章节主要介绍目标检测算法的基本概念.传统的目标检测算法.目前深度学习目标检测主流方法(one-sta

基于深度学习的目标检测研究进展

前言 开始本文内容之前,我们先来看一下上边左侧的这张图,从图中你看到了什么物体?他们在什么位置?这还不简单,图中有一个猫和一个人,具体的位置就是上图右侧图像两个边框(bounding-box)所在的位置.其实刚刚的这个过程就是目标检测,目标检测就是"给定一张图像或者视频帧,找出其中所有目标的位置,并给出每个目标的具体类别". 目标检测对于人来说是再简单不过的任务,但是对于计算机来说,它看到的是一些值为0~255的数组,因而很难直接得到图像中有人或者猫这种高层语义概念,也不清楚目标出现在

CS231n第八课:目标检测定位学习记录

结合视频第八集和笔记:http://chuansong.me/n/353443351445 本节课程从分类(Classification),定位(Localization)和检测(Detection)三个方面入手. 从上图可以直观的看到: 1.对于分类而言,就是对于给定的图片把其划分到给定的几种类别中某一种.很显然,图像中只能存在一种给定类别中的对象. 2.而定位就是找到对应的对象的位置区域,把它框选出来(即Bounding Box),这个选框除了位置信息(x,y)外还要包含其大小信息(w,h)

目标检测梳理:基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN(转)

基于深度学习的目标检测技术演进:R-CNN.Fast R-CNN.Faster R-CNN(转) 原文链接:https://www.cnblogs.com/skyfsm/p/6806246.html object detection我的理解,就是在给定的图片中精确找到物体所在位置,并标注出物体的类别.object detection要解决的问题就是物体在哪里,是什么这整个流程的问题.然而,这个问题可不是那么容易解决的,物体的尺寸变化范围很大,摆放物体的角度,姿态不定,而且可以出现在图片的任何地方

目标检测综述

这篇综述是我统计信号处理的作业,在这里分享一下,将介绍计算机视觉中的目标检测任务,论述自深度学习以来目标检测的常见方法,着重讲yolo算法,并且将yolo算法与其他的one-stage以及two-stage方法进行比较. 目录 1.介绍 2.YOLO 2.1 YOLOv1 2.2 YOLOv2 2.3 YOLOv3 3.其他方法 RCNN FastRCNN FasterRCNN SSD RetinaNet 4.实验结果比较 5.总结 参考文献 1. 介绍 目标检测在现实中的应用很广泛,我们需要检

奇点云三角肌「秀肌肉」,端化目标检测模型再获突破

人工智能正在驱动新一轮的商业变革,而算法技术则是推动核心底层技术的重要力量.算法崛起时代,技术浪潮可谓一日千里,算法工程师也只有不断精进自身技术,才能与时俱进.驭浪前行.近日,奇点云算法工程师三角肌在目标检测算法领域又有新突破. 摘要 卷积神经网络对目标检测的精度有着显著的提升,并且随着卷积神经网络的深度加深,对目标检测精度提升也越大,但是也需要更多的浮点计算.许多研究者通过知识蒸馏的方法,通过把一个更深更大的教师网络中的知识转移到一个小的学生网络中,以提高学生网络在目标检测中的效果.而大部分知

CVPR2019目标检测方法进展综述

CVPR2019目标检测方法进展综述 置顶 2019年03月20日 14:14:04 SIGAI_csdn 阅读数 5869更多 分类专栏: 机器学习 人工智能 AI SIGAI 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/SIGAI_CSDN/article/details/88687747 SIGAI特约作者 陈泰红研究方向:机器学习.图像处理 目标检测是很多计算机视觉应用的基础,