【问题标题】:How can I pass an image into my code from the linux command line?如何从 linux 命令行将图像传递到我的代码中?
【发布时间】:2020-07-04 23:20:22
【问题描述】:

我正在尝试调整一些代码以更好地满足我的需求。该代码当前从一个文件夹中获取所有文件并对其运行图像识别,但我需要传递我从命令行指定的单个图像。

这是我正在使用的代码:

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
# import the necessary packages
import json
import os
import random

import cv2 as cv
import keras.backend as K
import numpy as np
import scipy.io

from utils import load_model

if __name__ == '__main__':
    img_width, img_height = 224, 224
    model = load_model()
    model.load_weights('models/model.96-0.89.hdf5')

    cars_meta = scipy.io.loadmat('devkit/cars_meta')
    class_names = cars_meta['class_names']  # shape=(1, 196)
    class_names = np.transpose(class_names)

    test_path = 'data/test/'
    test_images = [f for f in os.listdir(test_path) if
                   os.path.isfile(os.path.join(test_path, f)) and f.endswith('.jpg')]

    num_samples = 1
    samples = random.sample(test_images, num_samples)
    results = []
    for i, image_name in enumerate(samples):
        filename = os.path.join(test_path, image_name)
        print('Start processing image: {}'.format(filename))
        bgr_img = cv.imread(filename)
        bgr_img = cv.resize(bgr_img, (img_width, img_height), cv.INTER_CUBIC)
        rgb_img = cv.cvtColor(bgr_img, cv.COLOR_BGR2RGB)
        rgb_img = np.expand_dims(rgb_img, 0)
        preds = model.predict(rgb_img)
        prob = np.max(preds)
        class_id = np.argmax(preds)
        text = ('Predict: {}, prob: {}'.format(class_names[class_id][0][0], prob))
        results.append({'label': class_names[class_id][0][0], 'prob': '{:.4}'.format(prob)})
        cv.imwrite('images/{}_out.png'.format(i), bgr_img)

    print(results)
    with open('results.json', 'w') as file:
        json.dump(results, file, indent=4)

    K.clear_session()

有没有一种方法可以让我只传递一个图像,而不是整个文件夹,然后从命令行传递?

【问题讨论】:

  • 你可以直接传递并使用 sys.argv[] 列表或导入 argparse 并使用方法 pars

标签: python argv


【解决方案1】:

sys.argv 是 Python 中的一个列表,其中包含传递给脚本的命令行参数。

注意sys.argv[0]是脚本本身的名字!

所以最简单的方法是使用内置的sys.argv list。例如,如果我的脚本被调用:foo.py,我可以通过命令行向它传递参数,如下所示:

python foo.py "C:\user\myimg.jpeg"

并且在 foo.py 中,我可以像这样获取传递的参数:

import sys

if __name__ == '__main__':
    for arg in sys.argv[1:]:
        #do work with arg! arg is a string type!
        with open(arg) as fp:
            #.... do work ....   

argparse 模块

以下代码是一个 Python 程序,它接受一个整数列表并产生总和或最大值:

import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
                    help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
                    const=sum, default=max,
                    help='sum the integers (default: find the max)')

args = parser.parse_args()
print(args.accumulate(args.integers))

使用或从命令行调用:

python foo.py 1 2 3 4
output: 4

python foo.py 1 2 3 4 --sum
10

【讨论】:

    猜你喜欢
    • 2020-11-29
    • 2019-06-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 2018-09-02
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多