V831拍照并保存制作数据集&本地训练目标检测模型

一、实验设备

01科技的V831
在这里插入图片描述

图1

二、拍照程序

  新建main.py文件并粘贴如下代码

#导入相关模块
from maix import display, camera
import time

from maix import gpio #导入相关模块
#KEY 是 PH13,输入模式
KEY = gpio.gpio(13, "H", 1, 2)
#LED 是 PH14,默认输出模式
LED = gpio.gpio(14, "H", 1)

i = 0
while True:
    #实时显示摄像头拍摄图像
    img = camera.capture()

     #KEY 被按下
    if KEY.get_value() == 0:
        time.sleep(0.05) #延时消抖
        if KEY.get_value() == 0:
            i = i + 1
            LED.set_value(0) #点亮蓝灯
            img.save('/mnt/UDISK/photo/'+str(i)+'.jpg') #保存图片到photo文件夹
            while KEY.get_value() == 0: #等待按键释放
                pass
    else:
        LED.set_value(1) #熄灭蓝灯

    img.draw_string(0, 0, str(i), 1, (255, 0, 0), 1) #左上角信息拍照的张数
    display.show(img)

  将V831连接到电脑,等待U盘弹出,将main.py文件拷贝到U盘中,重启V831。按下按键进行图片保存,蓝灯亮,释放按键蓝灯灭。拍照结束,等待一段时间将V831进行重启,就能在U盘中看见刚刚拍的照片。

三、数据集制作

  1、使用labelImg对上面采集的照片进行标注
  2、也可以使用别人分享的数据集:如百度飞桨的公共数据集
在这里插入图片描述

图2

使用百度飞桨数据集大厅中的安全帽数据集
在这里插入图片描述

图3

点击下载进行数据集的下载

四、本地训练

1、获取训练工程文件

git clone https://github.com/dianjixz/v831_yolo.git

2、将前面获取的数据集复制到data目录下的custom文件夹中
在这里插入图片描述

图4

3、划分训练集和测试集
在data文件夹中创建split.py文件并运行

import os
import random
import argparse

parser = argparse.ArgumentParser()
# xml文件的地址,根据自己的数据进行修改 xml一般存放在Annotations下
parser.add_argument('--xml_path', default='custom/Annotations', type=str, help='input xml label path')
# 数据集的划分,地址选择自己数据下的ImageSets/Main
parser.add_argument('--txt_path', default='custom/ImageSets/Main', type=str, help='output txt label path')
opt = parser.parse_args()

train_percent = 0.8  # 训练集所占比例
val_percent = 0.2  # 验证集所占比例
test_persent = 0  # 测试集所占比例

xmlfilepath = opt.xml_path
txtsavepath = opt.txt_path
total_xml = os.listdir(xmlfilepath)

if not os.path.exists(txtsavepath):
    os.makedirs(txtsavepath)

num = len(total_xml)
list = list(range(num))

t_train = int(num * train_percent)
t_val = int(num * val_percent)

train = random.sample(list, t_train)
num1 = len(train)
for i in range(num1):
    list.remove(train[i])

val_test = [i for i in list if not i in train]
val = random.sample(val_test, t_val)
num2 = len(val)
for i in range(num2):
    list.remove(val[i])

file_train = open(txtsavepath + '/train.txt', 'w')
file_val = open(txtsavepath + '/val.txt', 'w')
file_test = open(txtsavepath + '/test.txt', 'w')

for i in train:
    name = total_xml[i][:-4] + '\n'
    file_train.write(name)

for i in val:
    name = total_xml[i][:-4] + '\n'
    file_val.write(name)

for i in list:
    name = total_xml[i][:-4] + '\n'
    file_test.write(name)

file_train.close()
file_val.close()
file_test.close()

3、修改配置
修改 data/custom.py 中的 CUSTOM_CLASSES 变量为正确的 labels

CUSTOM_CLASSES = [
    "helmet",
    "person",
    "head"
]

4、训练
修改train.py文件并运行进行训练
在这里插入图片描述

图5

5、导出模型
修改convert.py,更改onnx2ncnn的文件路径
在这里插入图片描述

图6

修改test.py文件并运行
在这里插入图片描述

图7

6、模型转换
新建文件夹,并将上一步得到的 xxx.bin和 xxx.param放入,创建images 目录,将一些测试照片放入images文件夹中。最后将整个文件夹压缩,制作好压缩包后,使用 MaixHub 的在线转换工具进行模型转换。
在这里插入图片描述

图8

在这里插入图片描述

图9

选择NCNN和RGB并上传上一步制作的压缩包,点击创建转换任务进行模型转换,结束之后下载转换好的模型文件
在这里插入图片描述

图10

创建main.py文件并粘贴如下代码,将V831连接电脑,将main.py以及得到的yolov2_awnn.param和yolov2_awnn.bin复制到U盘中并重启V831。

#检测示例代码

from maix import nn, camera, image, display
from maix.nn import decoder
import time

model = {
    "param": "yolov2_awnn.param",
    "bin": "yolov2_awnn.bin"
}
options = {
    "model_type":  "awnn",
    "inputs": {
        "input0": (224, 224, 3)
    },
    "outputs": {
        "output0": (7, 7, (1+4+3)*5)    #输出参数修改,修改格式 (7 ,7 , (1 + 4 + "类别数量" ) * 5)
    },
    "mean": [127.5, 127.5, 127.5],
    "norm": [0.0078125, 0.0078125, 0.0078125],
}

labels = ["helmet", "person","head"]            #分类标签
anchors = [1.19, 1.98, 2.79, 4.59, 4.53, 8.92, 8.06, 5.29, 10.32, 10.65]

m = nn.load(model, opt=options)
yolo2_decoder = decoder.Yolo2(len(labels), anchors, net_in_size=(options["inputs"]["input0"][0], options["inputs"]["input0"][1]), net_out_size=(7, 7))

while True:
    img = camera.capture()
    AI_img = img.copy().resize(224, 224)
    out = m.forward(AI_img.tobytes(), quantize=True, layout="hwc")
    boxes, probs = yolo2_decoder.run(out, nms=0.3, threshold=0.3, img_size=(options["inputs"]["input0"][0], options["inputs"]["input0"][1]))

    if len(boxes):
        for i, box in enumerate(boxes):
            class_id = probs[i][0]
            prob = probs[i][1][class_id]
            disp_str = "{}:{:.2f}%".format(labels[class_id], prob*100)
            img.draw_rectangle(box[0], box[1], box[0] + box[2], box[1] + box[3], color = (255, 255, 255))
            x = box[0]
            y = box[1] - 20
            if y < 0:
                y = 0
            img.draw_string(x, y, disp_str, color = (255, 255, 255))

    display.show(img)

五、效果

在这里插入图片描述

图11

六、 参考文献:

  1. https://wiki.sipeed.com/soft/maixpy3/zh/usage/train_AI/train_yolov2.html
  2. https://blog.csdn.net/weixin_45819759/article/details/131211495
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值