docker 通过python方式调用YOLO镜像

2023-05-16

这篇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如此:

下图为宿主机共享目录下:

这样就可以进行后续的跟进了。

运维需要勇气

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

docker 通过python方式调用YOLO镜像 的相关文章

随机推荐