Difference between revisions of "OCR/Results"

From Open Food Facts wiki
Jump to navigation Jump to search
 
(31 intermediate revisions by the same user not shown)
Line 1: Line 1:
How to process the 1.4 million JSON files we've generated
+
How to process the 400k JSON files we've generated
 
+
[[Category:OCR]]
 
== Example ==
 
== Example ==
 
=== Image ===
 
=== Image ===
Line 47: Line 47:
 
=== Comments===
 
=== Comments===
  
== What to do ==
+
== Instructions ==
=== Versions of the same product ===
+
=== How to process images to generate JSONs ===
* All versions of images selected have been processed
+
 
* All images ever uploaded  have been processed
+
Needs to be executed in home/off/html/
=== Check complete products ===
+
 
 +
<pre>
 +
sudo nohup sh -c 'for f in $(find . -type f -regex ".*/[0-9]+.jpg*"); do sudo python /home/teolemon/ocr/cloudvision4.py $f;done'
 +
sudo nohup sh -c 'for f in $(find . -name 'nutrition.*.full.jpg' -type f); do sudo python /home/teolemon/ocr/cloudvision4.py $f;done'
 +
sudo nohup sh -c 'for f in $(find . -name 'front.*.full.jpg' -type f); do sudo python /home/teolemon/ocr/cloudvision4.py $f;done'
 +
sudo nohup sh -c 'for f in $(find . -name 'ingredients.*.full.jpg' -type f); do sudo python /home/teolemon/ocr/cloudvision4.py $f;done'
 +
</pre>
 +
 
 +
<pre>
 +
sudo nohup sh -c 'for f in $(find . -type f -regex ".*/[1-1].jpg*"); do sudo python /home/teolemon/ocr/cloudvision4.py $f;done'
 +
sudo nohup sh -c 'for f in $(find . -type f -regex ".*/[2-2].jpg*"); do sudo python /home/teolemon/ocr/cloudvision4.py $f;done'
 +
sudo nohup sh -c 'for f in $(find . -type f -regex ".*/[3-3].jpg*"); do sudo python /home/teolemon/ocr/cloudvision4.py $f;done'
 +
sudo nohup sh -c 'for f in $(find . -type f -regex ".*/[4-4].jpg*"); do sudo python /home/teolemon/ocr/cloudvision4.py $f;done'
 +
sudo nohup sh -c 'for f in $(find . -type f -regex ".*/[5-5].jpg*"); do sudo python /home/teolemon/ocr/cloudvision4.py $f;done'
 +
sudo nohup sh -c 'for f in $(find . -type f -regex ".*/[6-6].jpg*"); do sudo python /home/teolemon/ocr/cloudvision4.py $f;done'
 +
sudo nohup sh -c 'for f in $(find . -type f -regex ".*/[7-7].jpg*"); do sudo python /home/teolemon/ocr/cloudvision4.py $f;done'
 +
</pre>
 +
 
 +
=== How to check the results ===
 +
==== Number of images ====
 +
46715+128832+59961+180420 = 415928 (edited)
 +
<pre>
 +
ls -lR /srv/off/html/images/products/ | find . -name 'nutrition.*.full.jpg' -type f | wc -l
 +
46715
 +
ls -lR /srv/off/html/images/products/ | find . -name 'front.*.full.jpg' -type f | wc -l
 +
128382
 +
ls -lR /srv/off/html/images/products/ | find . -name 'ingredients.*.full.jpg' -type f | wc -l
 +
59961
 +
ls -lR /srv/off/html/images/products/ | find . -type f -regex ".​​*/[0-9].jpg*​​" | wc -l
 +
180420
 +
</pre>
 +
 
 +
<pre>
 +
Nov 1 - 13:22 - Paris Time
 +
ls -lR /srv/off/html/images/products | find . -type f -regex ".*/[0-9].jpg*" | wc -l
 +
287119
 +
</pre>
 +
 
 +
==== Number of JSONs====
 +
<pre>
 +
ls -lR /srv/off/html/images/products/ | find . -type f -regex ".​​*/[0-9].json*​​" | wc -l
 +
415308
 +
</pre>
 +
 
 +
 
 +
<pre>
 +
Nov 1 2016 - 13:30
 +
teolemon@ns3362784:/srv/off/html/images/products$ ls -lR /srv/off/html/images/products | find . -type f -regex ".*/[0-9].json*" | wc -l
 +
253322
 +
</pre>
 +
 
 +
==== Number of files in the directory ====
 +
 
 +
<pre>
 +
teolemon@ns3362784:/home/off/html/images/products$ find . -type f | sed 's/.*\.//' | sort | uniq -c
 +
  2514 front
 +
    35 gif
 +
    27 ingredients
 +
2890282 jpg
 +
