我的AI之路(20)--用Tensorflow object_detection跑raccoon数据集

Tensorflow object detection API 搭建自己的目标识别模型 在上一期(https://blog.youkuaiyun.com/qq_42862167/article/details/98883331) 中 我们搭建了目标识别的环境并且测试了自带的案例 本期我们将使用自己的图片进行相应的目标识别 本次我们使用Demo里面的 ssd_mobilenet_v1_coco_2017_11_17 进行识别,且 ssd_mobilenet_v1_coco_2017_11_17 速... 阅读详情

    Raccoon是一个小巧有趣的加标签了的数据集,总共200张图片,用来训练识别浣熊,我们用它来学习体验object_detection的训练测试过程是可以的。

     到https://github.com/datitran/raccoon_dataset 下载zip压缩文件到本地解压到D:\AI\dataset\raccoon_dataset-master,可以看到,在images下就是图片,在annotations下面是对应的标签文件,data目录下是作者生成好的tensorflow支持的tfrecord格式的数据文件(*.record)和caffe等支持的csv格式的数据文件(*.csv),training目录下则是作者改写好的针对ssd_mobilenet_v1网络模型的配置文件(ssd_mobilenet_v1_pets.config)和识别类别ID和名称的配置文件(object-detection.pbtxt)以及作者训练出的模型文件(output_inference_graph.pb),这里我们自己做ssd网络配置和生成tfrecord数据,不直接使用作者的文件,以体验配置->训练->测试的全过程。

      首先把200张图片划分成训练集和测试集,使用下面的脚本生成全体文件的名字列表写入文件file_list.txt:

         import os
         fd=r"D:\AI\dataset\raccoon_dataset-master\images"
         image_name=os.listdir(fd)
         f = open("file_list.txt", "w")
         for temp in image_name:
            if temp.endswith(".jpg"):
               f.write(temp.replace('.jpg','\n'))
         f.close()

然后,把列表按照 80%:20% 的一般划分规矩分成两部分分成两个文件保存:train.txt和eval.txt,分别用作训练和测试,

train.txt内容 :

raccoon-194
raccoon-101
raccoon-4
raccoon-105
raccoon-97
raccoon-113
raccoon-48
raccoon-108
raccoon-156
raccoon-55
raccoon-161
raccoon-2
raccoon-59
raccoon-18
raccoon-41
raccoon-126
raccoon-79
raccoon-23
raccoon-92
raccoon-58
raccoon-153
raccoon-165
raccoon-182
raccoon-122
raccoon-95
raccoon-86
raccoon-6
raccoon-99
raccoon-46
raccoon-130
raccoon-167
raccoon-186
raccoon-183
raccoon-177
raccoon-170
raccoon-179
raccoon-73
raccoon-82
raccoon-5
raccoon-10
raccoon-94
raccoon-30
raccoon-67
raccoon-85
raccoon-87
raccoon-112
raccoon-174
raccoon-196
raccoon-134
raccoon-133
raccoon-148
raccoon-13
raccoon-89
raccoon-16
raccoon-128
raccoon-150
raccoon-106
raccoon-120
raccoon-144
raccoon-137
raccoon-12
raccoon-140
raccoon-21
raccoon-141
raccoon-107
raccoon-47
raccoon-29
raccoon-115
raccoon-25
raccoon-124
raccoon-3
raccoon-1
raccoon-131
raccoon-50
raccoon-103
raccoon-80
raccoon-71
raccoon-42
raccoon-142
raccoon-176
raccoon-149
raccoon-33
raccoon-132
raccoon-118
raccoon-26
raccoon-65
raccoon-43
raccoon-200
raccoon-135
raccoon-154
raccoon-93
raccoon-22
raccoon-36
raccoon-69
raccoon-96
raccoon-114
raccoon-181
raccoon-84
raccoon-193
raccoon-68
raccoon-192
raccoon-70
raccoon-74
raccoon-88
raccoon-8
raccoon-34
raccoon-139
raccoon-91
raccoon-109
raccoon-27
raccoon-54
raccoon-52
raccoon-185
raccoon-136
raccoon-61
raccoon-127
raccoon-98
raccoon-155
raccoon-75
raccoon-28
raccoon-173
raccoon-57
raccoon-56
raccoon-187
raccoon-160
raccoon-35
raccoon-151
raccoon-175
raccoon-129
raccoon-20
raccoon-116
raccoon-66
raccoon-37
raccoon-180
raccoon-143
raccoon-40
raccoon-76
raccoon-111
raccoon-64
raccoon-24
raccoon-60
raccoon-168
raccoon-17
raccoon-32
raccoon-147
raccoon-117
raccoon-172
raccoon-189
raccoon-45
raccoon-81
raccoon-7
raccoon-63
raccoon-110
raccoon-198
raccoon-100
raccoon-39
raccoon-9
raccoon-19
raccoon-195
raccoon-197

eval.txt内容:

raccoon-138
raccoon-90
raccoon-44
raccoon-152
raccoon-162
raccoon-190
raccoon-191
raccoon-51
raccoon-62
raccoon-102
raccoon-119
raccoon-178
raccoon-49
raccoon-184
raccoon-72
raccoon-157
raccoon-14
raccoon-163
raccoon-53
raccoon-188
raccoon-104
raccoon-169
raccoon-146
raccoon-164
raccoon-31
raccoon-166
raccoon-171
raccoon-78
raccoon-77
raccoon-145
raccoon-199
raccoon-123
raccoon-11
raccoon-83
raccoon-158
raccoon-125
raccoon-15
raccoon-159
raccoon-38
raccoon-121

      然后,把training目录下的object-detection.pbtxt文件拷贝到上层目录D:\AI\dataset\raccoon_dataset-master下,改名为raccoon_label_map.pbtxt即可,这个文件我们可以直接使用作者的。

  从D:\AI\tensorflow\models\research\object_detection\dataset_tools目录下找到create_pascal_tf_record.py拷贝并复制一个文件,将复制文件改名文件为create_pascal_tf_record4raccon.py,并根据数据集的文件路径和命令执行参数修改内容如下:

# Copyright 2017 The TensorFlow Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ==============================================================================

r"""Convert raw PASCAL dataset to TFRecord for object_detection.

Example usage:
    python object_detection\dataset_tools\create_pascal_tf_record4raccon.py ^
        --data_dir=D:\AI\dataset\raccoon_dataset-master\images ^
        --set=D:\AI\dataset\raccoon_dataset-master\train.txt ^
        --output_path=D:\AI\dataset\raccoon_dataset-master\train.record ^
        --label_map_path=D:\AI\dataset\raccoon_dataset-master\raccoon_label_map.pbtxt ^
        --annotations_dir=D:\AI\dataset\raccoon_dataset-master\annotations
"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import hashlib
import io
import logging
import os

from lxml import etree
import PIL.Image
import tensorflow as tf

from object_detection.utils import dataset_util
from object_detection.utils import label_map_util


flags = tf.app.flags
flags.DEFINE_string('data_dir', '', 'Root directory to raw PASCAL VOC dataset.')
flags.DEFINE_string('set', 'train', 'Convert training set, validation set or '
                    'merged set.')
flags.DEFINE_string('annotations_dir', 'Annotations',
                    '(Relative) path to annotations directory.')
flags.DEFINE_string('year', 'VOC2007', 'Desired challenge year.')
flags.DEFINE_string('output_path', '', 'Path to output TFRecord')
flags.DEFINE_string('label_map_path', 'data/pascal_label_map.pbtxt',
                    'Path to label map proto')
flags.DEFINE_boolean('ignore_difficult_instances', False, 'Whether to ignore '
                     'difficult instances')
FLAGS = flags.FLAGS

SETS = ['train', 'val', 'trainval', 'test']
YEARS = ['VOC2007', 'VOC2012', 'merged']


def dict_to_tf_example(data,
                       dataset_directory,
                       label_map_dict,
                       ignore_difficult_instances=False,
                       image_subdirectory='JPEGImages'):
  """Convert XML derived dict to tf.Example proto.

  Notice that this function normalizes the bounding box coordinates provided
  by the raw data.

  Args:
    data: dict holding PASCAL XML fields for a single image (obtained by
      running dataset_util.recursive_parse_xml_to_dict)
    dataset_directory: Path to root directory holding PASCAL dataset
    label_map_dict: A map from string label names to integers ids.
    ignore_difficult_instances: Whether to skip difficult instances in the
      dataset  (default: False).
    image_subdirectory: String specifying subdirectory within the
      PASCAL dataset directory holding the actual image data.

  Returns:
    example: The converted tf.Example.

  Raises:
    ValueError: if the image pointed to by data['filename'] is not a valid JPEG
  """
  img_path = os.path.join(dataset_directory, data['filename'].replace('.png','.jpg').replace('.PNG','.jpg'))
  full_path = img_path

  with tf.gfile.GFile(full_path, 'rb') as fid:
    encoded_jpg = fid.read()
  encoded_jpg_io = io.BytesIO(encoded_jpg)
  image = PIL.Image.open(encoded_jpg_io)
  if image.format != 'JPEG':
    raise ValueError('Image format not JPEG')
  key = hashlib.sha256(encoded_jpg).hexdigest()

  width = int(data['size']['width'])
  height = int(data['size']['height'])

  xmin = []
  ymin = []
  xmax = []
  ymax = []
  classes = []
  classes_text = []
  truncated = []
  poses = []
  difficult_obj = []
  if 'object' in data:
    for obj in data['object']:
      difficult = bool(int(obj['difficult']))
      if ignore_difficult_instances and difficult:
        continue

      difficult_obj.append(int(difficult))

      xmin.append(float(obj['bndbox']['xmin']) / width)
      ymin.append(float(obj['bndbox']['ymin']) / height)
      xmax.append(float(obj['bndbox']['xmax']) / width)
      ymax.append(float(obj['bndbox']['ymax']) / height)
      classes_text.append(obj['name'].encode('utf8'))
      classes.append(label_map_dict[obj['name']])
      truncated.append(int(obj['truncated']))
      poses.append(obj['pose'].encode('utf8'))

  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(
          data['filename'].encode('utf8')),
      'image/source_id': dataset_util.bytes_feature(
          data['filename'].encode('utf8')),
      'image/key/sha256': dataset_util.bytes_feature(key.encode('utf8')),
      'image/encoded': dataset_util.bytes_feature(encoded_jpg),
      'image/format': dataset_util.bytes_feature('jpeg'.encode('utf8')),
      'image/object/bbox/xmin': dataset_util.float_list_feature(xmin),
      'image/object/bbox/xmax': dataset_util.float_list_feature(xmax),
      'image/object/bbox/ymin': dataset_util.float_list_feature(ymin),
      'image/object/bbox/ymax': dataset_util.float_list_feature(ymax),
      'image/object/class/text': dataset_util.bytes_list_feature(classes_text),
      'image/object/class/label': dataset_util.int64_list_feature(classes),
      'image/object/difficult': dataset_util.int64_list_feature(difficult_obj),
      'image/object/truncated': dataset_util.int64_list_feature(truncated),
      'image/object/view': dataset_util.bytes_list_feature(poses),
  }))
  return example


def main(_):
  #if FLAGS.set not in SETS:
  #  raise ValueError('set must be in : {}'.format(SETS))
  #if FLAGS.year not in YEARS:
  #  raise ValueError('year must be in : {}'.format(YEARS))

  data_dir = FLAGS.data_dir
  years = ['VOC2007', 'VOC2012']
  if FLAGS.year != 'merged':
    years = [FLAGS.year]

  writer = tf.python_io.TFRecordWriter(FLAGS.output_path)

  label_map_dict = label_map_util.get_label_map_dict(FLAGS.label_map_path)

  for year in years:
    logging.info('Reading from PASCAL %s dataset.', year)
    examples_path = FLAGS.set
    #                             'aeroplane_' + FLAGS.set + '.txt')
    annotations_dir = FLAGS.annotations_dir
    examples_list = dataset_util.read_examples_list(examples_path)
    for idx, example in enumerate(examples_list):
      if idx % 100 == 0:
        logging.info('On image %d of %d', idx, len(examples_list))
      path = os.path.join(annotations_dir, example + '.xml')
      with tf.gfile.GFile(path, 'r') as fid:
        xml_str = fid.read()
      xml = etree.fromstring(xml_str)
      data = dataset_util.recursive_parse_xml_to_dict(xml)['annotation']

      tf_example = dict_to_tf_example(data, FLAGS.data_dir, label_map_dict,
                                      FLAGS.ignore_difficult_instances)
      writer.write(tf_example.SerializeToString())

  writer.close()


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

对照原来的create_pascal_tf_record.py,你会发现主要是修改了图片文件的获取路径和名字以及命令执行参数set,因为原来的代码中写的跟数据集实际情况不符。

     做好了上面的准备,下面可以执行命令生成tfrecord格式的训练和测试/验证数据了,执行下面命令生成训练数据文件train.record:

        cd D:\AI\tensorflow\models\research

        python object_detection\dataset_tools\create_pascal_tf_record4raccon.py ^
            --data_dir=D:\AI\dataset\raccoon_dataset-master\images ^
            --set=D:\AI\dataset\raccoon_dataset-master\train.txt ^
            --output_path=D:\AI\dataset\raccoon_dataset-master\train.record ^
            --label_map_path=D:\AI\dataset\raccoon_dataset-master\raccoon_label_map.pbtxt ^
            --annotations_dir=D:\AI\dataset\raccoon_dataset-master\annotations

   执行下面命令生成测试/验证数据文件eval.record:

         python object_detection\dataset_tools\create_pascal_tf_record4raccon.py ^
            --data_dir=D:\AI\dataset\raccoon_dataset-master\images ^
            --set=D:\AI\dataset\raccoon_dataset-master\val.txt ^
            --output_path=D:\AI\dataset\raccoon_dataset-master\eval.record ^
            --label_map_path=D:\AI\dataset\raccoon_dataset-master\raccoon_label_map.pbtxt ^
            --annotations_dir=D:\AI\dataset\raccoon_dataset-master\annotations

如果执行上面第一个命令时出现下面的错误:

这说明你忘了设置PYTHONPATH环境变量,最好把这个环境变量设置到系统的用户环境变量里去(linux下当然设置到.bashrc里):

临时设置的话,执行下面命令即可: 

    set PYTHONPATH=D:\AI\tensorflow\models\research;D:\AI\tensorflow\models\research\slim

每次执行命令时最后打印输出 if not xml:,这是正常输出:

执行完上面的pascal voc转化成tfrecord数据的命令后,D:\AI\dataset\raccoon_dataset-master\eval.record下面可以看到train.record和eval.record生成了。

 

     下面下载ssd_mobilenet_v1 网络模型文件ssd_mobilenet_v1_coco ,解压到D:\AI\tensorflow\models\research\object_detection下面:

      

然后,把D:\AI\tensorflow\models\research\object_detection\samples\configs下的ssd_mobilenet_v1_coco.config 复制到 D:\AI\dataset\raccoon_dataset-master下,重命名为ssd_mobilenet_v1_raccoon.config,并修改如下以指定网络模型文件和数据文件以及指定类别数等:

# SSD with Mobilenet v1 configuration for MSCOCO Dataset.
# Users should configure the fine_tune_checkpoint field in the train config as
# well as the label_map_path and input_path fields in the train_input_reader and
# eval_input_reader. Search for "PATH_TO_BE_CONFIGURED" to find the fields that
# should be configured.


model {
  ssd {
    num_classes: 1
    box_coder {
      faster_rcnn_box_coder {
        y_scale: 10.0
        x_scale: 10.0
        height_scale: 5.0
        width_scale: 5.0
      }
    }

    matcher {
      argmax_matcher {
        matched_threshold: 0.5
        unmatched_threshold: 0.5
        ignore_thresholds: false
        negatives_lower_than_unmatched: true
        force_match_for_each_row: true
      }
    }
    similarity_calculator {
      iou_similarity {
      }
    }
    anchor_generator {
      ssd_anchor_generator {
        num_layers: 6
        min_scale: 0.2
        max_scale: 0.95
        aspect_ratios: 1.0
        aspect_ratios: 2.0
        aspect_ratios: 0.5
        aspect_ratios: 3.0
        aspect_ratios: 0.3333
      }
    }
    image_resizer {
      fixed_shape_resizer {
        height: 300
        width: 300
      }
    }
    box_predictor {
      convolutional_box_predictor {
        min_depth: 0
        max_depth: 0
        num_layers_before_predictor: 0
        use_dropout: false
        dropout_keep_probability: 0.8
        kernel_size: 1
        box_code_size: 4
        apply_sigmoid_to_scores: false
        conv_hyperparams {
          activation: RELU_6,
          regularizer {
            l2_regularizer {
              weight: 0.00004
            }
          }
          initializer {
            truncated_normal_initializer {
              stddev: 0.03
              mean: 0.0
            }
          }
          batch_norm {
            train: true,
            scale: true,
            center: true,
            decay: 0.9997,
            epsilon: 0.001,
          }
        }
      }
    }
    feature_extractor {
      type: 'ssd_mobilenet_v1'
      min_depth: 16
      depth_multiplier: 1.0
      conv_hyperparams {
        activation: RELU_6,
        regularizer {
          l2_regularizer {
            weight: 0.00004
          }
        }
        initializer {
          truncated_normal_initializer {
            stddev: 0.03
            mean: 0.0
          }
        }
        batch_norm {
          train: true,
          scale: true,
          center: true,
          decay: 0.9997,
          epsilon: 0.001,
        }
      }
    }
    loss {
      classification_loss {
        weighted_sigmoid {
        }
      }
      localization_loss {
        weighted_smooth_l1 {
        }
      }
      hard_example_miner {
        num_hard_examples: 3000
        iou_threshold: 0.99
        loss_type: CLASSIFICATION
        max_negatives_per_positive: 3
        min_negatives_per_image: 0
      }
      classification_weight: 1.0
      localization_weight: 1.0
    }
    normalize_loss_by_num_matches: true
    post_processing {
      batch_non_max_suppression {
        score_threshold: 1e-8
        iou_threshold: 0.6
        max_detections_per_class: 100
        max_total_detections: 100
      }
      score_converter: SIGMOID
    }
  }
}

train_config: {
  batch_size: 24
  optimizer {
    rms_prop_optimizer: {
      learning_rate: {
        exponential_decay_learning_rate {
          initial_learning_rate: 0.004
          decay_steps: 800720
          decay_factor: 0.95
        }
      }
      momentum_optimizer_value: 0.9
      decay: 0.9
      epsilon: 1.0
    }
  }
fine_tune_checkpoint: "D:\\AI\\tensorflow\\models\\research\\object_detection\\ssd_mobilenet_v1_coco_2017_11_17\\model.ckpt"
  from_detection_checkpoint: true
  # Note: The below line limits the training process to 200K steps, which we
  # empirically found to be sufficient enough to train the pets dataset. This
  # effectively bypasses the learning rate schedule (the learning rate will
  # never decay). Remove the below line to train indefinitely.
  num_steps: 200000
  data_augmentation_options {
    random_horizontal_flip {
    }
  }
  data_augmentation_options {
    ssd_random_crop {
    }
  }
}


train_input_reader: {
  tf_record_input_reader {
    input_path: "D:\\AI\\dataset\\raccoon_dataset-master\\train.record"
  }
  label_map_path: "D:\\AI\\dataset\\raccoon_dataset-master\\raccoon_label_map.pbtxt"
}


eval_config: {
  num_examples: 40
  # Note: The below line limits the evaluation process to 10 evaluations.
  # Remove the below line to evaluate indefinitely.
  max_evals: 10
}


eval_input_reader: {
  tf_record_input_reader {
    input_path: "D:\\AI\\dataset\\raccoon_dataset-master\\eval.record"
  }
  label_map_path: "D:\\AI\\dataset\\raccoon_dataset-master\\raccoon_label_map.pbtxt"
  shuffle: false
  num_readers: 1
}

 

model_main.py默认并没有打开tensorflow日志,所以需要在初始化部分加一句:

   tf.logging.set_verbosity(tf.logging.INFO)

另外,如果你使用的笔记本只有一块内存不大的GPU的话,可能会出现GPU内存溢出(run out of memory)的情况导致后面计算出错(Model diverged with loss = NaN)进行不下去:

这时可以在model_main.py的main()函数里限制GPU的使用率:

  from tensorflow.core.protobuf import config_pb2

  gpu_options= config_pb2.GPUOptions(per_process_gpu_memory_fraction=0.5)
  session_config = config_pb2.ConfigProto(log_device_placement=True,gpu_options=gpu_options)

  config = tf.estimator.RunConfig(model_dir=FLAGS.model_dir,session_config=session_config)

或者可以禁止GPU的使用(当然会变慢点),在model_main.py的初始化部分增加:

import os

os.environ['CUDA_VISIBLE_DEVICES']='-1'

 

然后,在D:\AI\dataset\raccoon_dataset-master下创建train_result和eval_result两个目录,然后执行下面的命令进行训练和测试/验证:

python model_main.py ^
   --logtostderr ^
   --model_dir=D:\AI\dataset\raccoon_dataset-master\train_result ^
   --pipeline_config_path=D:\AI\dataset\raccoon_dataset-master\ssd_mobilenet_v1_racoon.config ^
   --num_train_steps=10000

python model_main.py ^
   --logtostderr ^
   --model_dir=D:\AI\dataset\raccoon_dataset-master\eval_result ^
   --checkpoint_dir=D:\AI\dataset\raccoon_dataset-master\train_result ^
   --pipeline_config_path=D:\AI\dataset\raccoon_dataset-master\ssd_mobilenet_v1_racoon.config ^
   --num_eval_steps=1000

 

训练过程中另外打开一个cmd窗口,执行

  tensorboard --logdir=D:\AI\dataset\raccoon_dataset-master\train_result

然后在输出日志中找到TB的监听端口:

TensorBoard 1.10.0 at http://fychen-T470P:6006 (Press CTRL+C to quit)

然后在Chrome浏览器(不支持IE哦)中输入http://fychen-T470P:6006即可实时监视训练情况。

 

如果训练一段时间后最终还是发生OOM错误导致训练终止:

说明笔记本2G的GPU是实在不够跑这个训练的,需要转到GPU内存大的PC服务器上去做。

 

我的AI之路(1)--前言

我的AI之路(2)--安装Fedora 28

我的AI之路(3)--安装Anaconda3 和Caffe

我的AI之路(4)--在Anaconda3 下安装Tensorflow 1.8

我的AI之路(5)--如何选择和正确安装跟Tensorflow版本对应的CUDA和cuDNN版本

我的AI之路(6)--在Anaconda3 下安装PyTorch

我的AI之路(7)--安装OpenCV3_Python 3.4.1 + Contrib以及PyCharm

我的AI之路(8)--体验用OpenCV 3的ANN进行手写数字识别及解决遇到的问题

我的AI之路(9)--使用scikit-learn

我的AI之路(10)--如何在Linux下安装CUDA和CUDNN

我的AI之路(11)--如何解决在Linux下编译OpenCV3时出现的多个错误

我的AI之路(12)--如何配置Caffe使用GPU计算并解决编译中出现的若干错误

我的AI之路(13)--解决编译gcc/g++源码过程中出现的错误

我的AI之路(14)--Caffe example:使用MNIST数据集训练和测试LeNet-5模型

我的AI之路(15)--Linux下编译OpenCV3的最新版OpenCV3.4.1及错误解决

我的AI之路(16)--云服务器上安装和调试基于Tensorflow 1.10.1的训练环境

我的AI之路(17)--Tensorflow和Caffe的API及Guide

我的AI之路(18)--Tensorflow的模型安装之object_detection

我的AI之路(19)--如何在Windows下安装pycocotools PythonAPI

我的AI之路(20)--用Tensorflow object_detection跑raccoon数据集

我的AI之路(21)--用Tensorflow object_detection跑PASCAL VOC 2012数据集

我的AI之路(22)--使用Object_Detection_Tensorflow_API

我的AI之路(23)--在Windows下编译Bazel和使用Bazel编译tensorflow

 

 

raccoon_dataset-master.rar raccoon浣熊的数据集,里面包括了xml_to_csv.py和generator_tfrecord.py文件,用来转化xml文件为tfrecord,用于tensorflow的物体识别训练。 立即下载

相关推荐

raccoon_dataset-master.zip

yolo v3的官方代码。用于训练自己的物体检测模型,在mAP和运算速度上均有不错的表现。

Halcon Deep Learning Object Detection 和 C# 客户端调用模型进行识别

在 DL(Halcon 标注工具)工具中新建一个分类项目,如下图导入图片并且标注。Halcon 开发工具。Halcon 标注工具。Vs2022 社区版。利用了demo的图片。

iml6yu的博客 2806

小浣熊检测数据集

小浣熊检测数据集~ 方便大家使用~谢谢

C#调用yolov3 目标检测

代码地址 编译好的下载 qq群686070107 主函数调用 using System; using Models; using ObjectDetectionGui.Views; using DeepLearning; namespace ObjectDetectionGui { public class Detect { static void Main(string[] args) { WrapperModel model =

网络架构 1413

别再折腾环境了!Windows 11 + VSCode + CMake 3.31.4 + MinGW-w64 一键式配置指南(附常见报错解决)

本文提供Windows 11下VSCode、CMake 3.31.4和MinGW-w64的一键式配置指南,帮助开发者快速搭建高效C++开发环境。涵盖工具链选型、环境变量配置、项目初始化及常见报错解决方案,大幅提升开发效率。

weixin_28841265的博客 186

简单搭建 可视化日志+链路追踪

JAVA 可视化日志、链路追踪、plumeLog、Tlog、Logback

qq_39535439的博客 1204

object_detection物体检测开源框架使用及性能评估(一)

目录 第一章 常用标注数据集 第二章 object_detection开源框架使用案例入门 第三章 标注自己的数据集 第四章 基于tensorflow-cpu的object_detection开源框架模型训练 第五章 基于GPU服务器的object_detection开源框架模型训练 第六章 object_detection开源框架模型评估 第七章 yolo开源框架安装及使用 第八章 yolo开源...

qq_29153321的博客 602

FreeRTOS --(15)信号量之概述

FreeRTOS 中使用信号量来做同步,信号量可以在任务中使用作为任务与任务间的同步,也可以在中断中使用(带 FromISR 的版本)中断与任务间的同步; 针对不同的应用场景,信号量分为两种: 1、二值信号量; 2、计数信号量; 1、二值信号量 1.1、Usage 顾名思义,二值信号量只有两个值:0 和 1;它用于简单场景下的任务与任务、中断与任务之间的同步,比如:一个任务,在等待某个资源到位后,才能够继续执行,在得到这个资源之前,它处于阻塞状态,假如一个中断来了,给出了这个资源,那么.

StephenZhou 6517

深度学习目标检测项目实战(四)—基于Tensorflow object detection API的骨折目标检测及其界面运行

参考原始代码:https://github.com/tensorflow/models/tree/master/research我用的是1.x的版本所以环境必须有gpu版本的tensorflow,训练才快。(1)原始数据集必须有jpg图片和对应的xml文件。(4)以上操作都是对训练数据集,验证数据集同时操作:因为项目只有一种类别,所以长这样。若有多个则继续往后加。我这里选择ssd_mobilenet_v2_coco,下载下来解压:这里复制文件到里面。

weixin_39735688的博客 8775

【自由谈】城域网IPv6过渡技术——MAP技术(1)

在IPv4向IPv6网络演进的浪潮中,存在着两对主要矛盾的较量,一对是IPv4地址短缺和IPv4业务蓬勃发展之间的矛盾,另一对是IPv6海量的地址空间和IPv6应用的匮乏之间的矛盾。同时两对矛盾又互相制约,IPv4地址共享机制似乎又减缓了IPv6产业链的发展,IPv6产业链的不断发展似乎又在考验着IPv4地址共享机制的部署规模。MAP成为目前兼顾IPv4和IPv6的4voer6场景中最为关注的技术。

韩立金自由谈 3024

GEE:关于遥感生态指数(RSEI)的若干疑问

本文记录了若干关于在 Google Earth Engine (GEE)平台上,计算基于主成分分析(PCA)的遥感生态指数(RSEI)的问题。并记录了解决这些问题的一些答案。问题包括,主成分分析的特征值的正负,主成分的占比,去云后空值像素的处理方法,异常值处理方法,如何看载荷等。

养乐多的博客 3417

TensorFlow-object detection 目标检测(三)

本文地址:1 将图片数据转换成TF-Record格式文件 Pet数据 Generating the Oxford-IIIT Pet TFRecord files.python dataset_tools/create_pet_tf_record.py \    --label_map_path=object_detection/data/pet_label_map.pbtxt \    --dat...

mingo_敏 922

AI在智能制造中的落地:从预测维护到自适应生产调度

从最新的研究与实践来看,“预测维护”和“自适应生产调度”正在成为智能制造中最先跑通闭环的两个核心场景:前者通过对设备健康的前瞻性预测,帮助企业减少非计划停机、优化备件与维护资源;后者通过对复杂生产系统的实时决策优化,使工厂能够更好地应对订单波动、设备故障和多目标约束。更重要的是,越来越多的研究与项目不再将二者视为孤立模块,而是尝试构建“设备健康—生产调度—供应链”三者联动的一体化架构。Nature在技术层面,深度学习、强化学习、多智能体系统、图神经网络和注意力机制等方法,为建模复杂工业系统提供了强大工具;

nmdbbzcl的博客 1290

Python_2019-04-04_机器视觉——Tensorflow slim 目标检测

参考操作: https://blog.youkuaiyun.com/wuhe671767/article/details/82697303 问题解决: 成功解决object_detection/protos/*.proto: No such file or directory https://blog.youkuaiyun.com/qq_41185868/article/details/82889473 win...

DONG_LIN_2019的博客 488

YOLOv11改进 | 注意力篇 | YOLOv11引入24年最新的ELA注意力机制,并构建C2PSA_ELA

为了解决这些限制,本文介绍了一种高效的本地注意力(ELA)方法,实现了一个简单的结构,大幅度的性能改善。我们精心设计了ELA中的三个超参数,产生了四个不同的版本:ELA-T,ELAB,ELA-S和ELA-L,以满足不同视觉任务的具体要求,如图像分类,目标检测和语义分割。到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv11改进有效涨点专栏,本专栏目前为新开的,后期我会根据各种前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~

tsg6698的博客 1285

图像做旧算法原理及代码解释

该图像做旧算法主要通过一系列的图像处理操作来模拟旧照片的效果。整体流程包括:首先对输入图像进行颜色调整,降低饱和度并增加黄色调以营造出旧照片的色彩风格;接着添加高斯噪声来模拟旧照片可能存在的颗粒感;最后通过在图像上随机绘制线条来模拟旧照片的划痕和瑕疵。综上所述,该图像做旧算法通过对颜色的调整(包括饱和度降低、色相偏移)、添加高斯噪声以及模拟划痕和瑕疵等一系列操作,从多个方面模拟了旧照片的特征。

m0_44975814的博客 901

tensorflow model detection api 添加背景图片训练

https://github.com/tensorflow/models/issues/3365 OK for future references, this is how i add background images to the dataset allowing the model to train on it. Functions used from:datitran/raccoon_dataset Generate CSV file ->xml_to_csv.py..

northeastsqure的专栏 291

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

目标检测之Object Detection API Demo程序运行

最近学习Object Detection API的使用教程,发现很多坑,找了很多博客,现在把自己使用的过程分享给大家。 一共分为如下几个步骤:(前提是大家已经装完python、tensorflow、anaconda等环境) 1、准备模型;下载地址:https://github.com/tensorflow/models 下载后保存在本地,C:\Object Detection API\models-master(根据具体情况自己切换) 2、安装依赖环境:在cmd或者Ana...

weixin_43442095的博客 874

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Windows10下Object Detection API实战记录(5)——OpenCV调用模型检测实时视频(摄像头)和图片

Windows10下Object Detection API实战记录(5)——OpenCV实现模型调用检测视频和图片1、OpenCV调用模型检测图片2、OpenCV调用模型实时检测(视频)大功告成!!! 1、OpenCV调用模型检测图片 建议使用opencv版本4.0.0,因为从这个版本开始,opencv开始支持tensorflow的 Faster RCNN 和 Mask RCNN 模型。Open...

qq_40784418的博客 1453

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

tensorflow入门教程(二十五)Object Detection API目标检测(下)

# #作者:韦访 #博客:https://blog.youkuaiyun.com/rookie_wei #微信:1007895847 #添加微信的备注一下是优快云的 #欢迎大家一起学习 # 1、概述 上一讲,我们使用了别人根据COCO数据集训练好的模型来做目标检测,这一讲,我们就来训练自己的模型。 2、下载数据集 为了方便学习,我们先使用别人整理好的数据集来训练---VOC2012数据集。VOC...

韦访的专栏 4624

物体检测:object_detection API +ssd目标检测模型

环境 window10, Python 3.8.3, tensorflow 2.2.0 安装object_detection API 参考官方安装文档:https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/installation.md 本文档使用WIN10系统,有些地方做了一些改动,请参考。 安装依赖包 pip install --user Cython pip install --.

axe的博客 1081

tensorflow精进之路(二十四)——Object Detection API目标检测(中)(COCO数据集训练的模型—ssd_mobilenet_v1_coco模型)

1、概述 上一讲简单的讲了目标检测的原理以及TensorflowObjectDetectionAPI的安装,这一节继续讲TensorflowObjectDetectionAPI怎么用。 2、COCO数据集介绍 COCO数据集是微软发布的一个可以用来进行图像识别训练的数据集,图像中的目标都经过精确的segmentation进行位置定位,COCO数据集包括90类目标。Object...

YBAdiam的博客 7376

CenterNet:Keypoint Triplets for Object Detection(中文版)

摘要 在对象检测中,基于关键点的方法通常用于处理大量不正确的对象边界框,这是由于缺少对裁剪区域的额外查看。本文提出了一种有效的解决方案,以最小的代价在每个裁剪区域内实现视觉模式的求解。我们的框架建立在一个具有代表性的单级关键点检测器的基础上,该检测器被命名为CornerNet。我们的方法名为CenterNet,它将每个对象检测为三个关键点,而不是一对关键点,这可以提高精确度和...

李鑫玉的博客 6603

object如何转list_如何在Windows系统上使用Object Detection API训练自己的数据?

前言之前写了一篇如何在windows系统上安装Tensorflow Object Detection API?(点击跳转)然后就想着把数据集换成自己的数据集进行训练得到自己的目标检测模型。动手之前先学习了一波别人是如何实现的,看了大多数教程都有一个小问题:用VOC2012数据集进行训练当做用自己的数据集。然而,初心想看的是自己的数据集啊!于是就自己来撸一篇教程,方便自己也给别人一些参考吧...

weixin_39984963的博客 308

记录Tensorflow Object Detection API训练,测试

  使用Tensorflow Object DetectionAPI进行目标检测 目标检测架构:SSD 深度学习框架:TensorFlow 深度神经网络:MobileNet   目标检测步骤总结如下: 1.      收集500+张包含有待检测目标的图片,最少100张; 2.      使用软件LabelImg对图片进行标注;所谓标注即是在图片上画框定位目标,LabelImg会创建...

honk2012的博客 1万+

使用tensorflow object detection API 训练自己的目标检测模型 (三)

        在上一篇博客"使用tensorflow object detection API 训练自己的目标检测模型 (二)"中介绍了如何使用LabelImg标记数据集,生成.xml文件,经过个人的手工标注,形成了一个大概有两千张图片的数据集。 但是这仍然不满足tensorflow object detection API对训练数据的格式要求(API要求tfrecord个格式的数据),所...

开到荼蘼的博客 2万+
上一篇: 我的AI之路(19)--如何在Windows下安装pycocotools PythonAPI
下一篇: 我的AI之路(21)--用Tensorflow object_detection跑PASCAL VOC 2012数据集
Arnold-FY-Chen
博客等级 码龄19年 925粉丝 204原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Arnold-FY-Chen

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

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

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

打赏作者

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

抵扣说明:

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

余额充值