安装好Yolo-v2后,官方给出的调用化方法为,在命令行界面输入
./darknet detect cfg/yolov3.cfg cfg/yolov3.weights /home/it/Yolo/crop001007.png
这种方式并不对python代码友好。于是我选择用subprocess
模块来实现模拟命令行调用。
#getstatusoutput调用
声明:环境 python3.6
废话少说,先上代码:
import subprocess
import os
import shutil
from PedestrainWeb.Utils.readyaml import ReadYaml
from PedestrainWeb.Utils.fileutil import FileUtil
def yoloRredict(imagePath):
config = ReadYaml(os.path.join(FileUtil.getProjectObsPath(),'PedestrainConfig.yaml')).getValue()
darknet_path = config['darknet_path'] #darknet 存放路径
dir = os.path.dirname(FileUtil.getProjectObsPath()) #根目录
PedestrainImgPath, f = os.path.split(imagePath)
dir_string = 'cd {0} && ./darknet detect cfg/yolov3.cfg cfg/yolov3.weights {1}'.format(darknet_path,os.path.join(dir,imagePath))
(status, output)=subprocess.getstatusoutput(dir_string)
shutil.copy(os.path.join(darknet_path,'predictions.png'), os.path.join(dir,PedestrainImgPath)) # 移动文件到目标路径(移动文件呢,目标路径)
return os.path.join(PedestrainImgPath,'predictions.png'),len(output.split('person'))-1
if __name__ == '__main__':
imagePath ="cache/PedestrainWeb_Img/b44e1395.PNG"
yoloRredict(imagePath)
在这里我用到的是subprocess.getstatusoutput
。若环境是python2.7
的同学,请尝试使用command, status,output = commands.getstatusoutput("cmd")
。
早期的Python版本中,主要是通过os.system()、os.popen().read()等函数来执行命令行指令的,另外还有一个很少使用的commands模块。但是从Python 2.4开始官方文档中建议使用的是subprocess模块,commands模块的功能已经被整合到subprocess中了。可查看官方commands来了解具体细节。
##各种尝试
- pExpect
在最开始的时候,我曾尝试用pExpect
模块来实现该功能。
import pexpect
input_string='./darknet detect cfg/yolov3.cfg cfg/yolov3.weights /home/it/Yolo/crop001007.png'
# 启动FTP服务器,并将运行期间的输出都放到标准输出中
process = pexpect.spawn('cd /home/it/Yolo/darknet')
process.logfile_read = sys.stdout
结果发现spawm
没任何输出,因为spawm函数第一个必须输入一个命令,然后我就放弃了。
2. sh脚本实现
#!/bin/bash
cd /home/it/Yolo/darknet && ./darknet detect cfg/yolov3.cfg cfg/yolov3.weights /home/it/Yolo/crop001007.png
后来我换了一种思路,用shell脚本能实现该功能。在这里将识别路径用 ¥1
设置成变量即可。结果能实现。
3. os.system()函数
>>> import os
>>>
>>> retcode = os.system('dir')
os.sysyem能实现,也能给shell脚本添加参数,却没办法记录stdout的输入内容
4.os.popen()函数
>>> import os
>>>
>>> ret = os.popen('dir').read()
popen函数,能实现shell脚本,却没办法给shell脚本添加参数