docker 通过python方式调用YOLO镜像
这篇blog记录下配置的yolov3的docker环境(cuda9+cudnn7+ubuntu16.04)可以pull我的镜像 已经pull在docker.hub上了docker pull cheney0813/yolo3-darknet-ubuntu16.04主要实现的是动态检测系统的调用算法部分 通过python调用docker容器完成相应图片的检测并将对应图片的检测结果(js...
这篇blog记录下配置的yolov3的docker环境(cuda9+cudnn7+ubuntu16.04)
可以pull我的镜像 已经pull在docker.hub上了
docker pull cheney0813/yolo3-darknet-ubuntu16.04
主要实现的是动态检测系统的调用算法部分 通过python调用docker容器完成相应图片的检测并将对应图片的检测结果(json文件输出)
主要利用了docker容器与宿主机之间的共享目录。 话不多说上代码:
server.py 这个python文件的主要作用是接收网络服务器送来的图片名字,然后通过docker-py开启一个yolov3的docker容器,开启容器的时候调用test.py去执行yolov3的检测API。然后将返回的txt转成json文件。
import docker
import tarfile
import json
import sys
cli=docker.from_env()
volumes={'/home/aeroplane/test':{'bind':'/home/yolov3/darknet/test','mode':'rw'}}
container=cli.containers.run(
image="aeroplane-yolov3",
command="bash",
detach=True,
tty=True,
volumes=volumes,
runtime = 'nvidia'
)
#container=cli.containers.get()
filename = 'dog.jpg'
#filename = sys.argv[1]
result=container.exec_run(cmd="python /home/yolov3/darknet/test/test.py " +filename)
print(result[1])
container.remove(force=True)
txtname = filename.split('.')[0]+'.txt'
jsoname = filename.split('.')[0]+'.json'
list =[]
input_file = open(txtname,'r')
output_file = open(jsoname,'w')
for line in input_file.readlines():
line =line.strip('\n')
slist ={}
slist['filename']= filename
ss = line.split(' ')
category = ss[0]
sorce = ss[1]
bbox = ss[2]
slist[category.split(':')[0]]= category.split(':')[1]
slist[sorce.split(':')[0]]= sorce.split(':')[1]
slist[bbox.split(':')[0]]=bbox.split(':')[1]
list.append(slist)
output_file.write(json.dumps(list, ensure_ascii=False))
input_file.close()
output_file.close()
test.py
import os
import sys
filename = sys.argv[1]
name = filename.split('.')[0]
os.system('cd /home/yolov3/darknet && ./darknet detect cfg/yolov3.cfg yolov3_final.weights ./test/'+filename +' >'+name+'.txt'+' && cp ./'+name+'.txt' +' /home/yolov3/darknet/test')
这个python文件接收server.py传入的图片名称进行detect的调用,保存检测结果并且拷贝至共享目录下。首先说这里为什么没直接用yolo提供的valid命令。这个命令默认需要4张图片,而我们每次一个response只有一张图片,所以不合适,如果用了会报段错误。挑了好久这个恶心的bug。在这里我改了两处代码
首先在examples/detector.c中注释掉了(598行)要不也会存入txt文件中。
然后参考https://www.cnblogs.com/leihui/p/9548910.html修改/src/image.c文件。
这样test.py生成的txt就对应如此:
转后的json如此:
下图为宿主机共享目录下:
这样就可以进行后续的跟进了。
运维需要勇气
更多推荐
所有评论(0)