目前图像识别领域,两步法最炙手可热的图像处理模型就是Mask RCNN了,应用该模型可以在较为广泛的工业领域实现图像化检测。近期我们实现了该模型在金属加工产品线上的质量检测识别,取得了较好的效果。
Github原代码地址:
注意该原代码没有预训练的模型,如果需要的话,预训练模型在这里:
关于该代码部署的环境:经过实际应用发现,如果没有GPU、或者其他高性能服务器的话,至少也要达到如下标准:CentOS 7 建议安装 anacoda环境,便于管理。64G内存,64 core vCPU,硬盘空间不能太小,因为每轮Epoch训练都会产生新的模型,单个模型大小256M左右,多轮调试、训练会占用大量硬盘空间。
下面先说总体步骤:
打开冰箱,放入大象,关上冰箱 。。。
正确的步骤是 :
1 调试并修改代码;2 制作训练、测试、验证数据集;3 开始训练,4 检验模型,5 应用模型。
一步一步说
先说环境,如果你要在自己的笔记本上跑跑代码,看看效果,反而麻烦一些。主要在于里面的pycocotools是需要VC2005的,安装起来很麻烦。如果是在服务器,linux下安装反而没有什么问题。按照代码说明的那些包是不太够的。
我的安装环境如下:Python3.5 tensorflow1.14
_libgcc_mutex 0.1 main
absl-py 0.8.1 pypi_0 pypi
alabaster 0.7.12 pypi_0 pypi
astor 0.8.0 pypi_0 pypi
attrs 19.3.0 pypi_0 pypi
babel 2.7.0 pypi_0 pypi
backcall 0.1.0 pypi_0 pypi
bleach 3.1.0 pypi_0 pypi
ca-certificates 2019.10.16 0
certifi 2018.8.24 py35_1
chardet 3.0.4 pypi_0 pypi
cycler 0.10.0 pypi_0 pypi
cython 0.29.13 pypi_0 pypi
decorator 4.4.1 pypi_0 pypi
defusedxml 0.6.0 pypi_0 pypi
docutils 0.15.2 pypi_0 pypi
entrypoints 0.3 pypi_0 pypi
gast 0.3.2 pypi_0 pypi
google-pasta 0.1.7 pypi_0 pypi
grpcio 1.24.3 pypi_0 pypi
h5py 2.10.0 pypi_0 pypi
idna 2.8 pypi_0 pypi
imageio 2.6.1 pypi_0 pypi
imagesize 1.1.0 pypi_0 pypi
imgaug 0.3.0 pypi_0 pypi
importlib-metadata 0.23 pypi_0 pypi
ipykernel 5.1.3 pypi_0 pypi
ipyparallel 6.2.4 pypi_0 pypi
ipython 7.9.0 pypi_0 pypi
ipython-genutils 0.2.0 pypi_0 pypi
ipywidgets 7.5.1 pypi_0 pypi
jedi 0.15.1 pypi_0 pypi
jinja2 2.10.3 pypi_0 pypi
jsonschema 3.1.1 pypi_0 pypi
jupyter-client 5.3.4 pypi_0 pypi
jupyter-core 4.6.1 pypi_0 pypi
jupyter-tensorboard 0.1.10 pypi_0 pypi
keras 2.2.2 pypi_0 pypi
keras-applications 1.0.4 pypi_0 pypi
keras-preprocessing 1.0.2 pypi_0 pypi
kiwisolver 1.1.0 pypi_0 pypi
libedit 3.1.20181209 hc058e9b_0
libffi 3.2.1 hd88cf55_4
libgcc-ng 9.1.0 hdf63c60_0
libstdcxx-ng 9.1.0 hdf63c60_0
markdown 3.1.1 pypi_0 pypi
markupsafe 1.1.1 pypi_0 pypi
matplotlib 3.0.3 pypi_0 pypi
mistune 0.8.4 pypi_0 pypi
more-itertools 7.2.0 pypi_0 pypi
nbconvert 5.6.1 pypi_0 pypi
nbformat 4.4.0 pypi_0 pypi
ncurses 6.1 he6710b0_1
networkx 2.4 pypi_0 pypi
nose 1.3.7 pypi_0 pypi
notebook 6.0.1 pypi_0 pypi
numpy 1.17.3 pypi_0 pypi
opencv-python 4.1.1.26 pypi_0 pypi
opencv-python-headless 4.1.1.26 pypi_0 pypi
openssl 1.0.2t h7b6447c_1
packaging 19.2 pypi_0 pypi
pandocfilters 1.4.2 pypi_0 pypi
parso 0.5.1 pypi_0 pypi
pexpect 4.7.0 pypi_0 pypi
pickleshare 0.7.5 pypi_0 pypi
pillow 6.2.1 pypi_0 pypi
pip 19.3.1 pypi_0 pypi
prometheus-client 0.7.1 pypi_0 pypi
prompt-toolkit 2.0.10 pypi_0 pypi
protobuf 3.10.0 pypi_0 pypi
ptyprocess 0.6.0 pypi_0 pypi
pycocotools 2.0.0 pypi_0 pypi
pygments 2.4.2 pypi_0 pypi
pyparsing 2.4.2 pypi_0 pypi
pyrsistent 0.15.5 pypi_0 pypi
python 3.5.6 hc3d631a_0
python-dateutil 2.8.0 pypi_0 pypi
pytz 2019.3 pypi_0 pypi
pywavelets 1.1.1 pypi_0 pypi
pyyaml 5.1.2 pypi_0 pypi
pyzmq 18.1.0 pypi_0 pypi
qtconsole 4.5.5 pypi_0 pypi
readline 7.0 h7b6447c_5
requests 2.22.0 pypi_0 pypi
scikit-image 0.15.0 pypi_0 pypi
scipy 1.3.1 pypi_0 pypi
send2trash 1.5.0 pypi_0 pypi
setuptools 40.2.0 py35_0
shapely 1.6.4.post2 pypi_0 pypi
six 1.12.0 pypi_0 pypi
snowballstemmer 2.0.0 pypi_0 pypi
sphinx 2.2.1 pypi_0 pypi
sphinxcontrib-applehelp 1.0.1 pypi_0 pypi
sphinxcontrib-devhelp 1.0.1 pypi_0 pypi
sphinxcontrib-htmlhelp 1.0.2 pypi_0 pypi
sphinxcontrib-jsmath 1.0.1 pypi_0 pypi
sphinxcontrib-qthelp 1.0.2 pypi_0 pypi
sphinxcontrib-serializinghtml 1.1.3 pypi_0 pypi
sqlite 3.30.1 h7b6447c_0
tensorboard 1.14.0 pypi_0 pypi
tensorflow 1.14.0 pypi_0 pypi
tensorflow-estimator 1.14.0 pypi_0 pypi
termcolor 1.1.0 pypi_0 pypi
terminado 0.8.2 pypi_0 pypi
testpath 0.4.2 pypi_0 pypi
tk 8.6.8 hbc83047_0
tornado 6.0.3 pypi_0 pypi
traitlets 4.3.3 pypi_0 pypi
urllib3 1.25.6 pypi_0 pypi
wcwidth 0.1.7 pypi_0 pypi
webencodings 0.5.1 pypi_0 pypi
werkzeug 0.16.0 pypi_0 pypi
wheel 0.31.1 py35_0
widgetsnbextension 3.5.1 pypi_0 pypi
wrapt 1.11.2 pypi_0 pypi
xz 5.2.4 h14c3975_4
zipp 0.6.0 pypi_0 pypi
zlib 1.2.11 h7b6447c_3
顺便说一下:为了后期的评估方便,我同时开启了服务器端jupyter和基于jupyter的tensorboard。实现方法就不赘述了,网上一搜一大把。建议大家也要开启,方便模型后期的调试和评估。另外虽然装了anacoda,但是装包的时候能用pip就用pip,混装会出现很多莫名其妙的冲突,教训深刻。
装好了之后,可以登陆jupyter notebook上看看demo,如果能跑完到演示图片识别,说明程序已经没问题,可以开始改了!
原代码是在高性能、多gpu设备上实现的,我没有那些好设备,所以必须修改,关键调整是
如果没有GPU,必须要将该参数改为1,即使拥有GPU,增加IMAGES_PER_GPU数值也要小心,很容易在训练模型的时候跑死机或者程序闪退。
看注释就明白原作者还是很土豪的。
接下来就是理解原代码的结构并且改造属于自己的模型了。
核心代码放到mrcnn文件夹里,其实也就用这里面即可。samples文件夹里的例子可以作为自己代码修改的基础和参考,也很有用
简单的说config.py主要进行基础参数的定义,如果你选择了 from mrcnn.config import Config,然后在自己的class中集成绝大部分的config定义,那么一定要看看这里的设置是不是真的属于你需要的。上述的 IMAGES_PER_GPU,还有NUM_CLASSES STEPS_PER_EPOCH 等等,都要注意匹配。
model.py是这个算法的精髓部分,基于tensorflow和keras实现训练和识别,算法理解将在后面详述。
utils.py实现了图像的准确评估,比如mAP IOU的计算等等,非常方便。
visualize.py 实现了图像的检测的可视化展现,也是非常有效的工具。
parallel_model.py 多GPU专用(土豪专用)它把模型做多个copy到每一个GPU里,然后把输入数据也切片到每一个模型copy里,当然最终输出会重新合并,并且基于合并后的输出给出loss值。