From 67fa7905ca2db689741b2df06e48d8a50c853d5d Mon Sep 17 00:00:00 2001 From: Amedeo Amato Date: Sun, 15 Oct 2017 02:00:28 +0200 Subject: [PATCH 1/2] Extract OCR functions and add unit tests for them. _init_ file was emptied and it's contents moved into main.py. That was needed for the new unit test structure. --- fakemenot/__init__.py | 194 ----------------------------- fakemenot/main.py | 139 +++++++++++++++++++++ fakemenot/ocr.py | 59 +++++++++ fakemenot/tests/res/test_ocr_1.png | Bin 0 -> 36264 bytes fakemenot/tests/res/test_ocr_2.png | Bin 0 -> 27033 bytes fakemenot/tests/res/test_ocr_3.png | Bin 0 -> 20234 bytes fakemenot/tests/test_ocr.py | 32 +++++ setup.py | 3 +- 8 files changed, 232 insertions(+), 195 deletions(-) create mode 100644 fakemenot/main.py create mode 100644 fakemenot/ocr.py create mode 100644 fakemenot/tests/res/test_ocr_1.png create mode 100644 fakemenot/tests/res/test_ocr_2.png create mode 100644 fakemenot/tests/res/test_ocr_3.png create mode 100644 fakemenot/tests/test_ocr.py diff --git a/fakemenot/__init__.py b/fakemenot/__init__.py index f56f179..e69de29 100644 --- a/fakemenot/__init__.py +++ b/fakemenot/__init__.py @@ -1,194 +0,0 @@ -''' -This program uses pytesseract to do OCR on images. -Make sure you have the following packages installed on the system : - -* tesseract -* tesseract-data-eng - -Tested on Arch Linux - Rolling -''' - -import argparse -import os -import sys -import pytesseract -import configparser -from TwitterSearch import * -from PIL import Image, ImageEnhance, ImageFilter -from termcolor import colored - - -parser = argparse.ArgumentParser(description='Process images') -parser.add_argument( - '--image', - '-i', - help='Twitter screenshot image', - required=True) -parser.add_argument('--limit', '-l', help='Limit tweets pulled', default=250) -parser.add_argument( - '--config', - '-c', - help='Path to twitter config (default: ~/.fakemenot.config)', - default="~/.fakemenot.config") - -args = parser.parse_args() - - -def get_config(): - config = configparser.RawConfigParser() - try: - with open(os.path.expanduser(args.config)) as config_file: - config.readfp(config_file) - except IOError as ioe: - print(colored("Couldn't open the config file {} because {}".format( - args.config, ioe), 'red')) - sys.exit(2) - return config - - -def _do_ocr_and_lookup(img_obj): - config = get_config() - limit_of_tweets = int(args.limit) - potential_user = '__fakemenot__' - # Replace line breaks with a space and split text into an array - text = pytesseract.image_to_string( - img_obj, lang='eng').replace( - '\n', ' ').split(' ') - for element in text: - if element and element[0] == '@': - print("Detected handle : " + str(element)) - # Since handles cannot have spaces, strip until space - potential_user = element.split(' ')[0] - break - - # Just in case the person Yousing the program puts in ' or " in the config. - consumer_key = config.get( - 'twitter', - 'consumer_key').replace( - '\'','').replace( - '\"','') - consumer_secret = config.get( - 'twitter', - 'consumer_secret').replace( - '\'','').replace( - '\"','') - access_token = config.get( - 'twitter', - 'access_token').replace( - '\'','').replace( - '\"','') - access_token_secret = config.get( - 'twitter', - 'access_token_secret').replace( - '\'','').replace( - '\"','') - - if potential_user == '__fakemenot__': - print(colored("[*] It looks like OCR failed. Please make sure you " + - "crop the image as in sample and is readable.", 'red')) - exit(1) - - try: - tuo = TwitterUserOrder(potential_user[1:]) - ts = TwitterSearch( - consumer_key=consumer_key, - consumer_secret=consumer_secret, - access_token=access_token, - access_token_secret=access_token_secret - ) - tweets = [] - body = '__awesomebody__' - for tweet in ts.search_tweets_iterable(tuo): - # Nobody cares about re-tweets - if 'RT ' not in tweet['text']: - if tweet not in tweets: - tweets.append((tweet['text'], tweet['id'])) - if not limit_of_tweets: - break - else: - limit_of_tweets -= 1 - - # The most probable tweet body is this. - try: - body = text[text.index('V') + 1:] - except ValueError: - body = text - - # If none of that was found, let's report an OCR error - if body == '__awesomebody__': - print(colored("[*] It looks like OCR failed.Please make sure you " + - "crop image as in sample and is readable.", 'red')) - - found_tweet = False - # Check against every tweet pulled - for tweet in tweets: - removed_elements = 0 - ltweet, orig_len = tweet[0].split(' '), len(tweet[0].split(' ')) - # Compare each element of body to element in body. TODO: Optimize - for ele in body: - if ele in ltweet: - removed_elements += 1 - ltweet.remove(ele) - removal_rate = (removed_elements / float(orig_len)) * 100 - - if int(removal_rate) > 75: - found_tweet = True - print(colored("[*] It looks like this is a valid tweet", - 'green')) - print(colored("-> Confidence : " + "%.2f" % removal_rate + "%", - 'green')) - print(colored("-> Potential URL : https://twitter.com/" + - potential_user[1:] + - "/status/" + str(tweet[1]), 'green')) - - elif int(removal_rate) in (55, 75): - found_tweet = True - print(colored("[*] This might be a valid tweet", 'yellow')) - print(colored("-> Confidence : " + "%.2f" % removal_rate + "%", - 'yellow')) - print(colored("-> Potential URL : https://twitter.com/" + - potential_user[1:] + - "/status/" + str(tweet[1]), 'yellow')) - - if not found_tweet: - print(colored("[*] I couldn't find a tweet like that. " + - "Try increasing the limit to pull more tweets", - 'yellow')) - - except TwitterSearchException as e: # catch all those ugly errors - print(e) - - -def _blow_up_image(): - try: - img = Image.open(args.image) - except (OSError, IOError): - print(colored("[!] I couldn't find a file by that name. Fake you!", - 'red')) - return False - - basewidth = 2500 - img = Image.open(args.image) - wpercent = (basewidth / float(img.size[0])) - hsize = int((float(img.size[1]) * float(wpercent))) - # Resize happens here - img = img.resize((basewidth, hsize), Image.ANTIALIAS) - - # Thanks Stack Overflow <3 : https://stackoverflow.com/a/37750605/5486120 - img = img.filter(ImageFilter.MedianFilter()) - enhancer = ImageEnhance.Contrast(img) - img = enhancer.enhance(2) - - # Return the sexy image object - return img - - -def main(): - img_obj = _blow_up_image() - if img_obj: - # Give that sexy image object to OCR to find potential user - _do_ocr_and_lookup(img_obj) - - -if __name__ == '__main__': - main() diff --git a/fakemenot/main.py b/fakemenot/main.py new file mode 100644 index 0000000..4c78415 --- /dev/null +++ b/fakemenot/main.py @@ -0,0 +1,139 @@ +import argparse +import os +import sys +import configparser +from TwitterSearch import * +from termcolor import colored + +from fakemenot.ocr import find_user_and_text_in_tweet_image + +parser = argparse.ArgumentParser(description='Process images') +parser.add_argument( + '--image', + '-i', + help='Twitter screenshot image', + required=True) +parser.add_argument('--limit', '-l', help='Limit tweets pulled', default=250) +parser.add_argument( + '--config', + '-c', + help='Path to twitter config (default: ~/.fakemenot.config)', + default="~/.fakemenot.config") + +args = parser.parse_args() + + +def get_config(): + config = configparser.RawConfigParser() + try: + with open(os.path.expanduser(args.config)) as config_file: + config.readfp(config_file) + except IOError as ioe: + print(colored("Couldn't open the config file {} because {}".format( + args.config, ioe), 'red')) + sys.exit(2) + return config + + +def _do_lookup(potential_user, body): + config = get_config() + limit_of_tweets = int(args.limit) + + # Just in case the person using the program puts in ' or " in the config. + consumer_key = config.get( + 'twitter', + 'consumer_key').replace( + '\'', '').replace( + '\"', '') + consumer_secret = config.get( + 'twitter', + 'consumer_secret').replace( + '\'', '').replace( + '\"', '') + access_token = config.get( + 'twitter', + 'access_token').replace( + '\'', '').replace( + '\"', '') + access_token_secret = config.get( + 'twitter', + 'access_token_secret').replace( + '\'', '').replace( + '\"', '') + + if potential_user is None: + print(colored("[*] It looks like OCR failed. Please make sure you " + + "crop the image as in sample and is readable.", 'red')) + exit(1) + + try: + tuo = TwitterUserOrder(potential_user[1:]) + ts = TwitterSearch( + consumer_key=consumer_key, + consumer_secret=consumer_secret, + access_token=access_token, + access_token_secret=access_token_secret + ) + tweets = [] + for tweet in ts.search_tweets_iterable(tuo): + # Nobody cares about re-tweets + if 'RT ' not in tweet['text']: + if tweet not in tweets: + tweets.append((tweet['text'], tweet['id'])) + if not limit_of_tweets: + break + else: + limit_of_tweets -= 1 + + # If none of that was found, let's report an OCR error + if body is None: + print(colored("[*] It looks like OCR failed.Please make sure you " + + "crop image as in sample and is readable.", 'red')) + + found_tweet = False + # Check against every tweet pulled + for tweet in tweets: + removed_elements = 0 + ltweet, orig_len = tweet[0].split(' '), len(tweet[0].split(' ')) + # Compare each element of body to element in body. TODO: Optimize + for ele in body: + if ele in ltweet: + removed_elements += 1 + ltweet.remove(ele) + removal_rate = (removed_elements / float(orig_len)) * 100 + + if int(removal_rate) > 75: + found_tweet = True + print(colored("[*] It looks like this is a valid tweet", + 'green')) + print(colored("-> Confidence : " + "%.2f" % removal_rate + "%", + 'green')) + print(colored("-> Potential URL : https://twitter.com/" + + potential_user[1:] + + "/status/" + str(tweet[1]), 'green')) + + elif int(removal_rate) in (55, 75): + found_tweet = True + print(colored("[*] This might be a valid tweet", 'yellow')) + print(colored("-> Confidence : " + "%.2f" % removal_rate + "%", + 'yellow')) + print(colored("-> Potential URL : https://twitter.com/" + + potential_user[1:] + + "/status/" + str(tweet[1]), 'yellow')) + + if not found_tweet: + print(colored("[*] I couldn't find a tweet like that. " + + "Try increasing the limit to pull more tweets", + 'yellow')) + + except TwitterSearchException as e: # catch all those ugly errors + print(e) + + +def main(): + user, tweet_text = find_user_and_text_in_tweet_image(args.image) + _do_lookup(user, tweet_text) + + +if __name__ == '__main__': + main() diff --git a/fakemenot/ocr.py b/fakemenot/ocr.py new file mode 100644 index 0000000..20fc99a --- /dev/null +++ b/fakemenot/ocr.py @@ -0,0 +1,59 @@ +""" +This requires the tesseract library (with the english training data) to do OCR on images. +See https://github.com/tesseract-ocr/tesseract/wiki and https://pypi.python.org/pypi/pytesseract +for installation instructions. +""" + +from PIL import Image, ImageEnhance, ImageFilter +from pytesseract import image_to_string + + +def find_user_and_text_in_tweet_image(image_path): + # OCR image + image = prepare_image_for_ocr(image_path) + if not image: + return None, None + + # Split result into single words + text = image_to_string(image, lang='eng') + words = text.replace('\n', ' ').split(' ') + + # Delegate extraction of name and body to separate function. + # Only the desktop detail view of a tweet is supported for now. + return extract_values_from_desktop_tweet(words) + + +def extract_values_from_desktop_tweet(words): + # Find user handle in words + user = next((w for w in words if (w and w[0] == '@')), None) + + # Find the tweet text body + body = None + if user: + # Usually there are 2 random chars after the user handle, then the body starts. + body_index = words.index(user) + 3 + + if len(words) > body_index: + body = " ".join(words[body_index:]).strip() + + return user, body + + +def prepare_image_for_ocr(image_path): + # Open the image + try: + image = Image.open(image_path) + except (OSError, IOError): + return None + + # Resize image + width = 2500.0 + height = width / image.size[0] * image.size[1] + image = image.resize((int(width), int(height)), Image.ANTIALIAS) + + # Clean image and increase contrast. See: https://stackoverflow.com/a/37750605/5486120 + image = image.filter(ImageFilter.MedianFilter()) + enhancer = ImageEnhance.Contrast(image) + image = enhancer.enhance(2) + + return image diff --git a/fakemenot/tests/res/test_ocr_1.png b/fakemenot/tests/res/test_ocr_1.png new file mode 100644 index 0000000000000000000000000000000000000000..389aa6bb20358674e2ceeda40c6cd91ccd650edf GIT binary patch literal 36264 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 Qb4pk+8D;5GsEPmo0O>~AWB>pF literal 0 HcmV?d00001 diff --git a/fakemenot/tests/res/test_ocr_3.png b/fakemenot/tests/res/test_ocr_3.png new file mode 100644 index 0000000000000000000000000000000000000000..a040d8f1a249d41b7b1eafc9ab1a9447d6657574 GIT binary patch literal 20234 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

KC^LO%d_^hz;d;TVz(|h}lnaVZQm;F@zd0PZ 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

hZb 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 0.95) + + def test_ocr_tweet_1(self): + expected_user = "@mattdm" + expected_text = "Got bored so updated my #fedora 25 laptop to pre-alpha 26. Started, went for lunch, came " \ + "back to a system which Just Works -- no fuss!" + self.common_test_ocr_tweet("res/test_ocr_1.png", expected_user, expected_text) + + def test_ocr_tweet_2(self): + expected_user = "@NASA" + expected_text = "For 70 years, planes loudly flew supersonic & barriers were broken. Now we're making " \ + "history again in a quiet way: go.nasa.gov/2kOO1cc" + self.common_test_ocr_tweet("res/test_ocr_2.png", expected_user, expected_text) + + def test_ocr_tweet_3(self): + expected_user = "@wikileaks" + expected_text = "Harvard made Harry Belafonte & Ira Berlin share its highest honor in African American " \ + "Studies with Harvey Weinstein" + self.common_test_ocr_tweet("res/test_ocr_3.png", expected_user, expected_text) + + +if __name__ == '__main__': + unittest.main() diff --git a/setup.py b/setup.py index c19987a..da3a7e8 100644 --- a/setup.py +++ b/setup.py @@ -18,6 +18,7 @@ 'pytesseract', 'twittersearch', 'termcolor', + 'Pillow', ] here = os.path.abspath(os.path.dirname(__file__)) @@ -34,7 +35,7 @@ description=DESCRIPTION, entry_points={ 'console_scripts': [ - 'fakemenot = fakemenot.__init__:main', + 'fakemenot = fakemenot.main:main', ], }, long_description=long_description, From 4bb64e05f57a10bd0dafeb9e19957350ee49ccae Mon Sep 17 00:00:00 2001 From: Amedeo Amato Date: Sun, 15 Oct 2017 19:36:38 +0200 Subject: [PATCH 2/2] Improve user handle recognition Potental handle has to be at least 2 chars long. Also the image was made a bit bigger for more stable OCR results. --- fakemenot/ocr.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fakemenot/ocr.py b/fakemenot/ocr.py index 20fc99a..6477e71 100644 --- a/fakemenot/ocr.py +++ b/fakemenot/ocr.py @@ -25,7 +25,7 @@ def find_user_and_text_in_tweet_image(image_path): def extract_values_from_desktop_tweet(words): # Find user handle in words - user = next((w for w in words if (w and w[0] == '@')), None) + user = next((w for w in words if (w and len(w) > 1 and w[0] == '@')), None) # Find the tweet text body body = None @@ -47,7 +47,7 @@ def prepare_image_for_ocr(image_path): return None # Resize image - width = 2500.0 + width = 4096.0 height = width / image.size[0] * image.size[1] image = image.resize((int(width), int(height)), Image.ANTIALIAS)