一、实验设备
01科技的V831
二、拍照程序
新建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、也可以使用别人分享的数据集:如百度飞桨的公共数据集
使用百度飞桨数据集大厅中的安全帽数据集
点击下载进行数据集的下载
四、本地训练
1、获取训练工程文件
git clone https://github.com/dianjixz/v831_yolo.git
2、将前面获取的数据集复制到data目录下的custom文件夹中
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、导出模型
修改convert.py,更改onnx2ncnn的文件路径
修改test.py文件并运行
6、模型转换
新建文件夹,并将上一步得到的 xxx.bin和 xxx.param放入,创建images 目录,将一些测试照片放入images文件夹中。最后将整个文件夹压缩,制作好压缩包后,使用 MaixHub 的在线转换工具进行模型转换。
选择NCNN和RGB并上传上一步制作的压缩包,点击创建转换任务进行模型转换,结束之后下载转换好的模型文件
创建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)