版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
训练部分
主要参考这两个网站的内容:
1.ToyBrick社区
2.yolov3官网
首先按照网站1的训练自己的数据教程在网站2下载并编译Darknet,然后剩的一直按照网站教程来,一直到
其中15表示提取的卷积层层数,因为我的需求是只有一个yolo层,所以我把yolov3的cfg文件的第一个yolo层之后的层都删掉了,然后这个参数修改为82,如果有其他的需求,可以按照上面那行程序输出的内容取相应的卷积层,yolov3的卷积层如下图:
训练的配置由yolov3的cfg决定:
训练的时候如果显示memory不足,那么就要修改batch和subdivisions,我是都改成了4。
max_batches控制epoch多少次。
剩下的按照社区教程来就ok。
rknn文件转换
第一步,执行rknn_transform_416x416.py,生成rknn文件,这个没有问题。
第二部,执行rknn_camera_416x416.py,其中有些地方需要改动:
1.程序上边的class相关内容:
GRID0 = 13
GRID1 = 26
GRID2 = 52
LISTSIZE = 8 // num_class + 5
SPAN = 3
NUM_CLS = 3
MAX_BOXES = 500
OBJ_THRESH = 0.5
NMS_THRESH = 0.6
CLASSES = ("person", "bicycle", "car")
2.inference之后,数据维度变了,要修改一下:
if __name__ == '__main__':
rknn = load_model()
font = cv2.FONT_HERSHEY_SIMPLEX;
capture = cv2.VideoCapture("data/3.mp4")
#capture = cv2.VideoCapture(0)
accum_time = 0
curr_fps = 0
prev_time = timer()
fps = 0
try:
while(True):
ret, frame = capture.read()
if ret == True:
image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
image = cv2.resize(image, (416, 416))
testtime=timer()
out_boxes = rknn.inference(inputs=[image]) //只有一个输出值
testtime2=timer()
print("rknn use time {}", testtime2-testtime)
out_boxes = np.array(out_boxes) //list没有reshape,所以要转换成array
out_boxes = out_boxes.reshape(SPAN, LISTSIZE, GRID0, GRID0) //剩的没有的out_boxes的相关操作都删除了
input_data = []
input_data.append(np.transpose(out_boxes, (2, 3, 0, 1)))
testtime=timer()
boxes, classes, scores = yolov3_post_process(input_data)
testtime2=timer()
print("process use time: {}", testtime2-testtime)
testtime=timer()
if boxes is not None:
draw(frame, boxes, scores, classes)
curr_time = timer()
exec_time = curr_time - prev_time
accum_time += exec_time
fps += 1
if True:
print("fps",fps/exec_time) //改写了一下计算fps的方式
testtime2=timer()
print("show image use time: {}", testtime2-testtime)
except KeyboardInterrupt:
cv2.destroyAllWindows()
capture.release()
rknn.release()
最后吐槽:rknn3399 pro调试起来是真费劲,init_environment 之后要15分钟,大大影响了调试速度。