yolov5训练手部识别

采用yolov5s预训练模型进行训练,训练集为19张电脑前置摄像头采集的720p图片。

环境

使用python3.11,pytorch,CUDA11.2,cuDNN8.1.0

通过gpu进行训练,gpu型号:NVIDIA RTX 2080s

安装项目依赖

在项目文件夹下执行以下命令安装yolov5及相应依赖

1
2
3
git clone https://github.com/ultralytics/yolov5  # clone
cd yolov5
pip install -r requirements.txt # install

图像标注

训练集为19张电脑前置摄像头采集的720p图片,使用makesense进行图片在线标注,导出对应的jpg和txt文件,txt文件即为yolo格式的标签文件。标签数量为1,标签名为hand。

模型训练

修改yaml文件中相关配置

1
2
3
4
5
6
7
8
9
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: mydata # dataset root dir
train: images # train images (relative to 'path') 128 images
val: images # val images (relative to 'path') 128 images
test: # test images (optional)

# Classes
names:
0: hand

修改train.py文件中相关配置,训练200个epoch

1
2
3
4
5
6
7
8
9
def parse_opt(known=False):
parser = argparse.ArgumentParser()
parser.add_argument('--weights', type=str, default=ROOT / 'yolov5s.pt', help='initial weights path')
parser.add_argument('--cfg', type=str, default=ROOT / 'models/yolov5s.yaml', help='model.yaml path')
parser.add_argument('--data', type=str, default=ROOT / 'data/mydata.yaml', help='dataset.yaml path')
parser.add_argument('--hyp', type=str, default=ROOT / 'data/hyps/hyp.scratch-low.yaml', help='hyperparameters path')
parser.add_argument('--epochs', type=int, default=200, help='total training epochs')
parser.add_argument('--batch-size', type=int, default=-1, help='total batch size for all GPUs, -1 for autobatch')
parser.add_argument('--imgsz', '--img', '--img-size', type=int, default=640, help='train, val image size (pixels)')

训练完成后输出pt模型文件,加载后即可进行检测。

CiNC2021比赛代码复现

本文用来记录PhysioNet/CinC Challenge 2021比赛中的参赛队伍代码复现过程。首先选择了排名第三位的NIMA队伍代码,对其进行复现。

目录

环境配置

首先使用anaconda创建虚拟环境,之后conda activate激活创建的环境。

1
2
conda create -n NIMA python=3.9
conda activate NIMA

定位到项目目录,安装依赖

1
pip install -r requirements.txt

运行

模型训练

运行以下代码

1
python train_model.py training_data model

首次运行发现accuracy始终为1.0,检查代码发现预处理部分有问题,在helper_code.py文件202行的get_lables()函数中,l.startswith(“#Dx”)应为l.startswith(“# Dx”)。原代码如下:

1
2
3
4
5
6
7
8
9
10
11
def get_labels(header):
labels = list()
for l in header.split('\n'):
if l.startswith('#Dx'): # 此处'#Dx'缺少空格,在数据文件中为'# Dx'
try:
entries = l.split(': ')[1].split(',')
for entry in entries:
labels.append(entry.strip())
except:
pass
return labels

修正后:

1
2
3
4
5
6
7
8
9
10
11
def get_labels(header):
labels = list()
for l in header.split('\n'):
if l.startswith("# Dx"):
try:
entries = l.split(': ')[1].split(',')
for entry in entries:
labels.append(entry.strip())
except:
pass
return labels

再次运行,发现accuracy固定在0.2111,检查代码发现在helper_code.py文件164行的get_adc_gains()函数中,分隔符出错。原代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def get_adc_gains(header, leads):
adc_gains = np.zeros(len(leads))
for i, l in enumerate(header.split('\n')):
entries = l.split(' ')
if i==0:
num_leads = int(entries[1])
elif i<=num_leads:
current_lead = entries[-1]
if current_lead in leads:
j = leads.index(current_lead)
try:
adc_gains[j] = float(entries[2].split('/')[0]) # 在数据文件中此处数据格式为'1000.0(0)/mV',需要取'/'前的float数据,但(0)导致读取出错,故将分隔符改为'('
except:
pass
else:
break
return adc_gains

修改后:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def get_adc_gains(header, leads):
adc_gains = np.zeros(len(leads))
for i, l in enumerate(header.split('\n')):
entries = l.split(' ')
if i==0:
num_leads = int(entries[1])
elif i<=num_leads:
current_lead = entries[-1]
if current_lead in leads:
j = leads.index(current_lead)
try:
adc_gains[j] = float(entries[2].split('(')[0])
except:
pass
else:
break
return adc_gains

修改以后运行正常,部分输出结果如下:

1
2
3
4
Epoch 2/17
77/77 [==============================] - 263s 3s/step - loss: 0.1003 - accuracy: 0.7224 - AUROC: 0.5515 - AUPRC: 0.1923
Epoch 3/17
77/77 [==============================] - 265s 3s/step - loss: 0.0879 - accuracy: 0.7509 - AUROC: 0.5756 - AUPRC: 0.2163

感觉跑的太慢了,查看用的是gpu还是cpu

1
2
from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())

原来是用cpu在跑,一顿折腾换成gpu,参考GPU 支持 | TensorFlow (google.cn)

注意

helper_code.py文件由比赛主办方提供,且禁止修改,然而其中的函数确实和提供的数据文件不匹配,所以为了跑通还是把它改了。

本站搭建过程

本站基于hexo搭建,以下是搭建过程的简单记录

前置软件

node.js

git

安装hexo

控制台输入以下代码安装hexo

1
npm install -g hexo

检查是否安装成功

1
hexo -v

显示hexo-cli版本号,成功安装

建立仓库

在项目文件夹下打开cmd,初始化博客

1
2
hexo init myblog
npm install

github新建仓库,之后在项目文件夹下打开git bash

1
2
3
4
5
git init
git add .
git commit
git remote add origin 仓库地址
git push -u origin main

之后在vercel部署即可

Tips

git使用过程中可能遇到网络问题,添加代理解决

1
2
git config --global http.proxy 127.0.0.1:10808
git config --global https.proxy 127.0.0.1:10808

其他

git还需要深入学习

markdown学习记录

1. 标题

在行的开头使用1-6个#字符,对应于标题级别1-6

2. 引用

在typora中,只需输入’>’后跟引用内容即可生成块引用。可以嵌套

引用

reference

ABCD

3. 任务列表

使用- [ ]

  • 任务

4. 代码块

输入```之后输入一个可选的语言标识符,然后按return键后输入代码,例如:

1
2
3
int main(){
printf("Hello World");
}

5. LaTex公式

使用$$创建公式块

E=mc2E=mc^2

内联公式

使用$包裹LaTex命令

下标

用 ~ 来包裹下标内容

上标

用 ^ 来包裹上标内容

6. 水平线使用—或***

使用—或***


7. 目录,使用[toc],自动生成

在blog中,使用@[toc]

8. 链接

要创建内联链接,请在链接文本的结束方括号后立即使用一组常规括号

这是百度

9. HTML

以后再来学吧~