• Stars
    star
    271
  • Rank 151,717 (Top 3 %)
  • Language
    Python
  • License
    Other
  • Created over 8 years ago
  • Updated about 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Extract the dominant color(s) of your fashion articles!

Color Extractor

This project is both a library and a CLI tool to extract the dominant colors of the main object of an image. Most of the preprocessing steps assume that the images are related to e-commerce, meaning that the objects targeted by the algorithms are supposed to be mostly centered and with a fairly simple background (single color, gradient, low contrast, etc.). The algorithm may still perform if any of those two conditions is not met, but be aware that its precision will certainly be hindered.

A blog post describing this experiment can be found here.

Note: this project is released as-is, and is no longer maintained by us, however feel free to edit the code and use as you see fit.

Installation

The script and the library are currently targeting python 3 and won't work with python 2.

Most of the dependencies can be installed using

pip install -r requirements.txt

Note that library and the CLI tool also depend on opencv 3.1.0 and its python 3 bindings. For Linux users, the steps to install it are available here. For OSX users, the steps to install it are available here.

You then just have to ensure that this repository root is present in your PYTHONPATH.

Color tagging

Searching objects by color is a common practice while browsing e-commerce web sites and relying only on the description and the title of the object may not be enough to provide top-notch relevancy. We propose this tool to automatically associate color tags to an image by trying to guess the main object of the picture and extracting its dominant color(s).

The design of the library can be viewed as a pipeline composed of several sequential processing. Each of these processings accepts several options in order to tune its behavior to better fit your catalog. Those processings are (in order):

  1. Resizing and cropping

  2. Background detection

  3. Skin detection

  4. Clustering of remaining pixels

  5. Selection of the best clusters

  6. Giving color names to clusters

Usage

The library can be used as simply as this:

import cv2
import numpy as np

from color_extractor import ImageToColor

npz = np.load('color_names.npz')
img_to_color = ImageToColor(npz['samples'], npz['labels'])

img = cv2.imread('image.jpg')
print(img_to_color.get(img))

The CLI tool as simply as this:

./color-extractor color_names.npz image.jpg
> red,black

The file color_names.pnz can be found in this repository.

Passing Settings

All algorithms can be used right out of the box thanks to settings tweaked for the larger range of images possible. Because these settings don't target any special kind of catalog, changing them may cause a gain of precision.

Settings can be passed at three different levels.

The lowest level is at the algorithm-level. Each algorithm is embodied by a python class which accepts a settings dictionary. This dictionary is then merged with its default settings. The given settings have precedence over the default one.

A slightly higher level still concerns the library users. The process of chaining all those algorithms together is also embedded in 3 classes called FromJson, FromFile and ImageToColor. Those three classes also take a settings parameter, composed of several dictionary to be forwarded to each algorithm.

The higher level is to pass those settings to the CLI tool. When passing the --settings option with a JSON file the latter is parsed as a dictionary and giving to the underlying FromJson or FromFile object (which in turn will forward to the individual algorithms).

Resizing and Cropping

This step is available as the Resize class.

Pictures with a too high resolution have too much details that can be considered as noise when the goal is to find the most dominant colors. Moreover, smaller images mean faster processing time. Most of the testing has been done on 100x100 images, and it is usually the best compromise between precision and speed. Most of the time the object of the picture is centered, cropping can make sense in order to reduce the quantity of background and ease its removal.

The available settings are:

  • 'crop' sets the cropping ratio. A ratio of 1. means no cropping. Default is 0.9.

  • 'rows' gives the number of rows to reduce the image to. The columns are computed to keep the same ratio. Default is 100.

Background Detection

This step is available as the Back class.

This algorithm tries to discard the background from the foreground by combining two simple algorithms.

The first algorithm takes the colors of the four corners of the image and treat as background all pixels close to those colors.

The second algorithm uses a Sobel filter to detect edges and then runs a flood fill algorithm from all four corners. All pixels touched by the flood fill are considered background.

The masks created by the two algorithms are then combined together with a logical or.

The available settings are:

  • 'max_distance' sets the maximum distance for two colors to be considered close by the first algorithm. A higher value means more pixels will be considered as background. Default is 5.

  • 'use_lab' converts pixels to the LAB color space before using the first algorithm. The conversion makes the process a bit more expensive but the computed distances are closer to human perception. Default is True.

