1、目标分类 (Classification) 和 目标检测 (Detection) 的区别是什么?
2、 YOLO和Darknet分别是什么?
这里非常推荐一篇文章,本文章对目标检测的解释非常直观详细:
http://machinethink.net/blog/object-detection/
现在目标检测算法也有很多,这篇文章用到的就是非常有名的 YOLO (You only look once),就和字面意思一样, YOLO 可以一步 (one-stage) 得到结果所以非常快 (R-CNN 就需要两步 two-stage),而 Darknet 就是论文作者对自己算法的开源实现,既然是作者本人的实现,自然会有很多人愿意看一看。
Darknet 是用 C 语言实现的,在 Github 上也能找到开源的 源码,用 Darknet 既可以训练新的模型,也可以用现有的模型做预测。
接下来就会介绍如何用 Darknet 训练一个小黄人目标检测模型。
目标检测模型演示
1、Darknet:https://pjreddie.com/darknet/
2、目标检测:http://machinethink.net/blog/object-detection/
其实拍照就是拍一些里面包含你想要识别的物体的照片就好了,从各个角度、各个距离拍,这很重要!!!比如如果你想识别只有一半的小黄人,那拍的照片里就得有这样的例子才行,下面就是我拍的 300 张照片:
如果碰巧你也有 K210 可以参照下面的 Micropython 代码每隔 1-2s 自动拍一张照片保存到 SD 卡,用手机摄像头当然也是完全没有问题的:
1# Untitled - By: RT-Thread - 周五 7月 19 2019
2
3import sensor, image, time, lcd
4from fpioa_manager import *
5from Maix import GPIO
6import os
7
8def getMax():
9 maxnum = 0;
10 files = os.listdir('/sd')
11 for file in files:
12 name = file.split(".")
13 if(len(name)>1 and name[1] == "jpg"):
14 if(int(name[0])>maxnum):
15 maxnum = int(name[0])
16 return maxnum
17
18fm.register(board_info.LED_R, fm.fpioa.GPIO0)
19led_r=GPIO(GPIO.GPIO0,GPIO.OUT)
20
21lcd.init(freq=15000000)
22
23sensor.reset()
24sensor.set_pixformat(sensor.RGB565) # Set pixel format to RGB565 (or GRAYSCALE)
25sensor.set_framesize(sensor.QVGA) # Set frame size to QVGA (320x240)
26sensor.skip_frames(time = 2000) # Wait for settings take effect.
27sensor.set_hmirror(0)
28sensor.set_windowing((224,224))
29clock = time.clock() # Create a clock object to track the FPS.
30
31i = getMax() + 1
32
33def capture():
34 global i
35 img = sensor.snapshot()
36 filename = '/sd/' + str(i) + '.jpg'
37 print(filename)
38 img.save(filename)
39 img.draw_string(2,2, ("%2.1f" %(i)), color=(0,128,0), scale=2)
40 lcd.display(img)
41 i = i + 1;
42
43print("Start from %d" % i)
44
45while True:
46 led_r.value(0)
47 time.sleep(1)
48 led_r.value(1)
49 capture()
这里千万不要把图片保存为中文名,建议像图中那样用数字按顺序标注,到这里我们应该有几百张包含我们要检测的物体的图片了。
这里推荐用软件 LabelImg (链接:https://github.com/tzutalin/labelImg)来标注:
如果我们打开一个 txt 文件就可以看到类似下面的内容:
10 0.671875 0.575893 0.352679 0.848214
1物体类别 物体中心位置 x 物体中心位置 y 物体宽度 x 物体高度y
因为我们只有一个类别,所以第一个数字始终是 0,代表是第一个类别。
到这里我们应该每一张拍摄的图片都有一个对应的 txt 文件,里面包含上面提到的内容。
1import glob, os
2
3# Current directory
4current_dir = os.path.dirname(os.path.abspath(__file__))
5
6# Directory where the data will reside, relative to 'darknet.exe'
7# 修改为你自己的目录
8path_data = './train/'
9
10# Percentage of images to be used for the test set
11percentage_test = 10;
12
13# Create and/or truncate train.txt and test.txt
14file_train = open('train.txt', 'w')
15file_test = open('test.txt', 'w')
16
17# Populate train.txt and test.txt
18counter = 1
19index_test = round(100 / percentage_test)
20for pathAndFilename in glob.iglob(os.path.join(current_dir, "*.jpg")):
21 title, ext = os.path.splitext(os.path.basename(pathAndFilename))
22
23 if counter == index_test:
24 counter = 1
25 file_test.write(path_data + title + '.jpg' + "\n")
26 else:
27 file_train.write(path_data + title + '.jpg' + "\n")
28 counter = counter + 1
最后 train.txt 和 test.txt 看起来是这样的:
到这里应该有拍好的照片,每张照片对应一个 txt 标明了小黄人的位置,大小,另外还有一个 train.txt 和 test.txt 汇总了当前训练集和测试集的文件名。
1、荔枝丹 Dan Dock (K210):
https://wiki.sipeed.com/en/maix/board/dock.html
2、训练自己的 Darknet Yolov2 模型:
https://timebutt.github.io/static/how-to-train-yolov2-to-detect-custom-objects/
我用 i5 训练了整整 2天,才迭代了 200 步,用 NVIDIA GP104 训练一上午就迭代了 20000 步。
如果到这里开发环境安装没有问题,我们就可以开始训练了,其实训练过程非常简单,首先下载源码:
git clone
https://github.com/pjreddie/darknet
1GPU=1
2CUDNN=1
3OPENCV=0
4OPENMP=0
5DEBUG=0
1make
编译好 Darknet 后就可以在源码根目录看到一个 Darknet 可执行文件了。
1minions
当然,我们只有一个类别,接下来还需要在 cfg 目录下添加一个 obj.data 文件,里面第一行定义了我们的物体类别数,我们只有一个类别,已经我们前面生成的 train.txt,test.txt,obj.names 这 3 个文件在哪里,最后的 backup 是指训练的模型保存的位置。
1classes= 1
2train = /home/wuhan/darknet/data/train.txt
3valid = /home/wuhan/darknet/data/test.txt
4names = /home/wuhan/darknet/cfg/obj.names
5backup = backup/
1[net]
2# Testing
3batch=16
4subdivisions=1
5# Training
6# batch=64
7# subdivisions=2
8width=214 # 修改图像宽度
9height=214 # 修改图像高度
10channels=3
11momentum=0.9
12decay=0.0005
13angle=0
14saturation = 1.5
15exposure = 1.5
16hue=.1
17
18learning_rate=0.001
19burn_in=1000
20max_batches = 500200
21policy=steps
22steps=400000,450000
23scales=.1,.1
24
25[convolutional]
26batch_normalize=1
27filters=16
28size=3
29stride=1
30pad=1
31activation=leaky
32
33[maxpool]
34size=2
35stride=2
36
37[convolutional]
38batch_normalize=1
39filters=32
40size=3
41stride=1
42pad=1
43activation=leaky
44
45[maxpool]
46size=2
47stride=2
48
49[convolutional]
50batch_normalize=1
51filters=64
52size=3
53stride=1
54pad=1
55activation=leaky
56
57[maxpool]
58size=2
59stride=2
60
61[convolutional]
62batch_normalize=1
63filters=128
64size=3
65stride=1
66pad=1
67activation=leaky
68
69[maxpool]
70size=2
71stride=2
72
73[convolutional]
74batch_normalize=1
75filters=256
76size=3
77stride=1
78pad=1
79activation=leaky
80
81[maxpool]
82size=2
83stride=2
84
85[convolutional]
86batch_normalize=1
87filters=512
88size=3
89stride=1
90pad=1
91activation=leaky
92
93[maxpool]
94size=2
95stride=1
96
97[convolutional]
98batch_normalize=1
99filters=1024
100size=3
101stride=1
102pad=1
103activation=leaky
104
105###########
106
107[convolutional]
108batch_normalize=1
109size=3
110stride=1
111pad=1
112filters=512
113activation=leaky
114
115[convolutional]
116size=1
117stride=1
118pad=1
119filters=30 # filters = (classes + 5) * 5
120activation=linear
121
122[region]
123anchors = 0.57273, 0.677385, 1.87446, 2.06253, 3.33843, 5.47434, 7.88282, 3.52778, 9.77052, 9.16828
124bias_match=1
125classes=1 # 只有 1 类
126coords=4
127num=5
128softmax=1
129jitter=.2
130rescore=0
131
132object_scale=5
133noobject_scale=1
134class_scale=1
135coord_scale=1
136
137absolute=1
138thresh = .6
139random=1
终于可以开始训练了:
1./darknet detector train cfg/obj.data cfg/minionsv2.cfg darknet19_448.conv.23
1minionsv2_10000.weights
2minionsv2_100.weights
3minionsv2_20000.weights
4minionsv2_200.weights
5minionsv2_300.weights
6minionsv2_400.weights
7minionsv2_500.weights
8minionsv2_600.weights
9minionsv2_700.weights
10minionsv2_800.weights
11minionsv2_900.weights
12minionsv2.backup
1GPU=1
2CUDNN=1
3OPENCV=1
4OPENMP=0
5DEBUG=0
重新 make 得到 darknet 可执行文件,输入下面的命令就可以看到试试检测结果了。
1./darknet detector demo cfg/obj.data cfg/minionsv2.cfg /home/wuhan/darknet/backup/minionsv2_10000.weights
END
RT-Thread线上活动
1、【RT-Thread能力认证考试12月——RCEA】经过第一次考试的验证,
能力认证官网链接:https://www.rt-thread.org/page/rac.html(在外部浏览器打开)
立即报名
#题外话# 喜欢RT-Thread不要忘了在GitHub上留下你的STAR哦,你的star对我们来说非常重要!链接地址:https://github.com/RT-Thread/rt-thread
RT-Thread线下活动
1、中国国际工业博览会RT-Thread展台指南:
位置 上海工博会6.2号馆,近4号门 上海科学院展区内
时间 参展日期截至2019年9月20号
2、STM32全国研讨会,RT-Thread近期参展城市预告:南京、上海、深圳、广州、顺德
你可以添加微信18917005679为好友,注明:公司+姓名,拉进 RT-Thread 官方微信交流群
RT-Thread
长按二维码,关注我们
点击阅读原文进入RT-Thread官网