YOLO V3检测模型的测试

1.测试命令:

./darknet detector test cfg/coco.data cfg/yolov3.cfg backup/yolov3.weights data/person.jpg -thresh 0.4

YOLO V3检测模型的测试YOLO V3检测模型的测试

2.darknet提供的Python接口

python python/darknet.py

(1)报错:

File "python/darknet.py", line 154
    print r
          ^

找到源码报错的地方 print r,原来是语法问题,这是python2的写法,我用的Python3.6,所以简单改下即可
改正: print(r)

(2)报错

Traceback (most recent call last):
  File "python/darknet.py", line 48, in <module>
    lib = CDLL("libdarknet.so", RTLD_GLOBAL)
  File "/home/liuze/anaconda3/lib/python3.6/ctypes/__init__.py", line 348, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: libdarknet.so: cannot open shared object file: No such file or directory

这是链接库问题,改成自己编译出来的so文件的路径即可,源码中第48行

改正:lib = CDLL("/home/liuze/liuze/catkin_ws/src/darknet_ros/darknet/libdarknet.so", RTLD_GLOBAL)

(3)报错

Traceback (most recent call last):
  File "python/darknet.py", line 151, in <module>
    net = load_net("cfg/tiny-yolo.cfg", "tiny-yolo.weights", 0)
ctypes.ArgumentError: argument 1: <class 'TypeError'>: wrong type

模型没换,要换成自己的模型

改正:

net = load_net("cfg/yolov3.cfg", "/home/liuze/liuze/catkin_ws/src/darknet_ros/darknet/backup/yolov3.weights", 0)

换成自己的模型后还是报错,原因是load_net函数会将参数传给libdarknet.so库,而libdarknet.so库是用c/c++来写的,所以出现了这个错误。解决方法是在出错的字符串前面添加一个b就行了

net = load_net(b"cfg/yolov3.cfg", b"/home/liuze/liuze/catkin_ws/src/darknet_ros/darknet/backup/yolov3.weights", 0)

meta = load_meta(b"cfg/coco.data")

r = detect(net, meta, b"data/dog.jpg")

再次运行:

python python/darknet.py

YOLO V3检测模型的测试

我们看下这个结果,首先输出目标名称,接下来是置信度,后面括号中是矩形框的位置信息,前两个是中心点的坐标,后两个是边框的宽和高。

3.上面的结果可视化一下,打开darknet.py并在开头和结尾手动添加代码:

import cv2
import sys, os
import pdb

data = cv2.imread("data/dog.jpg")
for i in range(len(r)):
    cv2.rectangle(data, (int(r[i][2][0]-r[i][2][2]/2),int(r[i][2][1]-r[i][2][3]/2)), (int(r[i][2][0]+r[i][2][2]/2),int(r[i][2][1]+r[i][2][3]/2)),(0,255,0),2)
cv2.imshow("image",data)
cv2.waitKey(0)

重新运行命令:

python python/darknet.py

就顺利显示结果以及可视化的图片了,后面还可以把标签自己添加上去,自由发挥吧YOLO V3检测模型的测试