YoloV3-tiny训练后无法显示检测结果解决过程记录

之前有篇博文讲了怎样实现YoloV3-tiny训练自己的数据(link),后来我发现使用./darknet detector test cfg/voc.data cfg/yolov3-tiny.cfg backup/yolov3-tiny_9000.weights命令检测图片时非常不便。存在以下几个问题:

  1. 我的检测结果无法在显示图片上显示,即使检测到了结果。我一度以为我训练数据有问题训练错误。
  2. 没有检测框的(x, y w, h)的数据、目标类别、置信度提供,根本无法进一步处理数据。
  3. 每次只能检测一张图片,手动输入路径。
    更改darknet的配置文件实在是麻烦,后来发现了可以使用Python接口进行开发,官方已经提供了了darknet/python/darknet.py了示例程序。

在上述整体调试过程中遇到的一些报错记录如下:

1.

在这里插入图片描述
更改为自己文件的对应路径,运行,报错:
OSError: libdarknet.so: cannot open shared object file: No such file or directory
原因是darknet.py需要依赖 libdarknet.so文件,该文件其实就在安装好的darknet目录下,把libdarknet.so和darknet.py放在同一目录下就行了。(评论区几位朋友将libdarknet.so复制到了darknet.py目录下还是报错,这是因为libdarknet.so本身依赖其所在目录的其他库,应该将darknet.py复制到libdarknet.so所在目录)[1]

同时也要注意在文件中下面的这行路径正确:

lib = CDLL("/libdarknet.so", RTLD_GLOBAL)

2.

再次运行,报错:
ctypes.ArgumentError: argument 1 class ‘TypeError’ wrong type
原因是net = load_net(“cfg/tiny-yolo.cfg”, “tiny-yolo.weights”, 0)这个函数最后会将"cfg/tiny-yolo.cfg", "tiny-yolo.weights"这些参数传给刚才说到的libdarknet.so这个库中,而这个库是用c/c++来写的,所以出现了这个错误。解决方法是在出错的字符串前面添加一个b就行了[1],如:

net = load_net(b"cfg/tiny-yolo.cfg", b"tiny-yolo.weights", 0)
meta = load_meta(b"cfg/coco.data")
r = detect(net, meta, b"data/dog.jpg")

其他str与byte转换的方式:

1.
"../data/eagle.jpg".encode('utf-8')
2.
str.encode("/data/eagle.jpg")
str.decode("byte")

问题解决!
YoloV3-tiny训练后无法显示检测结果解决过程记录_第1张图片参考:
[1] darknet 的python接口使用

其中我还尝试了这个解决方法解决检测不显示检测框的问题:

关于Yolov3 darknet训练后检测不出物体的解决方法
下载AB版darknet后确实是可以正常使用./darknet detector 显示检测框,但运行darknet.py但由于libdarknet.so不存在无法解决所以作罢。
其github上给了很详细的开发使用教程:link

尝试使用opencv对检测结果画框

报错:Gtk-ERROR : GTK+ 2.x symbols detected. Using GTK+ 2.x and GTK+ 3 in the same process is not supported
原因是libdarknet.so使用GTK+ 2.x,而我的opencv使用GTK+ 3所以起了冲突,还在寻找简便的解决方案。

后期应该会继续进行yoloV3-tiny的Python接口开发,敬请期待!

你可能感兴趣的:(深度学习,python,linux,tensorflow,人工智能,神经网络)