PaddleDetection训练目标检测模型

2023-11-21 17:15

本文主要是介绍PaddleDetection训练目标检测模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

PaddleDetection训练目标检测模型

      • 一,安装标注软件
      • 二,数据标注和清洗
      • 三,安装PaddleDetection环境
      • 四,修改配置文件,本文选择的是 PP-PicoDet算法
      • 五,训练模型
      • 六,训练完成之后导出模型
      • 七,模型预测
      • 八,半自动标注:
      • 九,移动端部署

流程:
标注-训练-预测-标注-训练

一,安装标注软件

标注文件保存为voc格式
1,labelimg的安装(python>3.0)

pip install labelImg
labelimg

打包成单独的exe文件

先进入labelimg包的目录

C:\Users\Administrator\AppData\Local\Programs\Python\Python310\Lib\site-packages\labelImg

不知道的可以用

# 查询pip的目录
where pip
pip install pyinstaller
pyinstaller --hidden-import=pyqt5 --hidden-import=lxml -F -n "labelImg" -c labelImg.py -p ./libs -p ./

打包之后在同目录的dist下面

2,labelme的安装
标注文件保存为json格式

conda create --name=labelme python=3
conda activate labelme
pip install labelme
labelme

附带
voc转json代码:

# --- utf-8 ---# --- function: 将Labeling标注的格式转化为Labelme标注格式,并读取imageData ---import os
import glob
import shutil
import xml.etree.ElementTree as ET
import json
from base64 import b64encode
from json import dumps
def get(root, name):return root.findall(name)
# 检查读取xml文件是否出错def get_and_check(root, name, length):vars = root.findall(name)if len(vars) == 0:raise NotImplementedError('Can not fing %s in %s.' % (name, root.tag))if length > 0 and len(vars) != length:raise NotImplementedError('The size of %s is supposed to be %d, but is %d.' % (name, length, len(vars)))if length == 1:vars = vars[0]return varsdef convert(xml_file, json_file, save_dir, name, data):# 定义通过Labelme标注后生成的json文件json_dict = {"version": "3.16.2","flags": {},"shapes": [],"imagePath": "","imageData": None,"imageHeight": 0,"imageWidth": 0}# img_name = xml_file.split('.')[0]img_path = name + '.jpg'json_dict["imagePath"] = img_pathtree = ET.parse(xml_file)  # 读取xml文件root = tree.getroot()size = get_and_check(root, 'size', 1)  # 读取xml中<>size<>字段中的内容# 读取二进制图片,获得原始字节码with open(data, 'rb') as jpg_file:byte_content = jpg_file.read()# 把原始字节码编码成base64字节码base64_bytes = b64encode(byte_content)# 把base64字节码解码成utf-8格式的字符串base64_string = base64_bytes.decode('utf-8')# 用字典的形式保存数据json_dict["imageData"] = base64_string# 获取图片的长宽信息width = int(get_and_check(size, 'width', 1).text)height = int(get_and_check(size, 'height', 1).text)json_dict["imageHeight"] = heightjson_dict["imageWidth"] = width# 当标注中有多个目标时全部读取出来for obj in get(root, 'object'):# 定义图片的标注信息img_mark_inf = {"label": "", "points": [], "group_id": None, "shape_type": "rectangle", "flags": {}}category = get_and_check(obj, 'name', 1).text  # 读取当前目标的类别img_mark_inf["label"] = categorybndbox = get_and_check(obj, 'bndbox', 1)  # 获取标注宽信息xmin = float(get_and_check(bndbox, 'xmin', 1).text)ymin = float(get_and_check(bndbox, 'ymin', 1).text)xmax = float(get_and_check(bndbox, 'xmax', 1).text)ymax = float(get_and_check(bndbox, 'ymax', 1).text)img_mark_inf["points"].append([xmin, ymin])img_mark_inf["points"].append([xmax, ymax])# print(img_mark_inf["points"])json_dict["shapes"].append(img_mark_inf)# print("{}".format(json_dict))save = save_dir +'/'+ json_file  # json文件的路径地址json_fp = open(save, 'w')  #json_str = json.dumps(json_dict, indent=4)  # 缩进,不需要的可以将indent=4去掉json_fp.write(json_str)  # 保存json_fp.close()# print("{}, {}".format(width, height))def do_transformation(xml_dir, save_path):cnt = 0for fname in os.listdir(xml_dir):name = fname.split(".")[0]  # 获取图片名字path = os.path.join(xml_dir, fname)  # 文件路径save_json_name = name + '.json'data = img +'/'+ name + '.jpg'  # xml文件对应的图片路径convert(path, save_json_name, save_path, name, data)cnt += 1if __name__ == '__main__':img = r"D:\zsh\biaozhu\basketball_count\F_field\labelimg\voc\JPEGImages"    # xml对应图片文件夹xml_path = r"D:\zsh\biaozhu\basketball_count\F_field\labelimg\voc\Annotations"    # xml文件夹save_json_path = r"D:\zsh\biaozhu\basketball_count\F_field\labelimg\voc\json"    # 存放json文件夹if not os.path.exists(save_json_path):os.makedirs(save_json_path)do_transformation(xml_path, save_json_path)# xml = "2007_000039.xml"# xjson = "2007_000039.json"# convert(xml, xjson)

