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()
本文暂时没有评论,来添加一个吧(●'◡'●)