该项目为涉案人员物品保管制度下的子项目,利用目标检测识别登记常见嫌疑人物品以加快事件处理。其使用3900+张不同条件拍摄的qian包等5类物品数据,按VOC格式标注,经处理后用PaddleX训练YOLOv3模型,导出后部署至服务器,前端Vue、后端Flask,可进行物品检测预测。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜
项目介绍
在我国的涉案人员物品保管制度 中明确规定:对涉案人员物品进行登记保存、扣押时,需经单位负责人批准,依法填写涉案人员物品登记保存、扣押决定书和涉案人员物品清单后,方可执行。那么,利用目标检测对于常见的嫌疑人物品进行识别登记,是不是可以加快事件处理速度呢,因此该项目发展成为这一整个项目的子项目,并将此子项目部署开源出来。
项目已部署至服务器,可以进行访问:http://ai.sqdxwz.com/
部分时候过载严重,如果无法返回结果请刷新重试或者换个时间使用~
项目实现
数据集介绍
数据量:3900+
数据种类:qian包,水杯,钥匙,手机,包包
所有数据均为使用不同型号,不同像素,不同角度,不同环境进行拍摄的数据图。数据拍摄包括单个物品,多个物品混合拍摄
立即学习
“
前端免费学习笔记(深入)
”;
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
下载
训练准备
In [ ]
本项目使用的静物检测据集已经按VOC格式进行标注,数据集按照如下方式进行组织:
In [ ]
In [ ]
In [ ]
使用paddlex命令即可将数据集随机划分成70%训练集,20%验证集和10%测试集:
划分好的数据集会额外生成labels.txt, train_list.txt, val_list.txt, test_list.txt四个文件,之后可直接进行训练。
模型训练
In [ ]
In [ ]
In [ ]
In [ ]
In [15]
模型导出
模型训练后保存在output文件夹,如果要使用PaddleInference进行部署需要导出成静态图的模型,运行如下命令,会自动在output文件夹下创建一个inference_model的文件夹,用来存放导出后的模型。
In [ ]
模型预测
In [ ]
In [ ]
服务器部署
前端采用Vue,后端使用Flask:https://
git
hub.com/Sharpiless/Yolov5-Flask-VUE
修改Sharpiless后端的app.py的后端处理代码即可
搭配好服务器的Paddle环境;
百度
个【Python项目部署到服务器上】的相关教程,完成所有部署;
部署预测结果
!pip install paddlex==2.0rc -qDataset/ # 目标检测数据集根目录
|--Annotations/ # 标注文件所在目录
| |--PartA_00000.xml
| |--PartB_00000.xml
| |--...
| |--...
|--JPEGImages/ # 原图文件所在目录
| |--PartA_00000.jpg
| |--PartB_00000.jpg
| |--...
| |--...
|# 解压数据集文件夹中!unzip -d ./ data/data96807/DatasetId_190936_1624526988.zip# 清理一下jpeg和xml不匹配问题import os,shutil
jpeg = 'MyDataset/JPEGImages'jpeg_list = os.listdir(jpeg)
anno = 'MyDataset/Annotations'anno_list = os.listdir(anno)for pic in jpeg_list:
name = pic.split('.')[0]
anno_name = name + '.xml'
#print(anno_name)
if anno_name not in anno_list:
os.remove(os.path.join(jpeg,pic))# 划分数据集!paddlex --split_dataset --format VOC --dataset_dir MyDataset --val_value 0.2 --test_value 0.12021-10-25 21:02:25 [INFO] Dataset split starts...
2021-10-25 21:02:25 [INFO] Dataset split done.
2021-10-25 21:02:25 [INFO] Train samples: 714
2021-10-25 21:02:25 [INFO] Eval samples: 204
2021-10-25 21:02:25 [INFO] Test samples: 102
2021-10-25 21:02:25 [INFO] Split files saved in MyDatasetimport paddlex as pdxfrom paddlex import transformstrain_transforms = transforms.Compose([
transforms.RandomCrop(crop_size=224),
transforms.RandomHorizontalFlip(),
transforms.Normalize()
])
eval_transforms = transforms.Compose([
transforms.ResizeByShort(short_size=256),
transforms.CenterCrop(crop_size=224),
transforms.Normalize()
])# 定义训练和验证所用的数据集# API说明:https://github.com/PaddlePaddle/PaddleX/blob/release/2.0-rc/paddlex/cv/datasets/voc.py#L29train_dataset = pdx.datasets.VOCDetection(
data_dir='MyDataset',
file_list='MyDataset/train_list.txt',
label_list='MyDataset/labels.txt',
transforms=train_transforms,
shuffle=True)
eval_dataset = pdx.datasets.VOCDetection(
data_dir='MyDataset',
file_list='MyDataset/val_list.txt',
label_list='MyDataset/labels.txt',
transforms=eval_transforms,
shuffle=False)2021-10-25 21:07:21 [INFO] Starting to read file list from dataset...
2021-10-25 21:07:22 [INFO] 714 samples in file MyDataset/train_list.txt
creating index...
index created!
2021-10-25 21:07:22 [INFO] Starting to read file list from dataset...
2021-10-25 21:07:22 [INFO] 204 samples in file MyDataset/val_list.txt
creating index...
index created!# 初始化模型,并进行训练# 可使用VisualDL查看训练指标,参考https://github.com/PaddlePaddle/PaddleX/tree/release/2.0-rc/tutorials/train#visualdl可视化训练指标num_classes = len(train_dataset.labels)
model = pdx.models.YOLOv3(num_classes=num_classes, backbone='MobileNetV3_ssld')# API说明:https://github.com/PaddlePaddle/PaddleX/blob/release/2.0-rc/paddlex/cv/models/detector.py#L155# 各参数介绍与调整说明:https://paddlex.readthedocs.io/zh_CN/develop/appendix/parameters.htmlmodel.train(
num_epochs=300,
train_dataset=train_dataset,
train_batch_size=8,
eval_dataset=eval_dataset,
learning_rate=0.001 / 8,
warmup_steps=1000,
warmup_start_lr=0.0,
save_interval_epochs=20,
lr_decay_epochs=[216, 243, 275],
save_dir='output/yolov3_mobilenet')!paddlex --export_inference --model_dir=output/yolov3_mobilenet/best_model --save_dir=output/inference_modelimport globimport numpy as npimport threadingimport timeimport randomimport osimport base64import cv2import jsonimport paddlex as pdx# 可以修改为自己图片路径image_name = 'MyDataset/JPEGImages/PartB_00234.jpg' model = pdx.load_model('output/yolov3_mobilenet/best_model')
img = cv2.imread(image_name)
result = model.predict(img)
keep_results = []
areas = []
f = open('result.txt','a')
count = 0for dt in np.array(result):
cname, bbox, score = dt['category'], dt['bbox'], dt['score'] if score < 0.5: continue
keep_results.append(dt)
count+=1
f.write(str(dt)+'\n')
f.write('\n')
areas.append(bbox[2] * bbox[3])
areas = np.asarray(areas)
sorted_idxs = np.argsort(-areas).tolist()
keep_results = [keep_results[k] for k in sorted_idxs] if len(keep_results) > 0 else []print(keep_results)print(count)
f.write("the total number is :"+str(int(count)))
f.close()pdx.visualize_detection(image_name, result, threshold=0.5, save_dir='./output/yolov3_mobilenet')