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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/153503.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php面向对象和面向过程区别

面向过程编程&#xff1a;是一种传统的编码风格&#xff0c;它将代码组织为一系列函数或过程。这些函数可以采用一系列参数和返回值&#xff0c;来完成特定的任务。面向过程编程侧重顺序和功能性。 面向对象编程&#xff1a;是一种编码风格&#xff0c;它将代码组织为对象&…

04_面向对象高级_final与常量

final 1. 基本介绍 final 关键字是最终的意思&#xff0c;可以修饰&#xff08;类、方法、变量&#xff09; 修饰类&#xff1a;该类被称为最终类&#xff0c;特点是不能被继承了修饰方法&#xff1a;该方法被称为最终方法&#xff0c;特点是不能被重写了修饰变量&#xff1…

深入探讨AJAX接口进度监控:实现步骤、代码示例与技术原理

AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;是现代Web开发中常用的异步通信技术。本文将详细分析如何通过AJAX实现接口进度监控&#xff0c;提供实用的代码示例、技术原理解析以及优劣势评估&#xff0c;以帮助开发者更好地应用这一技术。 1. 引言 在复杂的…

Java Swing实现员工工资管理系统(含教程) 可带数据库 Java课程设计

7. 员工工资管理系统 视频教程&#xff1a; 【课程设计】员工工资管理系统-Java Swing-你的课程我设计 功能描述&#xff1a; 系统员工有"工号"、 “姓名”、“性别”、“岗位”、 "入职年份 "、"密码"等属性&#xff1b; 员工使用工号密码登录…

MacOs 删除第三方软件

AppStore下载的软件 如果删除AppStore下载的软件&#xff0c;直接长按软件&#xff0c;点击删除或拖到废纸篓就可以完成软件的删除 第三方软件 但是第三方下载的软件&#xff0c;无法拖进废纸篓&#xff0c;长按软件也没有右上角的小叉 可以通过以下方法实现对软件的卸载 …

2023美亚杯个人赛复盘(三)

案件基本情况&#xff1a; &#xff08;一&#xff09;案情 2023月8月的一天&#xff0c;香港警方在调查一起网络诈骗案件时&#xff0c;发现有三名本地男子&#xff0c;分別为李大輝&#xff08;李大辉&#xff09;&#xff0c;浩賢(浩贤)和Elvis CHUI&#xff0c;并确信这三名…

软件安全检测赋能赣州发展,开源网安与赣州国投完成签约

​11月20日&#xff0c;开源网安与赣州章贡区数智国投科技有限公司签订投资协议&#xff0c;签约后双方将在赣州打造软件供应链安全检测中心&#xff0c;以强大的软件测试能力为数字政府、数字经济等领域提供全面安全检测和软件安全运营监测等服务&#xff0c;提升软件的安全与…

2760. 最长奇偶子数组 --力扣 --JAVA

题目 给你一个下标从 0 开始的整数数组 nums 和一个整数 threshold 。 请你从 nums 的子数组中找出以下标 l 开头、下标 r 结尾 (0 < l < r < nums.length) 且满足以下条件的 最长子数组 &#xff1a; nums[l] % 2 0 对于范围 [l, r - 1] 内的所有下标 i &#xff0c…

电商数据|电商API接口|电商数据分析都会用到的接口不用再找了

导读&#xff1a;上半年&#xff0c;网络零售行业发展迅速&#xff0c;货架电商、直播电商、生鲜电商等领域动作频频。京东“百亿补贴”上线&#xff0c;张勇宣布启动“16N”组织变革&#xff0c;盒马启动上市计划&#xff0c;拼多多APP新增直播入口&#xff0c;快手升级货架场…

JavaScript拖放操作的实现

在页面中设置2个框&#xff1a;一个是被拖放的框&#xff0c;一个是拖放的目的地框。在拖动的时候&#xff0c;只有当鼠标位于拖放的目的地框上方的时候&#xff0c;放开鼠标的时候&#xff0c;被拖放的框&#xff0c;才被移动到鼠标所在的位置&#xff1b;而在其他地方放开鼠标…