478982 json
 +
      1 kxs2sl
 +
      1 out
 +
  3311 png
 +
    210 tif
 +
    153 txt
 +
 
 +
</pre>
 +
 
 +
==== Search for a string in the generated JSONs ====
 +
grep --include=*.json -rnwl '/srv/off/html/images/products/' -e "halloween"
 +
 
 +
== Status ==
 +
=== TODO ===
 +
* remove json with error messages
 +
 
 +
=== Open Food Facts ===
 +
* raw images
 +
** existing
 +
** processed
 +
* front
 +
** existing
 +
** processed
 +
* ingredients
 +
** existing
 +
** processed
 +
* nutrition
 +
** existing
 +
** processed
 +
 
 +
=== Open Beauty Facts ===
 +
* raw images
 +
** existing
 +
** processed
 +
* front
 +
** existing
 +
** processed
 +
* ingredients
 +
** existing
 +
** processed
 +
* nutrition
 +
** existing
 +
** processed
 +
 
 +
== How we can leverage the data ==
 +
 
 +
=== Perform checks on products that are already complete ===
 
* Check how similar ingredients lists are to what is detected
 
* Check how similar ingredients lists are to what is detected
 +
** Calculate percentage of ingredients similarity
 +
*** List of parsed in ingredients list
 +
*** Ingredients found in the JSON (from the list of ingredients)
 +
 +
* Check for ingredients not found in the current ingredients list (if not empty)
 +
** Needs ingredients taxonomisation to avoid false positives
 +
 
* Check if brands are suggested that are not here (eg Umbrella brands)
 
* Check if brands are suggested that are not here (eg Umbrella brands)
* Extract addresses
+
** Taxonomize brands
* Extract URLs
+
** Propose candidates
 +
 
 +
* Check nutrition values on new images
 +
** Marcel Salathé seems to be working on a machine learning solution to extract nutrition values from raw images
 +
 
 +
* Look for new languages
 +
** Generate a list of languages in each image/product
 +
*** Use language detection libs to detect all languages
 +
*** Use language value in JSON
 +
** Check if the product has images and values for all of them
 +
*** values that change are (front/ingredients/nutrition images) &  (front/ingredients text)
 +
** Make a page with a list of products with new languages to add
  
 
=== Suggest values for incomplete products ===
 
=== Suggest values for incomplete products ===
* Try to suggest possible categories based on extracted text
 
* Try to suggest brands, both based on the Brand JSON field and on Raw text extraction
 
  
=== Search engine (internal/external) considerations ===
+
* Categories candidates, based on extracted text
* Add raw output as hidden text to enable search engine to index incomplete products
+
 
 +
* Brands candidates based on:
 +
** the Brand JSON field
 +
** Raw text extraction
 +
** URL regex
 +
*** Based on Wikidata urls
 +
*** Based on urls extracted in other products, or set as Product urls
 +
 
 +
* Packaging candidates
 +
** Taxonomy match
 +
** Existing values match
 +
 
 +
* Location candidates
 +
** OpenStreetMap/Wikidata match
 +
** Taxonomy match
 +
** Existing values match
 +
 
 +
* Packager codes candidates
 +
** EMB code
 +
** EU codes
 +
 
 +
* Quantity candidates
 +
** Regex match
 +
 
 +
* Labels, certifications, awards
 +
** Taxonomy match
 +
** Existing values match
 +
 
 +
* Origin of ingredients
 +
** Taxonomy match + Dropdown
 +
** Existing values match + Dropdown
 +
 
 +
* Manufacturing or processing places
 +
** OpenStreetMap/Wikidata match
 +
** Taxonomy match
 +
** Existing values match
 +
 
 +
* Link to the product page on the official site of the producer
 +
** Regex match
 +
** Google Search with name+brand
 +
 
 +
* Best before date
 +
** Regex match
 +
 
 +
* City, state and country where purchased
 +
** OpenStreetMap/Wikidata match
 +
** Taxonomy match
 +
** Existing values match
 +
 
 +
* Stores
 +
** Taxonomy match
 +
** Existing values match
 +
 
 +
* Countries where sold
 +
** OpenStreetMap/Wikidata match
 +
** Taxonomy match
 +
** Existing values match
 +
 
 +
* Ingredients list
 +
** Regex match
 +
** Taxonomy match
 +
** Existing values match
 +
 
 +
* Traces
 +
** Regex match
 +
** Taxonomy match
 +
** Existing values match
 +
 
 +
* Serving size
 +
** Regex match
 +
 
 +
* Nutrients volume
 +
** Regex match
 +
 
 +
* Ecological footprint
 +
** Regex match
 +
 
 +
=== Make uncomplete products searchable ===
 +
* Add raw JSON output as hidden by default text to enable search engines to index incomplete products (it could be collapsed and shown after the click of a button)
 
