YOLO-V2实现AIP接口化

20 篇文章 0 订阅
5 篇文章 3 订阅

安装好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来了解具体细节。


##各种尝试

  1. 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脚本添加参数

本人修改的代码

使用请star

#参考文献
Python之系统交互(subprocess
Python脚本中执行shell命令
Pexpect简介

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

piepis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值