最近基于一台新机器,配置了深度学习工作站,并跑起了matterport版的Detectron。中间各种坑,现在记录如下,有后来者看到诸坑,按照我说的方案解决即可。
操作系统:Ubuntu 16.04
CUDA:Version 9.0.176
CUDNN:7.0.5
Anaconda: 3.6
查看自己电脑的CUDA和CUDNN版本的命令:
cuda 版本
cat /usr/local/cuda/version.txt
cudnn 版本
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
这里主要指的是:基于Anaconda为Mask RCNN创造一个conda的虚拟环境。
方法大体可参照:
https://blog.csdn.net/wc781708249/article/details/79438972
使用Keras和Tensorflow设置和安装Mask RCNN
注意:一定要为Mask RCNN单独创造一个虚拟环境,因为后续调试要用到Pycharm,Pycharm直接加载这个环境就可以运行程序了。
为何要使用Pycharm,因为相比于matterport提供的ipynb格式的代码,这个更方便调试。
安装大体可以参考:
https://blog.csdn.net/anjingshen/article/details/80038316
Pycharm 2018.1.1 使用anaconda 3中已创建的环境
略有不同的是,最后一步,
按照里面的步骤从pycharm链接虚拟环境中的python3.exe。
(因为我用的是anaconda3.6,对应python3)
请注意上文以及下文的“大体可参考”中的“大体”表示:
我当初不是依靠着这篇博文解决的问题,但是我暂时没从历史记录里找到当时的网页,因此我临时给大家找了另一篇但是和我方法相同的博文(如果有时间我会再寻找)
这一块,网上诸多大神都搞出来了自己的版本,我也是博览群雄,然后实现出来了。因此,下面,我不打算做重复的黏贴工作,我会把我用到的链接贴过来(也是尊者每个作者的辛劳),然后把我遇到的问题写出来,你可以避免这个坑。
首先,ipynb转py这个用jupyter来另存为转化的流程也不多说了,网上都有教程。
也就是你会获得:
/Mask_RCNN/samples/demo.py
/Mask_RCNN/samples/shapes/train_shape.py
两个函数,首先要跑通这两个函数,表示matterport程序安装、运行成功。
额外说一句,稳妥起见,你可以刚装好matterport之后,直接在官方默认的jupyter notebook下测试上述两个文件,即demo.ipynb和train_shape.ipynb,如果有问题能早发现。毕竟,更好的调试环境和程序能否跑通这两个是并行而不是串行的工作。
下面是网上随便找的一张图的测试结果,以及matterport训练自己数据集(三角、圆、方块)的跑通结果图。
这个部分不多说了吧,网上教程一大把,
大体应该有这两个步骤吧,不详细说了。
pip install pyqt5
pip install labelme
安装完了,在命令行端,输入labelme可以打开该软件。
为何要改进,目的有二:
我们需要批处理而不是一个一个json文件来转化。
默认labelme程序生成的是16位mask,我们需要8位,还要转化。
这个网上版本很多,但是很多都有错误或者功能不全。
我现在选了一个最优的版本也是我用的版本,然后说怎么改。
https://blog.csdn.net/u014513323/article/details/81166997
改进json_to_dataset.py,使得能够批量处理多张图片并一步建好所需目录及相关mask文件,运行后,在json文件夹中会出现mask_png、labelme_json文件夹,mask_png中存放的是所有8位掩码文件!
按照文中所述,操作步骤有两步:
然后,是原文中有两个错误需要修改:
文中有几行包含“mkdir”和“\”符号,比如第53行:
os.mkdir(json_file + '\\' + 'labelme_json')
错误一:mkdir无法生成多级目录,需要makedirs。
错误二:“\”似乎有问题,生成了一堆文件名中含有“\”的文件,我改成了“/”
所以,包含包含“mkdir”和“\”符号的这几行都要改,类似这样:
os.makedirs(json_file + '/' + 'labelme_json')
然后就运行成功了。
自定义数据集训练和检测,基本上是参考着一篇高访问量的牛文来实现的,因此数据格式也是参考他的。
先直接列出来数据结构和文件命名,牛文自己以及其他博文语焉不详,我这里给你写清楚。
注意,以下命名并非强制,而是与牛文代码相一致,看着不爽,调通后自己改名字也可以。但是调通之前,请严格按照下图设置。
多少年不画图,画个图耗掉半条命。
牛文:
https://blog.csdn.net/l297969586/article/details/79140840
Mask RCNN训练自己的数据集
以下用牛文代指该文。
请首先参照此文添加新的DrugDataset类、修改代码。别怕麻烦。
然后再添加或者注意以下三点:
from PIL import Image
import yaml
import skimage.io
当初忘了是哪里拷贝过来的,一开始from_yaml_get_class函数有问题,就是序号和名称位置反了。又找了个正确版本改好了。总之,一定确认yaml函数如下,我拷贝过来的版本似乎漏了这句话labels = list(labels.keys())。
def from_yaml_get_class(self, image_id):
info = self.image_info[image_id]
with open(info['yaml_path']) as f:
temp = yaml.load(f.read())
labels = temp['label_names']
labels = list(labels.keys())
del labels[0]
return labels
这个版本是对的。也是现在牛文中的版本。
最后的修改后的train_shape.py的代码内容应该是:
至此,训练部分就应该可以进行了。测试部分比着葫芦画瓢改改也就行了。之前的train_shape代码最后本身就有测试代码,按照自己的数据稍作改动即可。
大家先看着,有问题我再修改补充。(待续)