【实战】使用Faster RCNN进行目标自动检测与裁剪【附源码】

《------往期经典推荐------》

一、AI应用软件开发实战专栏【链接】

项目名称 项目名称
1.【人脸识别与管理系统开发 2.【车牌识别与自动收费管理系统开发
3.【手势识别系统开发 4.【人脸面部活体检测系统开发
5.【图片风格快速迁移软件开发 6.【人脸表表情识别系统
7.【YOLOv8多目标识别与自动标注软件开发 8.【基于YOLOv8深度学习的行人跌倒检测系统
9.【基于YOLOv8深度学习的PCB板缺陷检测系统 10.【基于YOLOv8深度学习的生活垃圾分类目标检测系统
11.【基于YOLOv8深度学习的安全帽目标检测系统 12.【基于YOLOv8深度学习的120种犬类检测与识别系统
13.【基于YOLOv8深度学习的路面坑洞检测系统 14.【基于YOLOv8深度学习的火焰烟雾检测系统
15.【基于YOLOv8深度学习的钢材表面缺陷检测系统 16.【基于YOLOv8深度学习的舰船目标分类检测系统
17.【基于YOLOv8深度学习的西红柿成熟度检测系统 18.【基于YOLOv8深度学习的血细胞检测与计数系统
19.【基于YOLOv8深度学习的吸烟/抽烟行为检测系统 20.【基于YOLOv8深度学习的水稻害虫检测与识别系统
21.【基于YOLOv8深度学习的高精度车辆行人检测与计数系统 22.【基于YOLOv8深度学习的路面标志线检测与识别系统
23.【基于YOLOv8深度学习的智能小麦害虫检测识别系统 24.【基于YOLOv8深度学习的智能玉米害虫检测识别系统
25.【基于YOLOv8深度学习的200种鸟类智能检测与识别系统 26.【基于YOLOv8深度学习的45种交通标志智能检测与识别系统
27.【基于YOLOv8深度学习的人脸面部表情识别系统 28.【基于YOLOv8深度学习的苹果叶片病害智能诊断系统
29.【基于YOLOv8深度学习的智能肺炎诊断系统 30.【基于YOLOv8深度学习的葡萄簇目标检测系统
31.【基于YOLOv8深度学习的100种中草药智能识别系统 32.【基于YOLOv8深度学习的102种花卉智能识别系统
33.【基于YOLOv8深度学习的100种蝴蝶智能识别系统 34.【基于YOLOv8深度学习的水稻叶片病害智能诊断系统
35.【基于YOLOv8与ByteTrack的车辆行人多目标检测与追踪系统 36.【基于YOLOv8深度学习的智能草莓病害检测与分割系统
37.【基于YOLOv8深度学习的复杂场景下船舶目标检测系统 38.【基于YOLOv8深度学习的农作物幼苗与杂草检测系统
39.【基于YOLOv8深度学习的智能道路裂缝检测与分析系统 40.【基于YOLOv8深度学习的葡萄病害智能诊断与防治系统
41.【基于YOLOv8深度学习的遥感地理空间物体检测系统 42.【基于YOLOv8深度学习的无人机视角地面物体检测系统
43.【基于YOLOv8深度学习的木薯病害智能诊断与防治系统 44.【基于YOLOv8深度学习的野外火焰烟雾检测系统
45.【基于YOLOv8深度学习的脑肿瘤智能检测系统 46.【基于YOLOv8深度学习的玉米叶片病害智能诊断与防治系统
47.【基于YOLOv8深度学习的橙子病害智能诊断与防治系统 48.【基于深度学习的车辆检测追踪与流量计数系统
49.【基于深度学习的行人检测追踪与双向流量计数系统 50.【基于深度学习的反光衣检测与预警系统
51.【基于深度学习的危险区域人员闯入检测与报警系统 52.【基于深度学习的高密度人脸智能检测与统计系统
53.【基于深度学习的CT扫描图像肾结石智能检测系统 54.【基于深度学习的水果智能检测系统
55.【基于深度学习的水果质量好坏智能检测系统 56.【基于深度学习的蔬菜目标检测与识别系统
57.【基于深度学习的非机动车驾驶员头盔检测系统 58.【太基于深度学习的阳能电池板检测与分析系统
59.【基于深度学习的工业螺栓螺母检测 60.【基于深度学习的金属焊缝缺陷检测系统
61.【基于深度学习的链条缺陷检测与识别系统 62.【基于深度学习的交通信号灯检测识别
63.【基于深度学习的草莓成熟度检测与识别系统 64.【基于深度学习的水下海生物检测识别系统
65.【基于深度学习的道路交通事故检测识别系统 66.【基于深度学习的安检X光危险品检测与识别系统
67.【基于深度学习的农作物类别检测与识别系统 68.【基于深度学习的危险驾驶行为检测识别系统
69.【基于深度学习的维修工具检测识别系统 70.【基于深度学习的维修工具检测识别系统
71.【基于深度学习的建筑墙面损伤检测系统 72.【基于深度学习的煤矿传送带异物检测系统
73.【基于深度学习的老鼠智能检测系统

二、机器学习实战专栏【链接】,已更新31期,欢迎关注,持续更新中~~
三、深度学习【Pytorch】专栏【链接】
四、【Stable Diffusion绘画系列】专栏【链接】
五、YOLOv8改进专栏【链接】持续更新中~~
六、YOLO性能对比专栏【链接】,持续更新中~

《------正文------》

