计算机系统应用教程网站

网站首页 > 技术文章 正文

「干货」Mask R-CNN对象检测和分割实现对无人机检测

btikc 2024-08-30 13:19:06 技术文章 17 ℃ 0 评论

Github上发布了何凯明的Mask R-CNN目标检测和对象分割Keras和TensorFlow的实现代码。

这个实现基于Python 3、Keras和TensorFlow。模型对图片中的每个对象实例生成包围框(bounding boxes)和分割掩膜(segmentation masks)。基于特征金字塔网络(FPN)和ResNet101的主干(backbone)



giuhub仓库包含以下内容:

建立在FPN和ResNet101上的Mask R-CNN源代码

MS COCO上的训练代码

MS COCO上的预训练权重

可视化每一步的训练管道(pipline)的Jupyter notebooks

用于多GPU训练的并行类

MS COCO上的指标评估

在你自己的数据集上训练的例子

源代码有注释而且设计得易于扩展。如果你在你的研究中用了这些代码,请引用本仓库。如果你从事3D视觉,你可能会觉得我们最近发布的Matterport3D数据集对你有用。



更多参考:https://github.com/matterport/Mask_RCNN

下面我们要来讲讲对无人机实现检测和分割



首先下载数据标注工具:https://github.com/abreheret/PixelAnnotationTool



该工具将分别为每个原始图像生成三个图像


IMAGENAME_color_mask.png

IMAGENAME_mask.png

IMAGENAME_watershed_mask.png


这里共有546张图片。测试数据是每秒25帧的视频文件。最后一个注释完成后,我们需要IMAGENAME_color_mask.png文件。


需要将其重命名为:


IMAGENAME.png



Dataset folder数据集文件夹

Annotations folder注释文件夹,用于存储注释后的蒙版数据

JPEGImages文件夹,其中包含原始JPG图像

Train_data_dir运行脚本以创建tf记录文件所在的目录

Label_map.pbtxt数据分类JSON描述,这里是固定翼无人机的分类


创建tf记录数据,


首先你需要下载脚本文件create_mask_rcnn_tf_record.py,下载地址是:


https://github.com/vijendra1125/Custom-Mask-RCNN-using-Tensorfow-Object-detection-API

放置在tensorflow对象检测API框架中


研究\ object_detection\ dataset_tools


在目录下,然后打开修改后的代码行的第57行,并且必须正确索引标记的每个对象掩码。


然后运行如下

您将获得生成的tf记录文件。


上述数据标注和生成过程仅适用于单个对象标记。如果有多个对象,请首先使用labelImg标记框,生成XML标签文件,然后通过PixelAnnotation生成掩码数据。


其次迁移学习


要使用迁移学习训练Mask-RCNN来实现自定义对象检测,首先需要预训练模型。这里使用的预训练模型是:


Mask_rcnn_inception_v2_coco


下载地址是:


Http://download.tensorflow.org/models/object_detection/mask_rcnn_inception_v2_coco_2018_01_28.tar.gz

修改pipeline_config文件


从object_detection \ samples \ configs文件夹中查找相应的配置文件。


mask_rcnn_inception_v2_coco.config

将所有PATH_TO_BE_CONFIGURED更改指向实际路径,然后根据需要调整以下参数。


Keep_aspect_ratio_resizer

-min_dimension

-max_dimension

改为600

-num_classes字段的值更改为1,

表示我们只有一个类别


要防止在训练期间由资源耗尽导致的内存溢出错误,请将以下属性添加到train_config块。


Batch_queue_capacity:150

Num_batch_queue_threads:8

Prefetch_queue_capacity:10

Gradient_clipping_by_norm:10.0


保存配置文件后,运行以下命令行以开始训练。



通过tensorboard查看培训

在训练结果之后,运行以下脚本以导出pb文件。

使用导出的pb文件,测试结果如下


import tensorflow as tf
import cv2 as cv
# Read the graph.
model_dir = 'D:/tensorflow/uav_train/export/frozen_inference_graph.pb'
with tf.gfile.FastGFile(model_dir, 'rb') as f:
 graph_def = tf.GraphDef()
 graph_def.ParseFromString(f.read())
cap = cv.VideoCapture("D:/images/video/uav_clip.avi")
vout = cv.VideoWriter("D:/mask_rcnn_demo.mp4", cv.VideoWriter_fourcc('D', 'I', 'V', 'X'), 25,
 (1280, 720), True)
with tf.Session() as sess:
 # Restore session
 sess.graph.as_default()
 tf.import_graph_def(graph_def, name='')
 # process video stream
 count = 0
 while True:
 ret, img = cap.read()
 if ret is not True:
 break
 rows = img.shape[0]
 cols = img.shape[1]
 inp = cv.resize(img, (600, 600))
 inp = inp[:, :, [2, 1, 0]] # BGR2RGB
 # Run the model
 out = sess.run([sess.graph.get_tensor_by_name('num_detections:0'),
 sess.graph.get_tensor_by_name('detection_scores:0'),
 sess.graph.get_tensor_by_name('detection_boxes:0'),
 sess.graph.get_tensor_by_name('detection_classes:0')],
 feed_dict={'image_tensor:0': inp.reshape(1, inp.shape[0], inp.shape[1], 3)})
 # Visualize detected bounding boxes.
 num_detections = int(out[0][0])
 for i in range(num_detections):
 classId = int(out[3][0][i])
 score = float(out[1][0][i])
 bbox = [float(v) for v in out[2][0][i]]
 if score > 0.5:
 x = bbox[1] * cols
 y = bbox[0] * rows
 right = bbox[3] * cols
 bottom = bbox[2] * rows
 cv.rectangle(img, (int(x), int(y)), (int(right), int(bottom)), (125, 255, 51), thickness=2)
 count += 1
 cv.imshow('mask_rcnn_demo', img)
 if 2500 < count < 3500:
 vout.write(img)
 c = cv.waitKey(1)
 if c == 27:
 break
# release resource
vout.release()
cap.release()

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表