写在前面
和Mask_RCNN入门(一)—— 跑通代码一样,本文将列出自己参考的教程,重点介绍注意点和踩的坑。
本文主要参考教程:Mask R-CNN tensorflow 训练自己的数据
废话不多说,按照教程开始实践
step1:使用labelme标注好图片
关于labelme的安装和使用,这里不再赘述,请参考:图片标注工具Labelme的安装及使用方法,当然有几个小建议:
- 建议单独创建一个conda环境,或者conda的base环境,用于labelme包的安装
因为这样可以所有的conda环境都可以使用此环境下的labelme,不用每个环境都装一遍,我是单独创建了一个名为label的conda环境用于labelme包的安装。 - 建议将labelme的启动写成一个bat脚本
这样免得每次启动labelme都要conda activate相应环境,激活,比较麻烦,我的bat脚本内容如下:
@echo.
@echo ***进入conda命令行,并直接切换到labelme环境***
@echo.
@echo.
@echo.
CALL C:\ProgramData\Anaconda3\Scripts\activate.bat C:\ProgramData\Anaconda3\envs\labelme
@echo.
@echo.
@echo.
@echo ***启动labelme***
@echo.
@echo.
@echo.
::不知道为啥,直接labelme就会陷入死循环,换成labelme.exe
labelme.exe
这样每次双击bat即可启动labelme:
接下来就是使用labelme标注好要训练的图片,原始图片和json单独放置,这里不再赘述:
step2:批量转化json文件
单个json文件的转化,参考:labelme安装与使用,但这里坑:
- 坑1:Anaconda/3envs/labelme/Scripts文件夹下没有label_json_to_dataset.exe
只有labelme_json_to_dataset.exe,所以转化单个json文件的命令应该为:
C:/ProgramData/Anaconda3/3envs/labelme/Scripts/labelme_json_to_dataset xxx.json
(labelme_json_to_dataset和json文件路径根据自己机器位置修改)
- 坑2:无法生成yaml
应该是版本原因,我是用的labelme_json_to_dataset.exe转化后的数据中没有info.yaml,经过查资料labelme:缺少生成"info.yaml"文件知修改labelme/cli下的json_to_dataset.py文件(这是labelme_json_to_dataset.exe的源文件)在我的电脑位置为:
C:\ProgramData\Anaconda3\envs\labelme\Lib\site-packages\labelme\cli
按照资料中修改,之后就可以正常生成info.yaml
- 坑3:批量转化的代码跑不通
这里是我的批量转化的代码:
import os
path = r'C:\Users\apple\Desktop\labelme\json' # path是你存放json的路径
json_file = os.listdir(path)
for file in json_file:
os.system("C:\ProgramData\Anaconda3\envs\labelme\Scripts\labelme_json_to_dataset.exe %s" % (path + '/' + file))
其中的labelme_json_to_dataset.exe和json位置根据自己机器修改。下面是结果:
转化后的json和原json文件在一个文件夹下,单独一个xx_json文件:
step3:新建train_data
按照[教程[(https://blog.csdn.net/doudou_here/article/details/87855273)直接跟着做。
项目目录下,新建directory目录结构如下:
其中pic放入标注的原图,json放入labelme标注得到的所有json文件,labelme_json放入转化后的json文件,cv2_mask放入每个labelme_json文件下的label文件。
其中,前三个直接copy过来就可以,但cv2_mask要重新命名,翻看每个转化之后的json文件夹可以发现,里面的掩膜图片名字都为label.png:
需要将label.png命名为对应的“文件名.png”格式,建议使用代码实现,下面这是我的代码(其中的文件路径根据自己需要修改):
import os
import shutil
filename = "C:/Users/apple/Desktop/labelme/json/" # 存放json转化得到的文件夹名称,需要保证没有隐藏的文件夹
fileList = os.listdir(filename)
"""
抽取json转化得到的5个文件中的label.png,并重新命名
"""
for i in range(len(fileList)):
path = filename + fileList[i];
# 如果不是文件夹,跳过
if os.path.isfile(path):
continue
no = fileList[i][:-5] # 从文件夹上取出文件名
mask_source = path + "/label.png"
mask_target = "train_data/cv2_mask/{}.png".format(no) # 命名为“文件名.png”
shutil.copy(mask_source, mask_target) # 利用shutil直接copy过去
注意,很多教程都会提示label.png是16位的,而训练(要用cv2处理)需要使用8位的,所以需要对label.png进行转化才能使用,但是我参考的Mask R-CNN tensorflow 训练自己的数据说得很明白,labelme升级以后转化得到的label.png就是8位的,不用转换,教程也说明:打开的图片是彩色的就说明已经是8位的了,这一点我想还是做到有理有据比较好:
- 查看图片位深度
图片 —— 属性 —— 详细信息,以我的第一张图片为例,查看label.png:
很明显,就是8位的。 - 8位和16位png看起来有什么区别
为了看清楚,专门网上找了代码对上图中8位的label.png进行了转化,下面分别是8位和16位图片:
8位
16位:
step4:新建train.py
按照教程在项目目录下新建train.py,内容不再赘述,直接copy即可,经实测,修改的地方按教程来即可。
在之前创建的conda环境下,进入项目目录,直接:
python train.py
即可开始训练,不一会儿可以看到项目目录下多了logs目录:
这个h5文件就是我们下面进行预测用到的模型。
step5:新建test.py
同样在项目目录下新建test.py(教程中名字为fortest.py),内容直接copy即可,但经实测,如果只按教程中修改h5模型路径和测试图片路径,运行test.py 会报错:
这是因为就和train.py一样,在:
需要按自己训练集修改。修改后再运行,报错:
这是因为还有一处需要修改:
除了保留“BG”外,后面放上自己训练的label。运行,OK:
一些建议
- 成功跑通一个训练过程以后,以后可以直接copy项目进行其他的训练
这样后面的修改的地方很少,基本就是:
- train_data文件夹
- train.py中的NUM_CLASSES,self.add_class()和label[i].find
- test.py中的h5路径,测试图片路径,NUM_CLASSES和class_names
这样也可以使用统一的运行conda环境,labelme工具等