SVG 多边形 <polygon>,矩形<rect>的示例代码

本专栏是汇集了一些HTML常常被遗忘的知识&#xff0c;这里算是温故而知新&#xff0c;往往这些零碎的知识点&#xff0c;在你开发中能起到炸惊效果。我们每个人都没有过目不忘&#xff0c;过久不忘的本事&#xff0c;就让这一点点知识慢慢渗透你的脑海。 本专栏的风格是力求简洁…

WPS或Excel查找A列中有B列没有的值

就这一行代码&#xff1a; 在C列输入&#xff1a; IF(COUNTIF(B:B,A1)>0,"该行A列中值B列有","该行A列中值B列没有")

企业微信将应用安装到工作台

在上篇中介绍了配置小程序应用及指令、数据回调获取第三方凭证&#xff1b; 本篇将介绍如何将应用安装到企业工作台。 添加测试企业 通过【应用管理】->【测试企业配置】添加测试企业。 通过企业微信扫描二维码添加测试企业。 注意&#xff1a;需要扫描的账号为管理员权限…

蓝桥杯单片机综合练习——工厂灯光控制

一、题目 二、代码 #include <reg52.h>sfr AUXR 0x8e; //定义辅助寄存器sbit S5 P3^2; //定义S5按键引脚 sbit S4 P3^3; //定义S4按键引脚unsigned char led_stat 0xff; //定义LED当前状态 unsigned char count 0; //定义50ms定时中断累…

【Docker】从零开始:2.Docker三要素

【Docker】从零开始&#xff1a;2.Docker三要素 DockerDocker支持的系统CentOS DockerDocker三要素Docker镜像(Image):Docker容器(Container):1.从面向对象角度2.从镜像容器角度 Docker仓库(Repository) 总结 Docker docker官网&#xff1a;http://www.docker.com 仓库-Docker…

opencv入门建议

OpenCV是一个开源的计算机视觉库&#xff0c;它包含了许多常用的图像处理和计算机视觉算法。如果你想入门OpenCV&#xff0c;以下是一些建议&#xff1a; 1. 学习基础知识 在开始使用OpenCV之前&#xff0c;你需要了解一些基础知识&#xff0c;例如编程语言、数据结构和算法等…

配置命令别名

vim ~/.bashrc 配置命令别名 alias knkubectl -n alias kkubectl 配置golang环境变量 export GOPATH/root/go export GO111MODULEon export GOPROXY"http://mirros.yun.ali.com.cn:8848/goproxy" export GOROOT/usr/local/go export PATH$PATH:$GOPATH/bi…

leetcode 每日一题复盘(11.20~11.26)

leetcode 746 使用最小花费爬楼梯 虽然是简单题但还是要说一下,感觉做题的思路还是不够清晰,好的是知道状态是最低花费,知道围绕所求的目标进行展开,倒推出递推公式 一开始写的递推公式是dp[i]dp[i-1]min(cost[i-2],cost[i-1]),写出了一个类似贪心算法的东西,归根结底还是对dp…

Android13 新增 Stable AIDL接口

问题描述&#xff1a; 我需要在netd aidl 中添加新的接口&#xff1a; 设置网卡MAC地址&#xff1a; void setHardwareAddress(in utf8InCpp String iface, in utf8InCpp String hwAddr); 背景&#xff1a; Android 10 添加了对稳定的 Android 接口定义语言 (AIDL) 的支持&…

机器学习:十大算法快速回顾

一、说明 对于机器学习的是个经典算法&#xff0c;本篇将展示一个回顾&#xff0c;注意&#xff0c;本篇不是具体原理信息介绍&#xff0c;没有代码&#xff0c;但是对于初学者是一个有益的导读。 二. 线性回归 2.1 算法描述 有没有想过数据奇才如何预测未来&#xff1f;输入线…