コード例 #1
0
ファイル: color_classifier.py プロジェクト: egptee/caffe
  def __init__(self, metadata_file_path=None, ref_color_table_file_path=None,
          color_ref_dir=None, decay_colors="", decay_percentage=0.7,
          max_skin_percentage=0.6) :
    
    metadata = None
    if metadata_file_path is not None and len(metadata_file_path) > 0 :
      with open(metadata_file_path, 'r') as m_file:
        metadata = pickle.load(m_file)
      m_file.close()
    else :
      assert color_ref_dir is not None and len(color_ref_dir) > 0
      metadata = build_metadata(color_ref_dir)
    self._initialize(metadata, decay_colors, decay_percentage, max_skin_percentage)

    self._color_table_builder = ColorTableBuilder(self._color_ref_lab)
    if ref_color_table_file_path is not None and len(ref_color_table_file_path) > 0 :
      rgb_to_color = None
      with open(ref_color_table_file_path, 'r') as r_file:
        rgb_to_color = pickle.load(r_file)
        print "load existed color table"
      r_file.close()
      self._color_table_builder.load_color_table(rgb_to_color)
コード例 #2
0
ファイル: color_classifier.py プロジェクト: egptee/caffe
class ColorClassifier(object) :
  # Load metadatafrom metadata_file_path if # non-empty. Otherwise try build
  # metadata from color_ref_dir.
  def __init__(self, metadata_file_path=None, ref_color_table_file_path=None,
          color_ref_dir=None, decay_colors="", decay_percentage=0.7,
          max_skin_percentage=0.6) :
    
    metadata = None
    if metadata_file_path is not None and len(metadata_file_path) > 0 :
      with open(metadata_file_path, 'r') as m_file:
        metadata = pickle.load(m_file)
      m_file.close()
    else :
      assert color_ref_dir is not None and len(color_ref_dir) > 0
      metadata = build_metadata(color_ref_dir)
    self._initialize(metadata, decay_colors, decay_percentage, max_skin_percentage)

    self._color_table_builder = ColorTableBuilder(self._color_ref_lab)
    if ref_color_table_file_path is not None and len(ref_color_table_file_path) > 0 :
      rgb_to_color = None
      with open(ref_color_table_file_path, 'r') as r_file:
        rgb_to_color = pickle.load(r_file)
        print "load existed color table"
      r_file.close()
      self._color_table_builder.load_color_table(rgb_to_color)

  def _initialize(self, metadata, decay_colors, decay_percentage, max_skin_percentage) :
    self._color_ref_rgb = metadata['color_ref_rgb'] # array of [r,g,b] for the reference colors.
    self._color_ref_lab = metadata['color_ref_lab'] # array of lab object for the reference colors.
    self._color_ref_name = metadata['color_ref_name'] # array of color names.
    self._color_num = metadata['color_num'] # The total number of colors.
    self._decay_color_index = set() # The index for colors to be decayed, e.g., white and silver.
    decay_color_name = decay_colors.split(",")
    for i in range(len(self._color_ref_name)) :
      if self._color_ref_name[i] in decay_color_name :
        print "Decaying color: %s" % self._color_ref_name[i]
        self._decay_color_index.add(i)
    self._decay_percentage = decay_percentage
    self._max_skin_percentage = max_skin_percentage

  def detect(self, image_file_path) :
    img = cv2.imread(image_file_path)
    start_time = time.time()
    # generate the foreground
    background_removed = remove_background(image_file_path) # background removal
    skin_removed = skin_detect(img) # skin removal
    foreground = cv2.bitwise_and(background_removed, background_removed, mask = skin_removed) # the foreground mask
    skin_percentage = 1 - sum(map(sum, foreground))/1.0/(sum(map(sum, background_removed))+0.1)
    # In case of clothes in skin color.
    # print "%f skin detected." % skin_percentage
    if skin_percentage > self._max_skin_percentage:
      # print "Too much skin"
      foreground = background_removed
  
    # Find the nearest reference color for each pixel and count
    color_histogram = [0] * self._color_num
    image_foreground_pixel = 0
    for i in range(len(foreground)):
      for j in range(len(foreground[0])):
        if foreground[i][j] != 255:
          continue
        image_foreground_pixel += 1
        if self._color_table_builder.rgb_to_color[img[i][j][2], img[i][j][1], img[i][j][0]] < 0 :
          self._color_table_builder.reset_color(img[i][j][2], img[i][j][1], img[i][j][0])
  
        color_index = int(self._color_table_builder.rgb_to_color[img[i][j][2], img[i][j][1], img[i][j][0]])
        color_histogram[color_index] += 1

    # Decay colors.
    for decay_color in self._decay_color_index :
      color_histogram[decay_color] *= self._decay_percentage
  
    max_color_count = max(color_histogram)
    return (color_histogram.index(max_color_count),
        color_histogram,
        max_color_count / (float(image_foreground_pixel)+0.1),
        foreground)

  def color_index_to_name(self, index) :
    return self._color_ref_name[int(index)]

  def color_num(self) :
    return self._color_num