Skin Detection

This step is available as the Skin class.

When working with fashion pictures models are usually present in the picture. The main problem is that their skin color can be confused with the object color and yield to incorrect tags. One way to avoid that is to ignore ranges of colors corresponding to common color skins.

The available settings are:

  • 'skin_type' The skin type to target. At the moment only 'general' and 'none' are supported. 'none' returns an empty mask every time, deactivating skin detection. Default is 'general'.

Clustering

This step is available as the Cluster class.

As we want to find the most dominant color(s) of an object, grouping them into buckets allows us to retain only a few ones and to have a sense of which are the most present. The clustering is done using the K-Means algorithm. K-Means doesn't result in the most accurate clusterings (compared to Mean Shift for example) but its speed certainly compensate. Before all images are different, it's hard to use a fixed number of clusters for the entire catalog. We implemented a method that tries to find an optimal number of clusters called the jump method.

The available settings are:

  • 'min_k' The minimum number of clusters to consider. Default is 2.

  • 'max_k' The maximum number of clusters to consider. Allowing more clusters results in greater computing times. Default is 7.

Selection of Clusters

This step is available as the Selector class.

Once clusters are made, all of them may not be worth a color tag: some may be very tiny for example. The purpose of this step is to only keep the clusters that are worth it. We implemented different way of selecting clusters:

  • 'all' keeps all clusters.

  • 'largest' keeps only the largest cluster.

  • 'ratio' keeps the biggest clusters until their total number of pixels exceeds a certain percentage of all clustered pixels.

While the outcome of all is quite obvious, the use of largest versus ratio is trickier. largest will yield very few colors, meaning the chance of assigning a tag not really relevant is greatly diminished. On the other hand objects with two colors in equal quantity will see one of them discarded. It's up to you to decide which one behaves the best with your catalog.

The available settings are:

  • 'strategy': The strategy to used among 'all', 'largest' and 'ratio'. Default is 'largest'.

  • 'ratio.threshold': The percentage of clustered pixels to target while selecting clusters with the 'ratio' strategy. Default is 0.75.

Naming Color Values

This step is available as the Name class.

The last step is to give human readable color names to RGB values. To solve this last step we use a K Nearest Neighbors algorithm applied to a large dictionary of colors taken from the XKCD color survey. Because of the erratic distribution of colors (some colors are far more represented that others) a KNN behaves in most cases better than more statistical classifiers. The "learning" phase of the classifier is done when the object is built, and requires that two arrays are passed to its constructor: an array of BGR colors and an array of the corresponding names. When using the CLI tool, the path to an .npz numpy archive containing those two matrices must be given.

Even if the algorithm used defaults to KNN, it's still possible to use a custom class to do it. The supplied class must support a fit method in lieu of training phase and a predict method for the actual classification.

The available settings are:

  • 'algorithm' The algorithm to use to perform the classification. Must be either 'knn' or 'custom'. If custom is given, 'classifier.class' must also be given. Default is 'knn'

  • 'hard_monochrome' Monochrome colors (especially gray) may be hard to classify, this option makes use of a built in way of qualifying colors as "white", "gray" or "black". It uses the rejection of the color vector against the gray axis and uses a threshold to determine whether or not the color can be considered monochrome and the luminance to classify it as "black", "white" or "gray". Default is True.

  • '{gray,white,black}_name' When using 'hard_monochrome' changes the name actually given to "gray", "white" and "black" respectively. Useful when wanting color names in another language. Default is "gray", "white" and "black"

  • 'classifier.args' Arguments passed to the classifier constructor. Default one are provided for 'knn' being {"n_neighbors": 50, "weights": "distance", "n_jobs": -1}. The possible arguments are the ones available to the scikit-learn implementation of the KNeighborsClassifier.

  • 'classifier.scale' Many classification algorithms make strong assumption regarding the distribution of the samples, and may need some kind of standardization of the data to behave better. This settings controls the application of such a standardization before training and prediction. Default is True but is ignored when using 'knn'.

Complete Processing

Instead of instantiating each of the aforementioned classes, you can simply use ImageToColor or FromFile. Those two classes take the same arguments for their construction.

  • An array of BGR colors to learn how to associate color names to color values.

  • An array of strings corresponding to the labels of the previous array.

  • A dictionary of settings to be passed to each processing.

