这个是本人的第一篇博文(虽然之前写过一篇,但是发现代码有问题,又删了。。)
首先要感谢Bubbliiiing博主的教学视频(B站上有)和博文,从他那里学到了很多东西,初步知道了如何使用keras框架,来改造各种网络模型为己所用。。。同时也要感谢博客园的刘建平老师,从他那里,我也学到了很多,让我初步迈入这个机器学习的行业。。
进入正题吧。这里,我将我的代码上传到了我的github上:https://github.com/lmw0320/deeplabv3-segmentation;大家可以随便下载。
说明下,本人也是小白,文章适用于刚入门的新手:
- 使用本代码前,首先要确保训练图片已经用labelme做好手工标注,并生成正确的json文件。手工标注的方法很简单,事先用pip install labelme就可以安装好labelme,然后在cmd或anaconda prompt窗口(你pip命令在什么窗口,就用相同的窗口)下输入labelme命令,直接调用labelme来进行手工标注。相关博文很多,可以随便百度
- 代码运行前,需打开train和predict的两个py文件,在代码顶部,将path更新成自身的顶层文件夹路径,方便模块导入。代码中已做好备注。
- 本代码可以只需要修改配置文件basicSet.json中的内容,如设置各个类别名称、图片大小(请务必保持每张图片大小一致)、batch-size,图片路径,json文件路径、标签文件路径等。然后点击那个deeplabv3-train-R0.py文件,一键运行即可。–注意下,路径的设置必须是双斜杠或是单反斜杠。
1) head_path代表该文件夹的顶层路径;
2)classes为类别名称,第一个background不应更改,后续的类别名称,则根据自身情况修改;
3) bone_name,代表主干网络模型,可选的有[“efficientnet_b0”, “mobilenetv2”, “resnet50”, “retinanet”, “shufflenetv2”]共5个。mobilenetv2和shufflenetv2属于轻量级模型,训练速度快,但是精度不如其他三个(也不会差很多),大家可以对比试下。
4) init_with,代表模型训练从头开始训练,还是接着之前未完的训练。可选参数为:first,last。这样确保模型训练中断后,还可以继续之前的训练。
5) area_per_pixel,是指每个像素值代表的面积大小,用于统计预测出来的类别物体的总面积。这个是我本身项目需求,如大家不需要的话,可以设置为0,或者忽略。 - 该代码,可以自动将json文件转换成label文件(只要设置好标签文件路径,代码也会自动创建好该文件夹),省去了各种找代码转换的步骤(因为发现网上很多博文,各种误导),并自动进行数据增强(数据可以实现10倍的数据量增强,其中包括了图片的翻转,高斯噪音,高斯模糊等操作)。数据增强的步骤可能会有一定耗时,增强后的图片也会自动保存在原先的图片文件夹下。(PS: 如果原始图片文件名称带有下划线,则会将该下划线自动替换成短横杆,方便数据增强的处理)。另外,说明下,数据增强后,标签图片也会一起增强的,该标签图片文件夹下会自动生成一个mark.txt的文件,用于标记是否已经增强,防止代码多次运行后的数据重复增强,请不要误删。
- 当然,如果json文件以及转换成标签文件(应确保转换的正确性,即转换后的图片应是png格式,像素值与类别号一致(像素值为1代表类别1,像素值为2则代表类别2)),也不影响使用,只要把标签图片放在自己设置的文件路径下,代码会自动判别是否存在该标签图片,如存在,则不会进行json文件转换。
- 配置文件中,还可以自行设置使用的主干网络名称(名称见下图中的红框部分)—本来还做了mobilenetv3等更多选择,后面代码没有及时更新。。名称务必保持正确,便可自动调用相应的主干网络。
- 如需要加载预训练模型,请设置好配置文件中的weights_path。同时打开代码,将其中的那句加载预训练模型代码取消注释即可(其实,如果要识别的物体与预训练模型的物体差距较大,加不加载这个文件,并不会对训练结果影响很大,也不会加速训练。。这个貌似何凯明大神之前验证过了的)
- 如果训练或预测过程中,出现报错情况,则会在顶层文件夹下自动生成相应的error文件,方便后续查找。如问题解决后,该报错文件会自动被删除。
这个是我在Bubbliiiing博主代码的基础上进行的更改,方便实际项目中的应用。当然,本人水平有限,可能还有不少不足之处,恳请各位大神多多指点!!大家如果在使用代码过程中,有什么问题,也欢迎留言,相互沟通,共同成长。