* Add hidden field to enable the internal search engine to find incomplete products
 
* Add hidden field to enable the internal search engine to find incomplete products
=== New fields to add ? ===
+
 
 +
=== Expand Open Food Facts coverage by adding additional information in new fields ===
 +
* Description
 +
** some products are very talkative, non-essential marketing information (eg on wines)
 +
** it can be a first step before we add the other fields
 
* Cooking recommandation
 
* Cooking recommandation
 
* Storage recommandation
 
* Storage recommandation
* Description (some products are very talkative)
 
 
* Postal address of the producer
 
* Postal address of the producer
 
* Postal address of the distributor
 
* Postal address of the distributor
* Email Address
+
* Email Address of the producer
* Phone number
+
* Email Address of the distributor
* Website of the brand (vs product)
+
* Phone number of the producer
 +
* Phone number of the distributor
 +
* Website of the brand
 
* Ingredient percentage
 
* Ingredient percentage
  

Latest revision as of 21:52, 14 February 2019

How to process the 400k JSON files we've generated

Example

Image

ingredients.12.400.jpg

Output

http://static.openfoodfacts.ovh/images/products/40193045/ingredients.12.full.json

{  
   u'responses':[  
      {  
         u'textAnnotations':[  
            {  
               u'locale':u'de',
               u'description':               u'Doppelrahmstufe\nAT Kasezubereitung 60% F.LT\nzutaten:Frischkase,
               2               gefriergetrockne\nter Gorgonzola,
               Salz,
               Verdickungsmittet\nJohannisbrotkernmehl und Guarkemmehlt\nAroma,
               Stickstoff zum Aufschlagen\nNach dem Offnen alsbald verzehren\nUngeoffnet gekuhlt mindestens\nhaltbar bis:siehe Boden\nBY 706\nIn Deutschland hergestellt\n',
               u'boundingPoly':{  
                  u'vertices':[  
                     {  
                        u'y':232,
                        u'x':190
                     },
                     {  
                        u'y':232,
                        u'x':1500
                     },
                     {  
                        u'y':1410,
                        u'x':1500
                     },
                     {  
                        u'y':1410,
                        u'x':190
                     }
                  ]
               }
            }
         ]
      }
   ]
}

Comments

Instructions

How to process images to generate JSONs

Needs to be executed in home/off/html/

sudo nohup sh -c 'for f in $(find . -type f -regex ".*/[0-9]+.jpg*"); do sudo python /home/teolemon/ocr/cloudvision4.py $f;done'
sudo nohup sh -c 'for f in $(find . -name 'nutrition.*.full.jpg' -type f); do sudo python /home/teolemon/ocr/cloudvision4.py $f;done'
sudo nohup sh -c 'for f in $(find . -name 'front.*.full.jpg' -type f); do sudo python /home/teolemon/ocr/cloudvision4.py $f;done'
sudo nohup sh -c 'for f in $(find . -name 'ingredients.*.full.jpg' -type f); do sudo python /home/teolemon/ocr/cloudvision4.py $f;done'
sudo nohup sh -c 'for f in $(find . -type f -regex ".*/[1-1].jpg*"); do sudo python /home/teolemon/ocr/cloudvision4.py $f;done'
sudo nohup sh -c 'for f in $(find . -type f -regex ".*/[2-2].jpg*"); do sudo python /home/teolemon/ocr/cloudvision4.py $f;done'
sudo nohup sh -c 'for f in $(find . -type f -regex ".*/[3-3].jpg*"); do sudo python /home/teolemon/ocr/cloudvision4.py $f;done'
sudo nohup sh -c 'for f in $(find . -type f -regex ".*/[4-4].jpg*"); do sudo python /home/teolemon/ocr/cloudvision4.py $f;done'
sudo nohup sh -c 'for f in $(find . -type f -regex ".*/[5-5].jpg*"); do sudo python /home/teolemon/ocr/cloudvision4.py $f;done'
sudo nohup sh -c 'for f in $(find . -type f -regex ".*/[6-6].jpg*"); do sudo python /home/teolemon/ocr/cloudvision4.py $f;done'
sudo nohup sh -c 'for f in $(find . -type f -regex ".*/[7-7].jpg*"); do sudo python /home/teolemon/ocr/cloudvision4.py $f;done'

How to check the results

Number of images

46715+128832+59961+180420 = 415928 (edited)

ls -lR /srv/off/html/images/products/ | find . -name 'nutrition.*.full.jpg' -type f | wc -l
46715
ls -lR /srv/off/html/images/products/ | find . -name 'front.*.full.jpg' -type f | wc -l
128382
ls -lR /srv/off/html/images/products/ | find . -name 'ingredients.*.full.jpg' -type f | wc -l
59961
ls -lR /srv/off/html/images/products/ | find . -type f -regex ".​​*/[0-9].jpg*​​" | wc -l
180420
Nov 1 - 13:22 - Paris Time
ls -lR /srv/off/html/images/products | find . -type f -regex ".*/[0-9].jpg*" | wc -l
287119

