# CV_course_2025 **Repository Path**: yangchengjun2/cv_course_2025 ## Basic Information - **Project Name**: CV_course_2025 - **Description**: 计算机视觉相关的练习代码,包含自定义数据集实训项目一个,基础实验6个 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-05-15 - **Last Updated**: 2025-06-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README - [实训课说明](#%E5%AE%9E%E8%AE%AD%E8%AF%BE%E8%AF%B4%E6%98%8E) - [1. 一、环境准备](#1-%E4%B8%80%E7%8E%AF%E5%A2%83%E5%87%86%E5%A4%87) - [1.1. 参考资料](#11-%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99) - [1.2. 安装级别环境](#12-%E5%AE%89%E8%A3%85%E7%BA%A7%E5%88%AB%E7%8E%AF%E5%A2%83) - [1.3. 数据集下载VOC测试环境:https://opendatalab.com/](#13-%E6%95%B0%E6%8D%AE%E9%9B%86%E4%B8%8B%E8%BD%BDvoc%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83httpsopendatalabcom) - [2. 二、自定义数据集](#2-%E4%BA%8C%E8%87%AA%E5%AE%9A%E4%B9%89%E6%95%B0%E6%8D%AE%E9%9B%86) - [2.1. 启动](#21-%E5%90%AF%E5%8A%A8) - [2.2. 创建项目](#22-%E5%88%9B%E5%BB%BA%E9%A1%B9%E7%9B%AE) - [2.3. 为项目添加云存储路径](#23-%E4%B8%BA%E9%A1%B9%E7%9B%AE%E6%B7%BB%E5%8A%A0%E4%BA%91%E5%AD%98%E5%82%A8%E8%B7%AF%E5%BE%84) - [2.4. 将图片上传到指定路径,以文件夹 /23/ 为例](#24-%E5%B0%86%E5%9B%BE%E7%89%87%E4%B8%8A%E4%BC%A0%E5%88%B0%E6%8C%87%E5%AE%9A%E8%B7%AF%E5%BE%84%E4%BB%A5%E6%96%87%E4%BB%B6%E5%A4%B9-23-%E4%B8%BA%E4%BE%8B) - [2.5. 测试路径是否有效](#25-%E6%B5%8B%E8%AF%95%E8%B7%AF%E5%BE%84%E6%98%AF%E5%90%A6%E6%9C%89%E6%95%88) - [2.6. 设置完标注形式即可使用预先标注的设置](#26-%E8%AE%BE%E7%BD%AE%E5%AE%8C%E6%A0%87%E6%B3%A8%E5%BD%A2%E5%BC%8F%E5%8D%B3%E5%8F%AF%E4%BD%BF%E7%94%A8%E9%A2%84%E5%85%88%E6%A0%87%E6%B3%A8%E7%9A%84%E8%AE%BE%E7%BD%AE) - [2.7. 如何将mmplabe推理出来的jeson作为预标注使用(脚本不能直接使用需要修改图像属性)](#27-%E5%A6%82%E4%BD%95%E5%B0%86mmplabe%E6%8E%A8%E7%90%86%E5%87%BA%E6%9D%A5%E7%9A%84jeson%E4%BD%9C%E4%B8%BA%E9%A2%84%E6%A0%87%E6%B3%A8%E4%BD%BF%E7%94%A8%E8%84%9A%E6%9C%AC%E4%B8%8D%E8%83%BD%E7%9B%B4%E6%8E%A5%E4%BD%BF%E7%94%A8%E9%9C%80%E8%A6%81%E4%BF%AE%E6%94%B9%E5%9B%BE%E5%83%8F%E5%B1%9E%E6%80%A7) - [2.8. 上传之前最好提前清洗数据,确保每个结果一个框+17个点,删除不符合要求的图像](#28-%E4%B8%8A%E4%BC%A0%E4%B9%8B%E5%89%8D%E6%9C%80%E5%A5%BD%E6%8F%90%E5%89%8D%E6%B8%85%E6%B4%97%E6%95%B0%E6%8D%AE%E7%A1%AE%E4%BF%9D%E6%AF%8F%E4%B8%AA%E7%BB%93%E6%9E%9C%E4%B8%80%E4%B8%AA%E6%A1%8617%E4%B8%AA%E7%82%B9%E5%88%A0%E9%99%A4%E4%B8%8D%E7%AC%A6%E5%90%88%E8%A6%81%E6%B1%82%E7%9A%84%E5%9B%BE%E5%83%8F) - [2.9. 上传预先标注任务,所有图像的路径应该设置如下:不对的话查找替换](#29-%E4%B8%8A%E4%BC%A0%E9%A2%84%E5%85%88%E6%A0%87%E6%B3%A8%E4%BB%BB%E5%8A%A1%E6%89%80%E6%9C%89%E5%9B%BE%E5%83%8F%E7%9A%84%E8%B7%AF%E5%BE%84%E5%BA%94%E8%AF%A5%E8%AE%BE%E7%BD%AE%E5%A6%82%E4%B8%8B%E4%B8%8D%E5%AF%B9%E7%9A%84%E8%AF%9D%E6%9F%A5%E6%89%BE%E6%9B%BF%E6%8D%A2) - [2.10. 标注的时候应该注意](#210-%E6%A0%87%E6%B3%A8%E7%9A%84%E6%97%B6%E5%80%99%E5%BA%94%E8%AF%A5%E6%B3%A8%E6%84%8F) - [2.11. 转换为coco数据集格式](#211-%E8%BD%AC%E6%8D%A2%E4%B8%BAcoco%E6%95%B0%E6%8D%AE%E9%9B%86%E6%A0%BC%E5%BC%8F) - [2.12. 当数据集自定义时(配置文件修改,包括网络分类头、推理配置、数据读取路径配置)](#212-%E5%BD%93%E6%95%B0%E6%8D%AE%E9%9B%86%E8%87%AA%E5%AE%9A%E4%B9%89%E6%97%B6%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E4%BF%AE%E6%94%B9%E5%8C%85%E6%8B%AC%E7%BD%91%E7%BB%9C%E5%88%86%E7%B1%BB%E5%A4%B4%E6%8E%A8%E7%90%86%E9%85%8D%E7%BD%AE%E6%95%B0%E6%8D%AE%E8%AF%BB%E5%8F%96%E8%B7%AF%E5%BE%84%E9%85%8D%E7%BD%AE) - [2.13. 注册数据集名字](#213-%E6%B3%A8%E5%86%8C%E6%95%B0%E6%8D%AE%E9%9B%86%E5%90%8D%E5%AD%97) - [2.14. 修改数据集的设置](#214-%E4%BF%AE%E6%94%B9%E6%95%B0%E6%8D%AE%E9%9B%86%E7%9A%84%E8%AE%BE%E7%BD%AE) - [2.15. 用自己的数据训练模型](#215-%E7%94%A8%E8%87%AA%E5%B7%B1%E7%9A%84%E6%95%B0%E6%8D%AE%E8%AE%AD%E7%BB%83%E6%A8%A1%E5%9E%8B) - [2.16. 测试自己训练效果](#216-%E6%B5%8B%E8%AF%95%E8%87%AA%E5%B7%B1%E8%AE%AD%E7%BB%83%E6%95%88%E6%9E%9C) # 实训课说明 ## 一、环境准备 ### 1 参考资料 [手撸openMMlab,教你哪些文件需要改-视频教程](https://www.bilibili.com/video/BV1za411Y7Zm?spm_id_from=333.788.videopod.sections&vd_source=5a1851ba2a81dfd3e3a8326c3276c762) [win安装openmmdetection-视频教程](https://www.bilibili.com/video/BV12f4y1L71J/?spm_id_from=333.337.search-card.all.click&vd_source=5a1851ba2a81dfd3e3a8326c3276c762) [win需要的软件](https://allophane.com) [mmcv官方文档](https://mmcv.readthedocs.io/en/latest/) [mmdetection](https://mmdetection.readthedocs.io/en/v3.3.0/get_started.html) [mmtracking](https://github.com/open-mmlab/mmtracking) [mmpose](https://mmpose.readthedocs.io/en/dev-1.x/installation.html) ### 2 安装级别环境 [mmdet要求mmcv>=2.0.0,<2.1.0](https://mmdetection.readthedocs.io/en/latest/get_started.html) [mmseg要求mmcv>=2.0.0](https://github.com/open-mmlab/mmsegmentation/blob/main/docs/en/get_started.md#customize-installation) [mmdet3.x <= mmpose 1.x <= mmcv 2.x](https://mmpose.readthedocs.io/en/dev-1.x/installation.html) 示例: python=3.8,pytorch=1.13.1 安装mmcv 2.0.0--> 安装mmdet 3.3.0(源码编译)--> 安装mmpose1.3.2(源码编译)--> 安装mmsegmentation1.2.2(源码编译,**实训课程时可选安装,非必须**) ### 3 数据集下载(VOC)测试环境:https://opendatalab.com/ ```sh pip install openxlab #安装 pip install -U openxlab #版本升级 openxlab login #进行登录,输入对应的AK/SK openxlab dataset info --dataset-repo OpenDataLab/PASCAL_VOC2012 #数据集信息及文件列表查看 openxlab dataset get --dataset-repo OpenDataLab/PASCAL_VOC2012 #数据集下载 openxlab dataset download --dataset-repo OpenDataLab/PASCAL_VOC2012 --source-path /README.md --target-path /path/to/local/folder #数据集文件下载 ``` 获得两个数据集后, dsdl( Dataset Structure Definition Language): raw:原始的 sample:样本 解压raw后按照dsdl的规则排列数据: ```sh ├── Annotations │ ├── 000001.xml │ ├── 000002.xml │ ├── 000003.xml │ ├── 000004.xml │ ├── 000005.xml │ └── ... ├── ImageSets │ ├── Segmentation │ │ ├── test.txt │ │ ├── train.txt │ │ ├── trainval.txt │ │ └── val.txt │ ├── Layout │ │ ├── test.txt │ │ ├── train.txt │ │ ├── trainval.txt │ │ └── val.txt │ └── Main │ ├── aeroplane_test.txt │ ├── aeroplane_train.txt │ ├── aeroplane_trainval.txt │ ├── aeroplane_val.txt │ ├── bicycle_test.txt │ └── ... ├── JPEGImages │ ├── 000001.jpg │ ├── 000002.jpg │ ├── 000003.jpg │ ├── 000004.jpg │ ├── 000005.jpg │ └── ... ├── SegmentationClass │ ├── 000032.png │ ├── 000033.png │ ├── 000039.png │ ├── 000042.png │ ├── 000061.png │ └── ... └── SegmentationObject ├── 000032.png ├── 000033.png ├── 000039.png ├── 000042.png ├── 000061.png └── ... ``` 修改配置文件用resnet50训练VOC数据集,复制一份并改名字: ```py _base_ = [ '../_base_/models/faster-rcnn_r50_fpn.py', '../_base_/datasets/coco_detection.py', #指定用coco数据集的配置 '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' ] ``` 修改一下数据集的配置文件路径: ```py _base_ = [ '../_base_/models/faster-rcnn_r50_fpn.py', '../_base_/datasets/voc0712.py',#指定用VOC数据集的配置,这个配置文件已经写好,改个路径即可 '../_base_/schedules/schedule_1x.py', '../_base_/default_runtime.py' ] ``` 运行6卡训练: ```sh CUDA_VISIBLE_DEVICES=0,1,2,3,4,5 \ PORT=29500 ./tools/dist_train.sh \ ./configs/faster_rcnn/faster-rcnn_r50_fpn_1x_VOC.py \ 6 --cfg-options train_cfg.max_epochs=12 \ --work-dir ./work-dir2 \ --amp ``` 运行1卡训练,可以指定修改某一个配置参数: ```sh python tools/train.py \ ./configs/faster_rcnn/faster-rcnn_r50_fpn_1x_VOC.py \ --cfg-options train_cfg.max_epochs=1 ``` 使能tensorboard修改运行设置mmdetection/configs/_base_/default_runtime.py ```py vis_backends = [dict(type='LocalVisBackend'),dict(type='TensorboardVisBackend')] ``` ```sh pip install tensorboard==2.12.0 # 不能安装更高版本,mmpengin用了 protobuf,导致 库版本不兼容导致的 tensorboard --logdir mmdetection/work-dir2/ ``` ## 二、自定义数据集 ### 1 启动 选择自己的安装方式,[link](https://labelstud.io/guide/install) ```sh LABEL_STUDIO_LOCAL_FILES_SERVING_ENABLED=true LABEL_STUDIO_LOCAL_FILES_DOCUMENT_ROOT=/home/yang/code/ label-studio -p 9001 ``` OR 直接访问我创建的服务(校园网): ### 2 创建项目 ### 3 为项目添加云存储路径 搭建完后确定云存储路径:/home/yang/code/dataset 不要同步: ![Alt text](image-2.png) ### 4 将图片上传到指定路径,以文件夹 /23/ 为例 绝对路径:/home/yang/code/dataset/media/upload/23 ### 5 测试路径是否有效 dataset/media/upload/23 网页输入以下地址查看是否能输出该图像 ``` http://10.10.0.200:9001/data/local-files?d=dataset/media/upload/23/F10009000.png ``` 1103重新启动服务: ``` LABEL_STUDIO_LOCAL_FILES_SERVING_ENABLED=true LABEL_STUDIO_LOCAL_FILES_DOCUMENT_ROOT=/home/yang/.local/share/label-studio/media/ label-studio -p 9001 ``` 创建工程后添加云存储:/home/yang/.local/share/label-studio/media/upload/ - 学生账号访问1103内网:http://192.168.1.110:9001/data/local-files?d=upload/AI22/学号/***.png OR http://localhost:9001/data/local-files?d=upload/AI22/学号/***.png ### 6 设置完标注形式即可使用预先标注的设置 ```XML ``` ### 7 如何将mmplabe推理出来的jeson作为预标注使用(脚本不能直接使用需要修改图像属性) 先执行推理: ```sh python demo/image_demo_with_mmdet.py \ demo/mmdetection_cfg/rtmdet_m_640-8xb32_coco-person.py \ https://download.openmmlab.com/mmpose/v1/projects/rtmpose/rtmdet_m_8xb32-100e_coco-obj365-person-235e8209.pth \ configs/body_2d_keypoint/topdown_heatmap/coco/td-hm_ViTPose-huge_8xb64-210e_coco-256x192.py \ td-hm_ViTPose-huge_3rdparty_coco-256x192-5b738c8e_20230314.pth \ --input ./data/23 \ --output ./output/23 \ --save-predictions ``` 将结果输出的jeson转换为lable studio支持的格式(脚本不能直接使用需要修改图像属性,代码有注释:tools/dataset_converters/coco2lbstudio_KP_bbox.py): ```sh python tools/dataset_converters/labelstudio2coco2.py output/23/dzp.xml output/23/project-20-at-2025-05-03-07-23-34dc3f78.json --output_dir output/data/annotations ``` ### 8 上传之前最好提前清洗数据,确保每个结果一个框+17个点,删除不符合要求的图像 ```sh python tools/dataset_converters/check_json_1bbox.py output/23/lable.json --kp_num 17 ``` ### 8上传预先标注任务,所有图像的路径应该设置如下:(不对的话查找替换) ```json "data": { "img": "/data/local-files?d=dataset/media/upload/23/F10009349.png" }, // dataset/media/upload/23/ 是自己创建的项目所在的文件夹路径,如果使用老师的服务器,请询问具体存放地址进行修改 ``` ### 9 标注的时候应该注意 - 最重要,一定要点击update ![Alt text](image-4.png) 检测脚本,检测出关键点不是19个的图像进行删除 ```sh python tools/dataset_converters/check_json_1bbox.py projects/1_my_dzp/data/kp420.json --kp_num 19 ``` ### 10 转换为coco数据集格式 (json2coco会替换已有的coco文件夹,默认的配置文件指向了其读取路径在:mmpose/projects/1_my_dzp/data/annotations/person_keypoints_train2017.json) ```sh exp: python tools/dataset_converters/labelstudio2coco2.py output/23/dzp.xml output/23/project-20-at-2025-05-03-07-23-34dc3f78.json output/23/xxx.json --output_dir output/data/annotations ``` ### 11 当数据集自定义时(配置文件修改,包括网络分类头、推理配置、数据读取路径配置) - 踩坑 labelstudio2coco.py: #数据集可视化配置 :mmpose/configs/_base_/datasets/coco.py #数据集可视化配置 复制一份进行修改:mmpose/projects/1_my_dzp/config/coco19.py 复制没有用,生效的还是:mmpose/configs/_base_/datasets/coco19.py ### 12 注册数据集名字 生成一份完整配置文件: ``` python tools/train.py configs/ body_2d_keypoint/topdown_heatmap/coco/td-hm_res50_8xb64-210e_coco-256x192.py --workdir projects/1_my_dzp/ ``` 复制: mmpose/mmpose/datasets/datasets/body/coco_dataset.py 重命名为: mmpose/mmpose/datasets/datasets/body/coco_dataset_kp19.py 添加如下内容: ```py @DATASETS.register_module() class CocoDataset_kp19(BaseCocoStyleDataset): #最后一句指向了自己的关键点配置,coco19.py复制了coco.py稍后要进行修改 METAINFO: dict = dict(from_file='projects/1_my_dzp/config/coco19.py') ``` 在mmpose/mmpose/datasets/datasets/body/**init**.py文件中添加 ```py from .coco_dataset_kp19 import CocoDataset_kp19 __all__ = [,'CocoDataset_kp19',......]# 加入名字 ``` ### 13 修改数据集的设置 projects/1_my_dzp/config/coco19.py 文件包含类别名称、及其关联性、绘图的配置 ```py 。。。 16: dict( name='right_ankle', id=16, color=[255, 128, 0], type='lower', swap='left_ankle'), # 此处我增加了人拿着竹竿,竹竿两头的点,分别是17,18 17: dict( name='left_bamboo', id=17, color=[150, 100, 200], type='lower', swap='right_bamboo'), 18: dict( name='right_bamboo', id=18, color=[150, 100, 200], type='lower', swap='left_bamboo'), 。。。 #添加连接线 skeleton_info={ 18: dict( link=('right_ear', 'right_shoulder'), id=18, color=[51, 153, 255]), 19: dict( link=('left_bamboo', 'right_bamboo'), id=19, color=[0, 0, 0]) } #joint_weights:表示不同关节点的权重。在人体姿态估计任务中,不同的关节点对于整体姿态估计的重要性可能不同. #较大的权重表示该关节点在计算损失函数或评估指标时具有更高的影响力,模型会更倾向于准确预测这些关节点的位置。 joint_weights=[ 1., 1., 1., 1., 1., 1., 1., 1.2, 1.2, 1.5, 1.5, 1., 1., 1.2, 1.2, 1.5, 1.5,1.5,1.5 ], #通常与关节点位置的不确定性或方差有关。在一些姿态估计算法中,会假设关节点的位置服从一定的概率分布, # 而 sigmas 则表示每个关节点位置分布的标准差。较小的 sigma 值表示该关节点的位置估计相对更准确、 # 更集中,模型对该关节点位置的预测更有信心; sigmas=[ 0.026, 0.025, 0.025, 0.035, 0.035, 0.079, 0.079, 0.072, 0.072, 0.062, 0.062, 0.107, 0.107, 0.087, 0.087, 0.089, 0.089,0.089, 0.089 ] ``` ### 14 用自己的数据训练模型 ```sh #单卡训练 python tools/train.py projects/1_my_dzp/config/td-reg_res50_8xb64-210e_coco-256x192.py #多卡训练 CUDA_VISIBLE_DEVICES=0,1,2,3,4,5 \ PORT=29500 ./tools/dist_train.sh \ projects/1_my_dzp/config/kp419_trainCF.py \ 6 \ --cfg-options train_cfg.max_epochs=200 \ --resume projects/1_my_dzp/work_dirs/kp419_trainCF/last_checkpoint #修改参数示例 试验记录20epoch没有收敛,200epoch开始尝试: CUDA_VISIBLE_DEVICES=0,1,2,3,4,5 \ PORT=29500 ./tools/dist_train.sh \ projects/1_my_dzp/config/kp419_trainCF.py \ 6 \ --cfg-options train_cfg.max_epochs=200 ``` ### 15 测试自己训练效果 ``` python demo/image_demo_with_mmdet.py \ demo/mmdetection_cfg/rtmdet_m_640-8xb32_coco-person.py \ https://download.openmmlab.com/mmpose/v1/projects/rtmpose/rtmdet_m_8xb32-100e_coco-obj365-person-235e8209.pth \ projects/1_my_dzp/config/kp419_trainCF.py \ projects/1_my_dzp/work_dirs/kp419_trainCF/best_coco_AP_epoch_380.pth \ --input ./data/23 \ --output ./output/23 \ --save-predictions ```