The dictionary can have the following keys:

  • 'resize' settings to be given to the Resize object

  • 'back' settings to be given to the Back object

  • 'skin' settings to be given to the Skin object

  • 'cluster' settings to be given to the Cluster object

  • 'selector' settings to be given to the Selector object

  • 'name' settings to be given to the Name object

The main difference is the source of the image used. ImageToColor expects a numpy array while FromFile expects both a local path or a URL where the image can be (down)loaded from.

Enriching JSON

Because we want Algolia customers to be able to enrich their JSON records easily we provide a class able to stream JSON and add color tags on the fly. The object is initialized with the same arguments as FromFile plus the name of the field where the URI of the images can be found. While reading the JSON file if the given name is encountered the corresponding image is downloaded and its colors computed. Those colors are then added to the JSON object under the field _color_tags. The name of this field can be changed thanks to an optional parameter of the constructor.

Enriching JSON can be used directly from the command line as this:

./color-extractor -j color_names.npz file.json

More Repositories

1

places

🌐 Turn any <input> into an address autocomplete
JavaScript
5,372
star
2

autocomplete

🔮 Fast and full-featured autocomplete library
TypeScript
5,047
star
3

docsearch

📘 The easiest way to add search to your documentation.
TypeScript
3,980
star
4

instantsearch

⚡️ Libraries for building performant and instant search and recommend experiences with Algolia. Compatible with JavaScript, TypeScript, React and Vue.
TypeScript
3,700
star
5

react-instantsearch

⚡️ Lightning-fast search for React and React Native applications, by Algolia.
TypeScript
1,969
star
6

algoliasearch-client-javascript

⚡️ A fully-featured and blazing-fast JavaScript API client to interact with Algolia.
TypeScript
1,259
star
7

github-awesome-autocomplete

:octocat: Add instant search capabilities to GitHub's search bar
JavaScript
1,062
star
8

vue-instantsearch

👀 Algolia components for building search UIs with Vue.js
JavaScript
854
star
9

shipjs

Take control of what is going to be your next release.
JavaScript
749
star
10

awesome-algolia

🔍👋 START HERE! A curated list of Algolia libraries, resources and projects.
696
star
11

algoliasearch-client-php

⚡️ A fully-featured and blazing-fast PHP API client to interact with Algolia.
PHP
670
star
12

instantsearch-ios

⚡️ A library of widgets and helpers to build instant-search applications on iOS.
Swift
573
star
13

voice-overlay-ios

🗣 An overlay that gets your user’s voice permission and input as text in a customizable UI
Swift
544
star
14

sup3rS3cretMes5age

Simple to use, simple to deploy, one time self destruct messaging service, with hashicorp vault as a backend
Go
506
star
15

react-element-to-jsx-string

Turn a ReactElement into the corresponding JSX string
JavaScript
490
star
16

hn-search

Hacker News Search
TypeScript
489
star
17

docsearch-configs

DocSearch - Configurations
JavaScript
455
star
18

expect-jsx

✅ toEqualJSX for expect assertion library
JavaScript
410
star
19

algoliasearch-rails

AlgoliaSearch integration to your favorite ORM
Ruby
398
star
20

scout-extended

Scout Extended: The Full Power of Algolia in Laravel
PHP
382
star
21

algoliasearch-wordpress

❌🗑🙅‍♂️ Algolia Search plugin for WordPress is no longer supported. Please use our API client guide instead
JavaScript
360
star
22

docsearch-scraper

DocSearch - Scraper
Python
298
star
23

algoliasearch-netlify

Official Algolia Plugin for Netlify. Index your website to Algolia when deploying your project to Netlify with the Algolia Crawler
TypeScript
260
star
24

angular-instantsearch

⚡️Lightning-fast search for Angular apps, by Algolia
TypeScript
255
star
25

voice-overlay-android

🗣 An overlay that gets your user’s voice permission and input as text in a customizable UI
Kotlin
253
star
26

algoliasearch-laravel

[Deprecated] We now recommend using Laravel Scout, see =>
PHP
238
star
27

jekyll-algolia

Add fast and relevant search to your Jekyll site
Ruby
214
star
28

algoliasearch-client-swift