Number of JSONs

ls -lR /srv/off/html/images/products/ | find . -type f -regex ".​​*/[0-9].json*​​" | wc -l
415308


Nov 1 2016 - 13:30
teolemon@ns3362784:/srv/off/html/images/products$ ls -lR /srv/off/html/images/products | find . -type f -regex ".*/[0-9].json*" | wc -l
253322

Number of files in the directory

teolemon@ns3362784:/home/off/html/images/products$ find . -type f | sed 's/.*\.//' | sort | uniq -c
   2514 front
     35 gif
     27 ingredients
2890282 jpg
 478982 json
      1 kxs2sl
      1 out
   3311 png
    210 tif
    153 txt

Search for a string in the generated JSONs

grep --include=*.json -rnwl '/srv/off/html/images/products/' -e "halloween"

Status

TODO

  • remove json with error messages

Open Food Facts

  • raw images
    • existing
    • processed
  • front
    • existing
    • processed
  • ingredients
    • existing
    • processed
  • nutrition
    • existing
    • processed

Open Beauty Facts

  • raw images
    • existing
    • processed
  • front
    • existing
    • processed
  • ingredients
    • existing
    • processed
  • nutrition
    • existing
    • processed

How we can leverage the data

Perform checks on products that are already complete

  • Check how similar ingredients lists are to what is detected
    • Calculate percentage of ingredients similarity
      • List of parsed in ingredients list
      • Ingredients found in the JSON (from the list of ingredients)
  • Check for ingredients not found in the current ingredients list (if not empty)
    • Needs ingredients taxonomisation to avoid false positives
  • Check if brands are suggested that are not here (eg Umbrella brands)
    • Taxonomize brands
    • Propose candidates
  • Check nutrition values on new images
    • Marcel Salathé seems to be working on a machine learning solution to extract nutrition values from raw images
  • Look for new languages
    • Generate a list of languages in each image/product
      • Use language detection libs to detect all languages
      • Use language value in JSON
    • Check if the product has images and values for all of them
      • values that change are (front/ingredients/nutrition images) & (front/ingredients text)
    • Make a page with a list of products with new languages to add

Suggest values for incomplete products

  • Categories candidates, based on extracted text
  • Brands candidates based on:
    • the Brand JSON field
    • Raw text extraction
    • URL regex
      • Based on Wikidata urls
      • Based on urls extracted in other products, or set as Product urls
  • Packaging candidates
    • Taxonomy match
    • Existing values match
  • Location candidates
    • OpenStreetMap/Wikidata match
    • Taxonomy match
    • Existing values match
  • Packager codes candidates
    • EMB code
    • EU codes
  • Quantity candidates
    • Regex match
  • Labels, certifications, awards
    • Taxonomy match
    • Existing values match
  • Origin of ingredients
    • Taxonomy match + Dropdown
    • Existing values match + Dropdown
  • Manufacturing or processing places
    • OpenStreetMap/Wikidata match
    • Taxonomy match
    • Existing values match
  • Link to the product page on the official site of the producer
    • Regex match
    • Google Search with name+brand
  • Best before date
    • Regex match
  • City, state and country where purchased
    • OpenStreetMap/Wikidata match
    • Taxonomy match
    • Existing values match
  • Stores
    • Taxonomy match
    • Existing values match
  • Countries where sold
    • OpenStreetMap/Wikidata match
    • Taxonomy match
    • Existing values match
  • Ingredients list
    • Regex match
    • Taxonomy match
    • Existing values match
  • Traces
    • Regex match
    • Taxonomy match
    • Existing values match
  • Serving size
    • Regex match
  • Nutrients volume
    • Regex match
  • Ecological footprint
    • Regex match

Make uncomplete products searchable

  • Add raw JSON output as hidden by default text to enable search engines to index incomplete products (it could be collapsed and shown after the click of a button)
  • Add hidden field to enable the internal search engine to find incomplete products

Expand Open Food Facts coverage by adding additional information in new fields

  • Description
    • some products are very talkative, non-essential marketing information (eg on wines)
    • it can be a first step before we add the other fields
  • Cooking recommandation
  • Storage recommandation
  • Postal address of the producer
  • Postal address of the distributor
  • Email Address of the producer
  • Email Address of the distributor
  • Phone number of the producer
  • Phone number of the distributor
  • Website of the brand
  • Ingredient percentage

Kind of images processed

Cropped front images

Cropped ingredient images

Cropped nutrition images

Raw images