-
认识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对获取的图片数据进行标注:
将标注的数据集划分为训练集和测试集
划分好的数据集的目录示例。
在训练之前可视化示例图像,以确认是否正确生成了蒙版和边界框。
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文件将位于根目录中,作为训练和测试文件夹。现在,新文件夹目录将如下所示:
- 训练
使用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
显示boxes的结果展示:show_bboxes = True
pig_text包含了分割后的所有信息,包括:
- ‘class_ids’:物体类别
- ‘masks’:物体蒙版位置信息
- ‘rois’:框的位置信息
- ‘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)