⚡️ A fully-featured and blazing-fast Swift API client to interact with Algolia.
Swift
203
star
29

algoliasearch-client-python

⚡️ A fully-featured and blazing-fast Python API client to interact with Algolia.
Python
194
star
30

algoliasearch-client-go

⚡️ A fully-featured and blazing-fast Go API client to interact with Algolia.
Go
193
star
31

search-bundle

Seamless integration of Algolia Search into your Symfony project.
PHP
190
star
32

atom-autocomplete-module-import

⚛️ Search & install npm packages from import/require statements.
JavaScript
182
star
33

gatsby-plugin-algolia

A plugin to push to Algolia based on graphQl queries
JavaScript
176
star
34

algoliasearch-helper-js

Helper for implementing advanced search features with Algolia
JavaScript
174
star
35

datasets

Interesting datasets you could use with Algolia
173
star
36

youtube-captions-scraper

Fetch youtube user submitted or fallback to auto-generated captions
JavaScript
173
star
37

pwa-ecom-ui-template

React/Next.js based starter kit, focused on delivering a rich Search & Discovery e-commerce experience.
TypeScript
172
star
38

algoliasearch-django

Seamless integration of Algolia into your Django project.
Python
167
star
39

algoliasearch-client-ruby

⚡️ A fully-featured and blazing-fast Ruby API client to interact with Algolia.
Ruby
166
star
40

algoliasearch-magento-2

Algolia Search integration for Magento 2 - compatible with versions from 2.3.x to 2.4.x
PHP
156
star
41

instantsearch-android

A library of widgets and helpers to build instant-search applications on Android.
Kotlin
153
star
42

instant-search-demo

Instant-search demo (facets, sliders, paginations & more)
CSS
140
star
43

npm-search

🗿 npm ↔️ Algolia replication tool ⛷️ 🐌 🛰️
TypeScript
134
star
44

algoliasearch-jekyll

⚠ DEPRECATED Use jekyll-algolia instead.
Ruby
124
star
45

algoliasearch-client-csharp

⚡️ A fully-featured and blazing-fast C# API client to interact with Algolia.
C#
113
star
46

firestore-algolia-search

TypeScript
112
star
47

kubernetes-hands-on

Kubernetes Hands-on by Algolia
110
star
48

frontman

💎 A Ruby-based static website generator
Ruby
108
star
49

create-instantsearch-app

⚡️ Build InstantSearch apps at the speed of thought
JavaScript
107
star
50

algoliasearch-client-android

Algolia Search API Client for Android
Java
98
star
51

faux-jax

NO MORE MAINTAINED: Intercept and respond to requests in the browser (AJAX) and Node.js (http(s) module)
JavaScript
96
star
52

cli

🔍 Algolia’s official CLI devtool
Go
94
star
53

algolia-cli-old

[DEPRECATED] This repo and npm package are no longer maintained or supported. The new official command line tool can be found here: https://github.com/algolia/cli
JavaScript
82
star
54

doc-code-samples

This repository holds the Algolia documentation big code samples like GeoSearch, Calendar...
TypeScript
82
star
55

rollup-jest-boilerplate

🎉 Full featured boilerplate for building JavaScript libraries the modern way
JavaScript
80
star
56

marvel-search

Searchable list of all Marvel superheroes and supervillains
JavaScript
77
star
57

examples

Set of code samples highlighting the different ways to use the Algolia API
CSS
76
star
58

instantsearch-ios-examples

Example apps built with InstantSearch iOS
Swift
67
star
59

instantsearch-android-examples

Example apps built with algolia/instantsearch-android
Kotlin
63
star
60

algoliasearch-client-css

Algolia Search API Client for CSS
JavaScript
63
star
61

mongoolia

Keep your mongoose schemas synced with Algolia
JavaScript
58
star
62

algoliasearch-client-kotlin

⚡️ A fully-featured and blazing-fast Kotlin/Android API client to interact with Algolia.
Kotlin
56
star
63

hn-reactnative-sample

Sample Hacker News Search app by Algolia based on React Native.
JavaScript
54
star
64

search-insights.js

Library for reporting click, conversion and view metrics using the Algolia Insights API
TypeScript
53
star
65

jest-serializer-html

Jest snapshot serializer that beautifies HTML.
JavaScript
51
star
66

