forked from dctian/DeepPiCar
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'master' of https://github.com/dctian/DeepPiCar
- Loading branch information
Showing
93 changed files
with
2,651 additions
and
0 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,134 @@ | ||
""" | ||
Usage: | ||
# Create train data: | ||
python generate_tfrecord.py --label=<LABEL> --csv_input=<PATH_TO_ANNOTATIONS_FOLDER>/train_labels.csv --output_path=<PATH_TO_ANNOTATIONS_FOLDER>/train.record <PATH_TO_ANNOTATIONS_FOLDER>/label_map.pbtxt | ||
# Create test data: | ||
python generate_tfrecord.py --label=<LABEL> --csv_input=<PATH_TO_ANNOTATIONS_FOLDER>/test_labels.csv --output_path=<PATH_TO_ANNOTATIONS_FOLDER>/test.record --label_map <PATH_TO_ANNOTATIONS_FOLDER>/label_map.pbtxt | ||
""" | ||
|
||
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 | ||
import sys | ||
|
||
sys.path.append("../../models/research") | ||
|
||
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.DEFINE_string( | ||
"label_map", | ||
"", | ||
"Path to the `label_map.pbtxt` contains the <class_name>:<class_index> pairs generated by `xml_to_csv.py` or manually.", | ||
) | ||
# if your image has more labels input them as | ||
# flags.DEFINE_string('label0', '', 'Name of class[0] label') | ||
# flags.DEFINE_string('label1', '', 'Name of class[1] label') | ||
# and so on. | ||
flags.DEFINE_string("img_path", "", "Path to images") | ||
FLAGS = flags.FLAGS | ||
|
||
|
||
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, label_map): | ||
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"png" | ||
# check if the image format is matching with your images. | ||
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")) | ||
class_index = label_map.get(row["class"]) | ||
assert ( | ||
class_index is not None | ||
), "class label: `{}` not found in label_map: {}".format( | ||
row["class"], label_map | ||
) | ||
classes.append(class_index) | ||
|
||
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(), FLAGS.img_path) | ||
examples = pd.read_csv(FLAGS.csv_input) | ||
|
||
# Load the `label_map` from pbtxt file. | ||
from object_detection.utils import label_map_util | ||
|
||
label_map = label_map_util.load_labelmap(FLAGS.label_map) | ||
categories = label_map_util.convert_label_map_to_categories( | ||
label_map, max_num_classes=90, use_display_name=True | ||
) | ||
category_index = label_map_util.create_category_index(categories) | ||
label_map = {} | ||
for k, v in category_index.items(): | ||
label_map[v.get("name")] = v.get("id") | ||
|
||
grouped = split(examples, "filename") | ||
for group in grouped: | ||
tf_example = create_tf_example(group, path, label_map) | ||
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() |
1 change: 1 addition & 0 deletions
1
models/object_detection/code/tensorflow_traffic_sign_detection.ipynb
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,118 @@ | ||
""" | ||
Usage: | ||
# Create train data: | ||
python xml_to_csv.py -i [PATH_TO_IMAGES_FOLDER]/train -o [PATH_TO_ANNOTATIONS_FOLDER]/train_labels.csv | ||
# Create test data: | ||
python xml_to_csv.py -i [PATH_TO_IMAGES_FOLDER]/test -o [PATH_TO_ANNOTATIONS_FOLDER]/test_labels.csv | ||
""" | ||
|
||
import os | ||
import glob | ||
import pandas as pd | ||
import argparse | ||
import xml.etree.ElementTree as ET | ||
|
||
|
||
def xml_to_csv(path): | ||
"""Iterates through all .xml files (generated by labelImg) in a given directory and combines them in a single Pandas datagrame. | ||
Parameters: | ||
---------- | ||
path : {str} | ||
The path containing the .xml files | ||
Returns | ||
------- | ||
Pandas DataFrame | ||
The produced dataframe | ||
""" | ||
classes_names = [] | ||
xml_list = [] | ||
for xml_file in glob.glob(path + "/*.xml"): | ||
tree = ET.parse(xml_file) | ||
root = tree.getroot() | ||
for member in root.findall("object"): | ||
classes_names.append(member[0].text) | ||
value = ( | ||
root.find("filename").text, | ||
int(root.find("size")[0].text), | ||
int(root.find("size")[1].text), | ||
member[0].text, | ||
int(member[4][0].text), | ||
int(member[4][1].text), | ||
int(member[4][2].text), | ||
int(member[4][3].text), | ||
) | ||
xml_list.append(value) | ||
column_name = [ | ||
"filename", | ||
"width", | ||
"height", | ||
"class", | ||
"xmin", | ||
"ymin", | ||
"xmax", | ||
"ymax", | ||
] | ||
xml_df = pd.DataFrame(xml_list, columns=column_name) | ||
classes_names = list(set(classes_names)) | ||
classes_names.sort() | ||
return xml_df, classes_names | ||
|
||
|
||
def main(): | ||
# Initiate argument parser | ||
parser = argparse.ArgumentParser( | ||
description="Sample TensorFlow XML-to-CSV converter" | ||
) | ||
parser.add_argument( | ||
"-i", | ||
"--inputDir", | ||
help="Path to the folder where the input .xml files are stored", | ||
type=str, | ||
) | ||
parser.add_argument( | ||
"-o", "--outputFile", help="Name of output .csv file (including path)", type=str | ||
) | ||
|
||
parser.add_argument( | ||
"-l", | ||
"--labelMapDir", | ||
help="Directory path to save label_map.pbtxt file is specified.", | ||
type=str, | ||
default="", | ||
) | ||
|
||
args = parser.parse_args() | ||
|
||
if args.inputDir is None: | ||
args.inputDir = os.getcwd() | ||
if args.outputFile is None: | ||
args.outputFile = args.inputDir + "/labels.csv" | ||
|
||
assert os.path.isdir(args.inputDir) | ||
os.makedirs(os.path.dirname(args.outputFile), exist_ok=True) | ||
xml_df, classes_names = xml_to_csv(args.inputDir) | ||
xml_df.to_csv(args.outputFile, index=None) | ||
print("Successfully converted xml to csv.") | ||
if args.labelMapDir: | ||
os.makedirs(args.labelMapDir, exist_ok=True) | ||
label_map_path = os.path.join(args.labelMapDir, "label_map.pbtxt") | ||
print("Generate `{}`".format(label_map_path)) | ||
|
||
# Create the `label_map.pbtxt` file | ||
pbtxt_content = "" | ||
for i, class_name in enumerate(classes_names): | ||
pbtxt_content = ( | ||
pbtxt_content | ||
+ "item {{\n id: {0}\n name: '{1}'\n}}\n\n".format( | ||
i + 1, class_name | ||
) | ||
) | ||
pbtxt_content = pbtxt_content.strip() | ||
with open(label_map_path, "w") as f: | ||
f.write(pbtxt_content) | ||
|
||
|
||
if __name__ == "__main__": | ||
main() |
Empty file.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
38 changes: 38 additions & 0 deletions
38
models/object_detection/data/images/test/car_video_3_100.xml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
<annotation> | ||
<folder>train</folder> | ||
<filename>car_video_3_100.png</filename> | ||
<path>D:\temp\train\car_video_3_100.png</path> | ||
<source> | ||
<database>Unknown</database> | ||
</source> | ||
<size> | ||
<width>320</width> | ||
<height>240</height> | ||
<depth>3</depth> | ||
</size> | ||
<segmented>0</segmented> | ||
<object> | ||
<name>Speed Limit 25</name> | ||
<pose>Unspecified</pose> | ||
<truncated>0</truncated> | ||
<difficult>0</difficult> | ||
<bndbox> | ||
<xmin>116</xmin> | ||
<ymin>73</ymin> | ||
<xmax>129</xmax> | ||
<ymax>86</ymax> | ||
</bndbox> | ||
</object> | ||
<object> | ||
<name>Stop Sign</name> | ||
<pose>Unspecified</pose> | ||
<truncated>0</truncated> | ||
<difficult>0</difficult> | ||
<bndbox> | ||
<xmin>19</xmin> | ||
<ymin>82</ymin> | ||
<xmax>32</xmax> | ||
<ymax>95</ymax> | ||
</bndbox> | ||
</object> | ||
</annotation> |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
38 changes: 38 additions & 0 deletions
38
models/object_detection/data/images/test/car_video_4_002.xml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
<annotation> | ||
<folder>train</folder> | ||
<filename>car_video_4_002.png</filename> | ||
<path>D:\temp\train\car_video_4_002.png</path> | ||
<source> | ||
<database>Unknown</database> | ||
</source> | ||
<size> | ||
<width>320</width> | ||
<height>240</height> | ||
<depth>3</depth> | ||
</size> | ||
<segmented>0</segmented> | ||
<object> | ||
<name>Red Traffic Light</name> | ||
<pose>Unspecified</pose> | ||
<truncated>0</truncated> | ||
<difficult>0</difficult> | ||
<bndbox> | ||
<xmin>56</xmin> | ||
<ymin>77</ymin> | ||
<xmax>75</xmax> | ||
<ymax>94</ymax> | ||
</bndbox> | ||
</object> | ||
<object> | ||
<name>Red Traffic Light</name> | ||
<pose>Unspecified</pose> | ||
<truncated>0</truncated> | ||
<difficult>0</difficult> | ||
<bndbox> | ||
<xmin>210</xmin> | ||
<ymin>78</ymin> | ||
<xmax>220</xmax> | ||
<ymax>100</ymax> | ||
</bndbox> | ||
</object> | ||
</annotation> |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
38 changes: 38 additions & 0 deletions
38
models/object_detection/data/images/test/car_video_4_273.xml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
<annotation> | ||
<folder>train</folder> | ||
<filename>car_video_4_273.png</filename> | ||
<path>D:\temp\train\car_video_4_273.png</path> | ||
<source> | ||
<database>Unknown</database> | ||
</source> | ||
<size> | ||
<width>320</width> | ||
<height>240</height> | ||
<depth>3</depth> | ||
</size> | ||
<segmented>0</segmented> | ||
<object> | ||
<name>Speed Limit 40</name> | ||
<pose>Unspecified</pose> | ||
<truncated>0</truncated> | ||
<difficult>0</difficult> | ||
<bndbox> | ||
<xmin>150</xmin> | ||
<ymin>74</ymin> | ||
<xmax>163</xmax> | ||
<ymax>89</ymax> | ||
</bndbox> | ||
</object> | ||
<object> | ||
<name>Stop Sign</name> | ||
<pose>Unspecified</pose> | ||
<truncated>0</truncated> | ||
<difficult>0</difficult> | ||
<bndbox> | ||
<xmin>271</xmin> | ||
<ymin>88</ymin> | ||
<xmax>280</xmax> | ||
<ymax>100</ymax> | ||
</bndbox> | ||
</object> | ||
</annotation> |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Oops, something went wrong.