PaddleDetection是百度公司推出的物体检测框架。
我主要使用的是YOLOv3模型去检测物体的运行状态。判断依据是:设备处在运行状态,屏幕则一直保持亮屏状态,如果停止运行,则设备会停止处在息屏状态。
环境部署
1.硬件环境
- 笔记本电脑
- 网络摄像头-罗技c922高清1080p摄像头
2.软件环境
- python3.7
- PaddlePaddle
- PaddleDetection
数据集准备
1.采集数据
将一堆设备都放在相机可以拍照的地方,放置一些正在运行的设备和一些不运行的设备。
控制相机拍照,采集到一定规模的数据集。(设备放置的背景需要注意,如果需要分开多地部署这个监测工具,需要确保设备放置的背景是类似的,如果背景有变动,则会影响到最终的识别结局,当然也是由于我采集的数据集的量级较少,只有不到1千张图片),采集到的数据集如下图所示:
2. 数据标注
数据标注使用的开源工具:labelImg.exe
每张图片里的每个设备标注清楚运行状态,然后保存成一个xml文件。
3. 数据整理
PaddleDetection/dataset文件夹里面创建新的文件夹存放数据。
dataset
Annotations #存放xml文件
ImageSets
Main
label_list.txt
train.txt
val.txt
JPEGImages #存放png\bmp等图片
label_list.txt 存放label清单
train.txt
val.txt
train.txt生成方式
train_precent = 0.8
xml = r'D:\work\PaddleDetection\dataset\detection\Annotations'
save = r'D:\work\PaddleDetection\dataset\detection\JPEGImages'
total_xml = os.listdir(xml)
len_length = len(total_xml)
num = list(range(len(total_xml)))
tr = int(len_length * train_precent)
train = sample(num, tr)
ftrain = open('train.txt', 'w')
ftest = open('test.txt', 'w')
for i in num:
name = total_xml[i][:-4]+'\n'
if i in train:
ftrain.write(name)
else:
ftest.write(name)
ftest.close()
ftrain.close()
最终需要的train.txt和val.txt生成方式
devkit_dir = './'
def get_dir(devkit_dir, type):
return osp.join(devkit_dir, type)
def walk_dir(devkit_dir):
filelist_dir = get_dir(devkit_dir, 'ImageSets/Main')
annotation_dir = get_dir(devkit_dir, 'Annotations')
img_dir = get_dir(devkit_dir, 'JPEGImages')
trainval_list = []
test_list = []
added = set()
for _, _, files in os.walk(filelist_dir):
for fname in files:
img_ann_list = []
if re.match(r'train\.txt', fname):
img_ann_list = trainval_list
elif re.match('val\.txt', fname):
img_ann_list = test_list
else:
continue
fpath = osp.join(filelist_dir, fname)
for line in open(fpath):
name_prefix = line.strip().split()[0]
if name_prefix in added:
continue
ann_path = osp.join(annotation_dir, name_prefix + '.xml')
img_path = osp.join(img_dir, name_prefix + '.bmp')
assert os.path.isfile(ann_path), 'file %s not found.' % ann_path
assert os.path.isfile(img_path), 'file %s not found.' % img_path
img_ann_list.append((img_path, ann_path))
return trainval_list, test_list
def prepare_filelist(devkit_dir, output_dir):
trainval_list = []
test_list = []
trainval, test = walk_dir(devkit_dir)
trainval_list.extend(trainval)
test_list.extend(test)
random.shuffle(trainval_list)
with open(osp.join(output_dir, 'train.txt'), 'w') as ftrainval:
for item in trainval_list:
ftrainval.write(item[0] + ' ' + item[1] + '\n')
with open(osp.join(output_dir, 'val.txt'), 'w') as ftest:
for item in test_list:
ftest.write(item[0] + ' ' + item[1] + '\n')
if __name__ == '__main__':
prepare_filelist(devkit_dir, '.')
4. 选择模型,进行训练
我是选用的yolov3模型, 修改yolov3_mobilenet_v3_large_270e_voc.yml 配置文档。目前paddledection配置已经确定好,只要训练人修改几处地方即可开始训练。
要修改的主要地方主要包括:
datasets/voc.yml 如图所示为主要的修改点
5.训练
训练命令:python -u tools/train.py -c configs/yolov3/yolov3_mobilenet_v3_large_270e_voc.yml -o use_gpu=false --use_vdl=true --vdl_log_dir=vdl_dir/scalar --eval
评估命令:python deploy/python/infer.py --model_dir=inference_model/yolov3_mobilenet_v3_large_270e_voc --use_gpu=False --image_file=D:\work\PaddleDetection\output\闹钟28.bmp
导出模型命令:python -u tools/export_model.py -c configs/yolov3/yolov3_mobilenet_v3_large_270e_voc.yml --output_dir=./inference_model -o weights=output/weights/model_final.pdparams -o use_gpu=false
6.模型上线
工具界面是用pyqt写的界面。
功能主要是每分钟拍一张图,监测相机下的设备是否在运行,如果不运行,通过飞书机器人通知相应的人员。