redux-updeep

small reducer generator that uses updeep to immutably deep merge partial updates into the reducer's state
JavaScript
50
star
67

algoliasearch-alexa

🔊 Search by voice in Alexa, powered by Algolia
JavaScript
44
star
68

chunk-text

🔪 chunk/split a string by length without cutting/truncating words.
JavaScript
44
star
69

algoliasearch-client-java

⚡️ A fully-featured and blazing-fast Java API client to interact with Algolia.
Java
43
star
70

react-nouislider

CSS
42
star
71

react-test-boilerplate

Companion project for Algolia's React unit testing blog post
JavaScript
41
star
72

algoliasearch-crawler-github-actions

Algolia Crawler Github action
TypeScript
40
star
73

demo-geo-search

Demo code illustrating the geo search features of Algolia
JavaScript
39
star
74

laravel-scout-algolia-macros

DEPRECATED: Use of this repository is deprecated. Please use Scout Extended - https://github.com/algolia/scout-extended instead.
PHP
39
star
75

algoliasearch-client-objc

Algolia Search API Client for iOS & OS X
Objective-C
38
star
76

docsearch-website

Previous repository for the DocSearch documentation website, now at https://github.com/algolia/docsearch/tree/next/packages/website
CSS
38
star
77

algoliasearch-client-node

DEPRECATED
36
star
78

algoliasearch-rails-example

AlgoliaSearch+Ruby on Rails examples
Ruby
36
star
79

elasticsearch-topk-plugin

Elasticsearch Top-K Aggregation Plugin
Java
35
star
80

wordpress-docker

Simple docker based environment for WordPress plugins and themes development.
Shell
34
star
81

algolia-sitemap

a node library allowing you to generate sitemaps from an Algolia index.
JavaScript
33
star
82

jekyll-algolia-example

Front-end example of the jekyll-algolia plugin
HTML
33
star
83

vue-instantsearch-examples

Examples for Vue InstantSearch v1, v2 links: https://github.com/algolia/vue-instantsearch-examples/issues/50
Shell
33
star
84

unified-instantsearch-ecommerce

The fastest way to implement Algolia, for e-commerce customers.
JavaScript
32
star
85

algoliasearch-client-java-legacy

*DEPRECATED* Algolia Search API Client for Java, see https://github.com/algolia/algoliasearch-client-java-2
Java
31
star
86

talksearch-scraper

Extract captions and metadata from YouTube playlists and push them to Algolia
JavaScript
31
star
87

diffable-html

Opinionated HTML formatter focused towards making HTML diffs readable.
JavaScript
30
star
88

api-clients-automation

🤖 Monorepo of the Algolia API specs and their auto-generated clients and documentation
PHP
30
star
89

recommend

A UI library for Algolia Recommend, available for Vanilla JavaScript and React.
TypeScript
29
star
90

eslint-config-algolia

Algolia's ESLint config and prettier instructions for JavaScript projects
JavaScript
27
star
91

talksearch

🎤 An interactive search experience for video titles and transcripts
JavaScript
25
star
92

algolia-firebase-nodejs

An example showing how to push data from Firebase to Algolia
JavaScript
24
star
93

algoliasearch-client-scala

⚡️ A fully-featured and blazing-fast Scala API client to interact with Algolia.
Scala
24
star
94

redux-magic-async-middleware

redux-magic-async-middleware is a middleware which makes it easy to handle asynchronous data with redux
JavaScript
23
star
95

laravel-scout-settings

DEPRECATED: Use of this repository is deprecated. Please use Scout Extended - https://github.com/algolia/scout-extended instead.
PHP
23
star
96

pdrone

Control Parrot drones with JavaScript
JavaScript
23
star
97

algoliasearch-helper-flutter

⚡️ Building block to create instant-search applications with Flutter
Dart
23
star
98

algolia-swift-demo

iOS instant search tutorial
Swift
23
star
99

algolia-react-boilerplate

🔥 A highly scalable, and customizable boilerplate, made with ReactInstantSearchHooks and with many Algolia's features. Ready to configure and deploy. You have just to follow steps in readme file. 💥
JavaScript
23
star
100

algolia-coding-contest

Welcome to the first Algolia Coding Contest, until May 5th.
22
star