这篇是记录用maskrcnn训练自己的数据集,防止以后忘记.
主要参考:
1.https://blog.csdn.net/qq_29462849/article/details/81037343
2.https://github.com/matterport/Mask_RCNN
这个工作需求是识别公园道路和公园的一些立面物体,就是防止公园的无人清扫车碰撞(老板一定要用视觉解决...不要用超声波传感器),因为要识别路面,所以想到用语义分割来做,之前也用过maskrcnn来检测行人,效果很好,所以这次把公园采集到的数据来自己标注,然后训练,标注语义分割数据真是一场灾难!!!!!!!!!下面是我遇到的一些报错,记录一下,参考1其实已经写的很清楚了.但是还是遇到一些问题.
环境Ubuntu16
先下载git上的源码.配置的问题需要自己解决,Ubuntu上不难.
然后在Mask_RCNN/samples/shapes的文件夹下.自己建一个train.py,其实和/data/Mask_RCNN/samples/shapes/train_shapes.ipynb文件基本一样的,只是用惯了pycharm,回不了头用jupyter notebook了,哈哈哈哈.下面是我的shapes的文件夹模样.
主要是train.py train_data文件夹 还有16位图像转8位.py,这几个比较重要,其他的源码都有.
train_data文件夹下是这样的
我先解释数据准备.首先train_data文件夹下有5个文件夹,我是用labelme标注的.首先pic就是就是原图.
然后是json文件夹,这些就是labelme产生的json
然后是labelme_json文件夹,这些就是labelme_json_to_dataset 把json转换成文件夹,当然网上有批量处理的方法,大家可以去参考一些,我的是建立了一个sh命令.我无法修改labelme里面的py文件,可能是因为我的Ubuntu还是有点菜鸡.文件夹里就是基本的5个文件img.png info.yaml label.png label_names.txt label_viz.png
#!/bin/bash
dir=`ls /data/self-sweeper/7.23/json1/` #定义遍历的目录
path="/data/self-sweeper/7.23/json1/" #名字与上一行相同
for i in $dir
do
labelme_json_to_dataset ${path}$i
#echo $i
done
最后在train_data里还有2个文件夹,就是16bit和cv2_mask,其实这两个文件夹是一个东西,但是参考1的博主说由于labelme生成的掩码标签 label.png为16位存储,opencv默认读取8位,需要将16位转8位,可通过C++程序转化,代码请参考这篇博文:http://blog.csdn.net/l297969586/article/details/79154150 ,所以16bit文件夹里的就是每个labelme_json文件夹中的json文件夹下的label.png,但是要记得好命名。我先给大家看我的16bit文件夹下的内容
大家可以看到,我的16bit文件夹下的就是每个label.png,这个名字要和上面的都对应好。然后我们需要把16bit转化为8bit,下面是我自己写的代码,很简单,中心思想就一条。
import os
from PIL import Image
import numpy as np
imgs_path = '/data/Mask_RCNN/samples/shapes/train_data/16bit/'
res_path = '/data/Mask_RCNN/samples/shapes/train_data/cv2_mask/'
imgs = sorted(os.listdir(imgs_path))
for img in imgs:
test = Image.open(imgs_path &#