目录

  • 引言
  • 下载预训练模型
    • 下载模型的步骤
    • 在Python环境中设置
  • 完整代码:自动目标检测和裁剪
  • 代码详解
    • 1.加载预训练模型
    • 2.准备图像
    • 3.运行检测
    • 4.解析结果和绘制边界框
    • 5.保存裁剪的图像
    • 结果
  • 优点

引言

有时候,我们需要亲自动手从头开始创建一个数据集。本文将介绍如何使用Faster RCNN 进行目标自动检测与裁剪,然后保存裁剪区域,从而制作自己想要的数据集。当然我们也可以使用其他目标检测模型达到同样的效果。大家可以选择自己熟悉的模型自行尝试。

原始图像

在这里插入图片描述

裁剪的图像输出
在这里插入图片描述

下载预训练模型

在这个任务中,我使用了一个预先训练好的Faster RCNN模型,具体来说是 **faster_rcnn_resnet50_coco_2018_01_28** ,可以在TensorFlow的Model Zoo中找到。以下是如何下载和设置它:

下载模型的步骤

  1. 访问TensorFlow Model Zoo:前往TensorFlow 1 Detection Model Zoo
  2. 查找模型:搜索 **faster_rcnn_resnet50_coco_2018_01_28**
  3. 下载模型:下载模型存档并提取它。在里面,您会找到包含预训练模型的saved_model目录。

在Python环境中设置

下载后,确保saved_model目录与脚本位于同一文件夹中,现在你可以把它加载到Python中。

完整代码:自动目标检测和裁剪

下面是我使用的Python脚本,并对每个部分功能进行了详细解释:

import tensorflow as tf
import numpy as np
import cv2
from PIL import Image
from matplotlib import pyplot as plt
from random import randint
import time

# Load the pre-trained model
model = tf.saved_model.load("faster_rcnn_resnet50_coco_2018_01_28/saved_model")
detect_fn = model.signatures['serving_default']

# Load the image
image = Image.open('bs2.webp')
image_np = np.array(image)

# Prepare the image as input to the model
input_tensor = tf.convert_to_tensor(np.expand_dims(image_np, 0), dtype=tf.uint8)

startTime = time.time()

# Run the object detection
detection = detect_fn(input_tensor)

# Parse the detection results
boxes = detection['detection_boxes'].numpy()
classes = detection['detection_classes'].numpy().astype(int)
scores = detection['detection_scores'].numpy()

endTime = time.time()
timeDifference = endTime - startTime
print(f'Algorithm Running Time: {timeDifference:.2f} seconds')

for i in range(classes.shape[1]):
    class_id = int(classes[0, i])
    score = scores[0, i]

    # Only draw boxes with a confidence score greater than a threshold
    if score > 0.5:  # Adjust threshold as needed
        h, w, _ = image_np.shape
        ymin, xmin, ymax, xmax = boxes[0, i]

        # Convert normalized coordinates to image coordinates
        xmin = int(xmin * w)
        xmax = int(xmax * w)
        ymin = int(ymin * h)
        ymax = int(ymax * h)

        random_color = (randint(0, 256), randint(0, 256), randint(0, 256))

        # Draw bounding box and label on the image
        cv2.rectangle(image_np, (xmin, ymin), (xmax, ymax), random_color, 2)
        cv2.putText(image_np, f'Class {class_id} {score:.2f}', (xmin, ymin - 10),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.5, random_color, 2)

        # Crop the detected object
        cropped_image = image_np[ymin:ymax, xmin:xmax]

        # Save the cropped image
        cropped_image_filename = f'cropped_object_{i}.jpg'
        cv2.imwrite(cropped_image_filename, cropped_image)
        print(f'Saved cropped image: {cropped_image_filename}')

# Display the result
plt.imshow(image_np)
plt.axis('off')
plt.show()

代码详解

1.加载预训练模型

我们使用TensorFlow的**saved_model.load()**来加载RCNN模型。detect_fn函数是模型的默认签名,用于对输入图像进行预测。

2.准备图像

使用PillowImage.open())加载输入图像,并将其转换为NumPy数组进行处理。然后我们使用np.expand_dims()扩展它的维度,以匹配输入张量的预期形状。

3.运行检测

图像通过检测函数(detect_fn),该函数输出:

  • **detection_boxes**:检测到的边界框的坐标。
  • **detection_classes**:检测到的对象的类ID。
  • **detection_scores**:检测的置信度分数。

4.解析结果和绘制边界框

对于每次检测:

  • 我们提取边界框坐标并缩放它们以匹配原始图像大小。
  • 如果检测分数大于0.5,则使用OpenCV绘制边界框。
  • 将保存检测到的对象的裁剪版本以供以后使用。

5.保存裁剪的图像

裁剪后的部分以cropped_object_0.jpgcropped_object_1.jpg等文件名保存,使得易于查看并将它们用于进一步处理。

结果

该脚本识别图像中的目标(或RCNN模型指定的任何对象),裁剪检测到的部分并保存它们。对于可视化,使用Matplotlib显示带注释的图像。

优点

  • 效率:高效的视线图片的批量检测与裁剪。
  • 灵活性:您可以根据需要调整置信度阈值和检测逻辑。
  • 可扩展性:适用于多个图像,使数据集创建变得轻而易举。

在这里插入图片描述

好了,这篇文章就介绍到这里,喜欢的小伙伴感谢给点个赞和关注,更多精彩内容持续更新~~
关于本篇文章大家有任何建议或意见,欢迎在评论区留言交流!

上一篇:Jmeter 接口测试常见场景


下一篇:java中的运算符