Rid5
Rid5

Reputation: 11

how to fix "TypeError: main() takes 0 positional arguments but 1 was given"?

I've been trying to convert image labels that have been saved as .csv to the tensorflow.record format for object recognition. I'm fairly new to both tensorflow and using stackoverflow, please excuse my etiquette if it is out of place.

This is the code that I am using

from __future__ import division
from __future__ import print_function
from __future__ import absolute_import
import os
import io
import pandas as pd
import tensorflow as tf
from PIL import Image
from object_detection.utils import dataset_util
from collections import namedtuple, OrderedDict

flags = tf.app.flags
flags.DEFINE_string('csv_input', '', 'Path to the CSV input')
flags.DEFINE_string('output_path', '', 'Path to output TFRecord')
FLAGS = flags.FLAGS

def class_text_to_int(row_label):
    if row_label == 'Car':
        return 1
    elif row_label == 'Bike':
        return 2
    elif row_label == 'Cycle':
        return 3
    elif row_label == 'Truck':
        return 4
    else:
        return None

    def split(df, group):
    data = namedtuple('data', ['filename', 'object'])
    gb = df.groupby(group)
    return [data(filename, gb.get_group(x)) for filename, x in             zip(gb.groups.keys(), gb.groups)]

def create_tf_example(group, path):
    with tf.gfile.GFile(os.path.join(path,     '{}'.format(group.filename)), 'rb') as fid:
        encoded_jpg = fid.read()
    encoded_jpg_io = io.BytesIO(encoded_jpg)
    image = Image.open(encoded_jpg_io)
    width, height = image.size

    filename = group.filename.encode('utf8')
    image_format = b'jpg'
    xmins = []
    xmaxs = []
    ymins = []
    ymaxs = []
    classes_text = []
    classes = []

    for index, row in group.object.iterrows():
        xmins.append(row['xmin'] / width)
        xmaxs.append(row['xmax'] / width)
        ymins.append(row['ymin'] / height)
        ymaxs.append(row['ymax'] / height)
        classes_text.append(row['class'].encode('utf8'))
        classes.append(class_text_to_int(row['class']))

    tf_example = tf.train.Example(features=tf.train.Features(feature={
        'image/height': dataset_util.int64_feature(height),
        'image/width': dataset_util.int64_feature(width),
        'image/filename': dataset_util.bytes_feature(filename),
        'image/source_id': dataset_util.bytes_feature(filename),
        'image/encoded': dataset_util.bytes_feature(encoded_jpg),
        'image/format': dataset_util.bytes_feature(image_format),
        'image/object/bbox/xmin':     dataset_util.float_list_feature(xmins),
        'image/object/bbox/xmax':     dataset_util.float_list_feature(xmaxs),
        'image/object/bbox/ymin':     dataset_util.float_list_feature(ymins),
        'image/object/bbox/ymax':     dataset_util.float_list_feature(ymaxs),
        'image/object/class/text':     dataset_util.bytes_list_feature(classes_text),
        'image/object/class/label':     dataset_util.int64_list_feature(classes),
    }))
    return tf_example

def main():
    writer = tf.python_io.TFRecordWriter(FLAGS.output_path)
    path = os.path.join(os.getcwd(), 'images')
    examples = pd.read_csv(FLAGS.csv_input)
    grouped = split(examples, 'filename')
    for group in grouped:
        tf_example = create_tf_example(group, path)
        writer.write(tf_example.SerializeToString())

    writer.close()
    output_path = os.path.join(os.getcwd(), FLAGS.output_path)
    print('Successfully created the TFRecords:     {}'.format(output_path))


    if __name__ == '__main__':
        tf.app.run()

This is the output i am recieving. An empty record file is created at the end.

C:\Users\Ridyumna\Tensorflow\research\object_detection>python generate_tfrecord.py --csv_input=data/train_labels.csv --output_path=data/train.record --image_dir=images/
Traceback (most recent call last):
File "generate_tfrecord.py", line 107, in <module>
tf.app.run()
File "C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\platform\app.py", line 125, in run
    _sys.exit(main(argv))
TypeError: main() takes 0 positional arguments but 1 was given

Any help would be greatly appreciated.

Upvotes: 0

Views: 2653

Answers (1)

BoarGules
BoarGules

Reputation: 16952

tensorflow is expecting to call your main() function passing it command-line arguments. When an API or a framework calls a function you write, it will specify the name, signature (number and type of arguments) and return type of that function. You must follow those instructions to the letter, otherwise this sort of thing is bound to result.

It doesn't matter if you don't care about the command-line arguments that tensorflow is passing you. You still have to handle them. Change your main() function to conform to what tensorflow expects.

def main(argv=None):

Upvotes: 2

Related Questions