windows的keras框架,多种主干网络的deeplabV3语义分割模型

这个是本人的第一篇博文(虽然之前写过一篇,但是发现代码有问题,又删了。。)
首先要感谢Bubbliiiing博主的教学视频(B站上有)和博文,从他那里学到了很多东西,初步知道了如何使用keras框架,来改造各种网络模型为己所用。。。同时也要感谢博客园的刘建平老师,从他那里,我也学到了很多,让我初步迈入这个机器学习的行业。。
进入正题吧。这里,我将我的代码上传到了我的github上:https://github.com/lmw0320/deeplabv3-segmentation;大家可以随便下载。
说明下,本人也是小白,文章适用于刚入门的新手:

  1. 使用本代码前,首先要确保训练图片已经用labelme做好手工标注,并生成正确的json文件。手工标注的方法很简单,事先用pip install labelme就可以安装好labelme,然后在cmd或anaconda prompt窗口(你pip命令在什么窗口,就用相同的窗口)下输入labelme命令,直接调用labelme来进行手工标注。相关博文很多,可以随便百度
  2. 代码运行前,需打开train和predict的两个py文件,在代码顶部,将path更新成自身的顶层文件夹路径,方便模块导入。代码中已做好备注。
  3. 本代码可以只需要修改配置文件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,或者忽略。
  4. 该代码,可以自动将json文件转换成label文件(只要设置好标签文件路径,代码也会自动创建好该文件夹),省去了各种找代码转换的步骤(因为发现网上很多博文,各种误导),并自动进行数据增强(数据可以实现10倍的数据量增强,其中包括了图片的翻转,高斯噪音,高斯模糊等操作)。数据增强的步骤可能会有一定耗时,增强后的图片也会自动保存在原先的图片文件夹下。(PS: 如果原始图片文件名称带有下划线,则会将该下划线自动替换成短横杆,方便数据增强的处理)。另外,说明下,数据增强后,标签图片也会一起增强的,该标签图片文件夹下会自动生成一个mark.txt的文件,用于标记是否已经增强,防止代码多次运行后的数据重复增强,请不要误删。
  5. 当然,如果json文件以及转换成标签文件(应确保转换的正确性,即转换后的图片应是png格式,像素值与类别号一致(像素值为1代表类别1,像素值为2则代表类别2)),也不影响使用,只要把标签图片放在自己设置的文件路径下,代码会自动判别是否存在该标签图片,如存在,则不会进行json文件转换。
  6. 配置文件中,还可以自行设置使用的主干网络名称(名称见下图中的红框部分)—本来还做了mobilenetv3等更多选择,后面代码没有及时更新。。名称务必保持正确,便可自动调用相应的主干网络。
    主干网络的名称与这些文件名称完全一致
  7. 如需要加载预训练模型,请设置好配置文件中的weights_path。同时打开代码,将其中的那句加载预训练模型代码取消注释即可(其实,如果要识别的物体与预训练模型的物体差距较大,加不加载这个文件,并不会对训练结果影响很大,也不会加速训练。。这个貌似何凯明大神之前验证过了的)
  8. 如果训练或预测过程中,出现报错情况,则会在顶层文件夹下自动生成相应的error文件,方便后续查找。如问题解决后,该报错文件会自动被删除。
    这个是我在Bubbliiiing博主代码的基础上进行的更改,方便实际项目中的应用。当然,本人水平有限,可能还有不少不足之处,恳请各位大神多多指点!!大家如果在使用代码过程中,有什么问题,也欢迎留言,相互沟通,共同成长。
当然可以!以下是一个基于KerasDeepLabV3+语义分割三分类模型的示例代码: ```python from tensorflow.keras.models import Model from tensorflow.keras.layers import Input, Conv2D, BatchNormalization, Activation, MaxPooling2D, Conv2DTranspose, concatenate def conv_block(inputs, filters, kernel_size=3, strides=1): x = Conv2D(filters, kernel_size, strides=strides, padding='same')(inputs) x = BatchNormalization()(x) x = Activation('relu')(x) return x def encoder(inputs): # Encoder block 1 x = conv_block(inputs, 64) x = conv_block(x, 64) skip_1 = x x = MaxPooling2D(pool_size=(2, 2))(x) # Encoder block 2 x = conv_block(x, 128) x = conv_block(x, 128) skip_2 = x x = MaxPooling2D(pool_size=(2, 2))(x) # Encoder block 3 x = conv_block(x, 256) x = conv_block(x, 256) skip_3 = x x = MaxPooling2D(pool_size=(2, 2))(x) return x, skip_1, skip_2, skip_3 def decoder(inputs, skip_1, skip_2, skip_3): # Decoder block 1 x = Conv2DTranspose(128, (3, 3), strides=(2, 2), padding='same')(inputs) x = concatenate([x, skip_3]) x = conv_block(x, 256) x = conv_block(x, 256) # Decoder block 2 x = Conv2DTranspose(64, (3, 3), strides=(2, 2), padding='same')(x) x = concatenate([x, skip_2]) x = conv_block(x, 128) x = conv_block(x, 128) # Decoder block 3 x = Conv2DTranspose(32, (3, 3), strides=(2, 2), padding='same')(x) x = concatenate([x, skip_1]) x = conv_block(x, 64) x = conv_block(x, 64) return x def DeepLabV3Plus(input_shape, num_classes): inputs = Input(shape=input_shape) # Encoder encoder_output, skip_1, skip_2, skip_3 = encoder(inputs) # ASPP (Atrous Spatial Pyramid Pooling) x = conv_block(encoder_output, 256, kernel_size=1) x = conv_block(x, 256, kernel_size=3, strides=1, dilation_rate=6) x = conv_block(x, 256, kernel_size=3, strides=1, dilation_rate=12) x = conv_block(x, 256, kernel_size=3, strides=1, dilation_rate=18) x = Conv2D(256, 1)(x) x = BatchNormalization()(x) # Decoder x = decoder(x, skip_1, skip_2, skip_3) # Output outputs = Conv2D(num_classes, 1, activation='softmax')(x) model = Model(inputs=inputs, outputs=outputs) return model # 创建模型 input_shape = (256, 256, 3) # 输入图像的尺寸 num_classes = 3 # 分类的类别数量 model = DeepLabV3Plus(input_shape, num_classes) # 编译模型 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 打印模型结构 model.summary() ``` 这段代码实现了一个简单的DeepLabV3+语义分割模型,具有三个分类类别。你可以根据自己的需求修改模型的输入尺寸、分类数量以及其他超参数。记得根据你的数据集调整模型的输入尺寸和输出类别数量。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值