二,数据标注和清洗

1,用labelimg标注voc格式的标注数据
2,生成数据集,分为训练集和验证集
生成脚本:

import glob
import random
import multiprocessingdef process_file(file_name):output = glob.glob('dataset/' + dir + '/images/' + file_name + '.???')[0]output.replace('\\', '/').split('/')[-1]return './images/' + output + ' ./annotations/' + file_name + '.xml\n'dir = '6.19_gray_court_voc'
num_processes = multiprocessing.cpu_count() * 1.5  # 指定使用的进程数为 CPU 数量的两倍path = 'dataset/' + dir
tmp = []
for i in glob.glob(path + '/annotations/*.xml'):name = i.replace('\\', '/').split('/')[-1][:-4]tmp.append(name)
random.shuffle(tmp)train = tmp[:int(len(tmp) * 0.8)]
val = tmp[int(len(tmp) * 0.8):]
print('train:', len(train), 'val:', len(val))# Create a pool of worker processes with specified number of processes
pool = multiprocessing.Pool(processes=num_processes)with open('dataset/' + dir + '/train.txt', 'w', encoding='utf-8') as f:# Process train data using multiple processesresults = pool.map(process_file, train)f.writelines(results)with open('dataset/' + dir + '/valid.txt', 'w', encoding='utf-8') as f:# Process validation data using multiple processesresults = pool.map(process_file, val)f.writelines(results)# Close the pool of worker processes
pool.close()
pool.join()

运行后目录下生成train.txt,val.txt
创建label_list.txt,写入标注数据的类别
目录:

person
---images---xx.jpg
---annotation---xx.xml
---train.txt
---val.txt
---label_list.txt

github主页:一些常用的清洗数据的脚本

https://github.com/zsh123abc/Data_analysis_related_py

三,安装PaddleDetection环境

1,安装docker

# 下载地址
https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe

安装到除c盘外的其他盘
docker的默认安装路径:C:\Program Files\Docker
用管理员打开cmd

# 通过软连接把实际储存移到E盘中
mklink C:\Program Files\Docker  E:\Docker

双击运行docker.exe

2,拉paddle镜像

docker pull paddlepaddle/paddle:2.5.2-gpu-cuda12.0-cudnn8.9-trt8.6

3,下载PPaddleDetection 2.6 源码

git clone --branch 2.6  https://github.com/PaddlePaddle/PaddleDetection.git

3,gpu启动docker容器

docker run -it --privileged=true --name paddle_test --gpus all -d  -p 8040:8040 -v E:\PaddleDetection:/PaddleDetection paddlepaddle/paddle:2.5.2-gpu-cuda12.0-cudnn8.9-trt8.6 /bin/bash

四,修改配置文件,本文选择的是 PP-PicoDet算法

把标注数据集的文件夹放到

/PaddleDetection/dataset/voc

修改配置文件:

cd /PaddleDetection
# cp一份
cp configs/datasets/voc.yml configs/datasets/test_voc.yml
vi configs/datasets/test_voc.yml

test_voc.yml

metric: VOC
map_type: 11point
num_classes: 20 #类别数量TrainDataset:name: VOCDataSetdataset_dir: dataset/voc #数据集目录anno_path: trainval.txtlabel_list: label_list.txtdata_fields: ['image', 'gt_bbox', 'gt_class', 'difficult']EvalDataset:name: VOCDataSetdataset_dir: dataset/voc #数据集目录anno_path: test.txtlabel_list: label_list.txtdata_fields: ['image', 'gt_bbox', 'gt_class', 'difficult']TestDataset:name: ImageFolderanno_path: dataset/voc/label_list.txt #类别名文件

修改配置文件:

/PaddleDetection/configs/picodet/legacy_model/picodet_s_320_voc.yml

picodet_s_320_voc.yml

_BASE_: ['../../datasets/voc.yml','../../runtime.yml','_base_/picodet_esnet.yml','_base_/optimizer_300e.yml','_base_/picodet_320_reader.yml',
]pretrain_weights: https://paddledet.bj.bcebos.com/models/pretrained/ESNet_x0_75_pretrained.pdparams
weights: output/picodet_s_320_coco/model_final
find_unused_parameters: True
use_ema: true
cycle_epoch: 40
snapshot_epoch: 10ESNet:scale: 0.75feature_maps: [4, 11, 14]act: hard_swishchannel_ratio: [0.875, 0.5, 0.5, 0.5, 0.625, 0.5, 0.625, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]CSPPAN:out_channels: 96PicoHead:conv_feat:name: PicoFeatfeat_in: 96feat_out: 96num_convs: 2num_fpn_stride: 4norm_type: bnshare_cls_reg: Truefeat_in_chan: 96EvalReader:collate_batch: false

五,训练模型

python -m tools/train.py -c configs/picodet/legacy_model/picodet_s_320_voc.yml

单机多卡

python -m paddle.distributed.launch \
--selected_gpus='0,1,2' \
--log_dir=./test_voc/ \
tools/train.py \
-c configs/picodet/legacy_model/picodet_s_320_voc.yml \
--use_vdl=true \
--vdl_log_dir=vdl_dir/scratch_log \
--eval>test_voc.log 2>&1 &

多机多卡

python -m paddle.distributed.launch \--cluster_node_ips=192.168.100.1,192.168.100.2 \--node_ip=192.168.100.1 \--started_port=6170 \--selected_gpus=0 \--log_dir=./ping-pang \tools/train.py -c configs/picodet/legacy_model/picodet_s_320_voc.yml --use_vdl=true --vdl_log_dir=vdl_dir/scratch_log  --eval>scratch.log 2>&1&

可视化训练,visualdl安装

pip install --upgrade visualdl

在训练命令中加入

--use_vdl=true \
--vdl_log_dir=vdl_dir/scratch_log \

启用,指定log文件夹

visualdl --logdir ./scratch_log --port 8080

浏览器输入

http://127.0.0.1:8080

六,训练完成之后导出模型

python tools/export_model.py \
-c configs/picodet/legacy_model/picodet_s_320_voc.yml \
-o weights=output/test_voc/best_model.pdparams \
--output_dir=inference_model

优化模型,转换格式,方便移动端部署

paddle_lite_opt --valid_targets=arm \
--model_file=inference_model/test_voc/model.pdmodel \
--param_file=inference_model/test_voc/model.pdiparams \
--optimize_out=inference_model/test_voc/test_voc

七,模型预测

图片预测

python deploy/python/infer.py \
--model_dir=inference_model/test_voc \
--output=output/test_img_output \
--image_file=output/img_test.jpg \
--threshold=0.5 \
--device=GPU

多张图片预测

python deploy/python/infer.py \
--model_dir=inference_model/test_voc \
--output=output/test_images_output \
--image_dir=output/images_test \
--threshold=0.5 
--device=GPU

视频预测

python deploy/python/infer.py \
--model_dir=inference_model/test_voc \
--video_file=dataset/test_video \
--output=output/test_video_output \
--threshold=0.5 \
--device=GPU

附带 批量运行视频脚本

find dataset/court_video_test/628_video/ -type f -name "*.mp4" -exec sh -c 'python deploy/python/infer.py --model_dir=inference_model/test_voc --video_file="{}" --output=output/test_video_output --threshold=0.5 --device=GPU' \;

八,半自动标注:

生成预标注 --save_results 保存推理结果,需要修改推理源码,保存推理结果至json文件

python deploy/python/infer.py \
--model_dir=inference_model/test_voc \
--output=output/test_json_output \
--image_dir=dataset/test_images \
--threshold=0.5 \
--device=GPU \
--save_results

九,移动端部署

参考paddle github官网项目

git clone https://github.com/PaddlePaddle/Paddle-Lite-Demo/tree/develop/object_detection/android/app/cxx/picodet_detection_demo

1,下载 Android Stuido
官网地址:https://developer.android.com/studio

2,下载JDK,SDK,NDK,CMake
参考网址:https://developer.android.com/studio/projects/install-ndk?hl=zh-cn

这篇关于PaddleDetection训练目标检测模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/403827

相关文章

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X