利用Piexllib模型库做猪只图像分割

  • 认识pixellib库
    PixelLib是为使用几行代码执行图像和视频分割而创建的库。它是一个灵活的库,可轻松将图像和视频分割集成到软件解决方案中。相当于封装好的工具库,目前集成了mask rcnn、Pascalvoc模型,可用于图像、视频的语义分割和图像分割。官方技术指南网址:https://pixellib.readthedocs.io/en/latest/index.html#

  • 准备训练数据集
    使用opencv获取原始数据集:每隔250帧截取视频中的图片保留至本地。

import cv2
import matplotlib.pyplot as plt

camp = cv2.VideoCapture('Video 485.mp4')
i = 1
c=1
framerate = 250
while True:
    ret,frame = camp.read()
    if ret:
        if (c%framerate==0):
            cv2.imwrite('./1-2-2/'+'485'+str(i)+'.jpg',frame)
    c +=1
    i +=1

使用labelme对获取的图片数据进行标注:
利用Piexllib模型库做猪只图像分割
将标注的数据集划分为训练集和测试集
划分好的数据集的目录示例。
利用Piexllib模型库做猪只图像分割
在训练之前可视化示例图像,以确认是否正确生成了蒙版和边界框。

import pixellib
from pixellib.custom_train import instance_custom_training

vis_img = instance_custom_training()
vis_img.load_dataset("Nature")
vis_img.visualize_sample()

使用load_dataset函数加载了数据集。PixelLib要求多边形注释采用可可格式,当调用load_data函数时,train和test文件夹中的各个json文件将分别转换为单个train.json和test.json。训练和测试json文件将位于根目录中,作为训练和测试文件夹。现在,新文件夹目录将如下所示:
利用Piexllib模型库做猪只图像分割

  • 训练
    使用resnet101作为特征提取的基础模型,并使用预训练好的模型作为迁移学习前的模型。在此处下载:mask_rcnn_coco.h5
import pixellib
from pixellib.custom_train import instance_custom_training

train_maskrcnn = instance_custom_training()
train_maskrcnn.modelConfig(network_backbone = "resnet101", num_classes= 1, batch_size = 4)
train_maskrcnn.load_pretrained_model("/content/drive/MyDrive/piexllib/mask_rcnn_coco.h5")
train_maskrcnn.load_dataset("/content/drive/MyDrive/piexllib/Nature")
train_maskrcnn.train_model(num_epochs = 3, augmentation=True,  path_trained_models = "mask_rcnn_models")

**path_trained_models:**这是在训练期间保存训练后的模型的路径。保存验证损失最小的模型。
由于使用了预训练模型,经过测试少量的训练世代即可获取较好的结果。

  • 测试
import pixellib
from pixellib.instance import custom_segmentation

test_video = custom_segmentation()
test_video.inferConfig(num_classes=1, class_names=["BG","pig"])
test_video.load_model("/content/drive/MyDrive/piexllib/mask_rcnn_model.h5")
pig_text=test_video.process_video("/content/drive/MyDrive/piexllib/1-1.mp4", show_bboxes = False,  output_video_name="/content/drive/MyDrive/piexllib/1-1_cust.mp4", frames_per_second=15)

class_names:这是一个列表,其中包含训练模型的类的名称。pig类ID为1“ BG”,它是指图像的背景,它是第一个类,必须沿类名可用。

未显示boxes的结果展示;show_bboxes = False

利用Piexllib模型库做猪只图像分割
显示boxes的结果展示:show_bboxes = True
利用Piexllib模型库做猪只图像分割
pig_text包含了分割后的所有信息,包括:

  1. ‘class_ids’:物体类别
  2. ‘masks’:物体蒙版位置信息
  3. ‘rois’:框的位置信息
  4. ‘scores’:物体识别所属概率

获取猪只的数量:设定标准获取识别概率在0.95以上的才认定为猪。

pig_num = 0
for i in pig_text[0]['socres']:
	if i > 0.95:
		pig_num +=1
print(pig_num)

调用摄像头

import pixellib
from pixellib.instance import custom_segmentation
import cv2


capture = cv2.VideoCapture(0)

segment_camera = custom_segmentation()
segment_camera.inferConfig(num_classes=1, class_names=["BG", "pig"])
segment_camera.load_model("/content/drive/MyDrive/piexllib/mask_rcnn_model.h5")
segment_camera.process_camera(capture, frames_per_second= 10, output_video_name="output_video.mp4", show_frames= True,
frame_name= "frame", check_fps = True)
上一篇:CMake命令之add_custom_comand 和 add_custom_target


下一篇:基于yolov3和pythorch框架的火焰识别检测算法