ইনপুট হিসাবে যে কোনও যুক্তিসঙ্গত ক্ষতিহীন বিন্যাসে একটি কালো-সাদা চিত্র দেওয়া হয়েছে , আউটপুট ASCII আর্ট যা সম্ভব ইনপুট চিত্রের কাছাকাছি।
বিধি
- কেবল লাইনফিড এবং এএসসিআইআই বাইট 32-127 ব্যবহার করা যেতে পারে।
- ইনপুট চিত্রটি ক্রপ করা হবে যাতে চিত্রের চারপাশে কোনও বহিরাগত সাদা স্থান না থাকে।
- জমাগুলি অবশ্যই 5 মিনিটের নিচে পুরো স্কোরিং কর্পসটি সম্পূর্ণ করতে সক্ষম হবে।
- শুধুমাত্র কাঁচা পাঠ্য গ্রহণযোগ্য; সমৃদ্ধ পাঠ্য বিন্যাস নেই।
- স্কোরিংয়ে ব্যবহৃত হরফটি হ'ল 20-pt লিনাক্স লিবের্টিন ।
- আউটপুট পাঠ্য ফাইলটি যখন নীচে বর্ণিত হিসাবে কোনও চিত্রে রূপান্তরিত হবে তখন অবশ্যই উভয় মাত্রায় 30 পিক্সেলের মধ্যে ইনপুট চিত্রের মতো একই মাত্রা হওয়া উচিত।
স্কোরিং
এই চিত্রগুলি স্কোর করার জন্য ব্যবহৃত হবে:
আপনি এখানে চিত্রগুলির একটি জিপ ফাইল ডাউনলোড করতে পারেন ।
দাখিলগুলি এই কর্পাসের জন্য অনুকূলিত করা উচিত নয়; বরং তাদের অনুরূপ মাত্রার 8 টি কালো-সাদা চিত্রের জন্য কাজ করা উচিত। আমি যদি সন্দেহ করি যে জমাগুলি এই নির্দিষ্ট চিত্রগুলির জন্য অনুকূলিত করা হচ্ছে তবে কর্পাসে চিত্রগুলি পরিবর্তন করার অধিকার আমি সংরক্ষণ করি।
স্কোরিংটি এই স্ক্রিপ্টের মাধ্যমে সম্পাদন করা হবে:
#!/usr/bin/env python
from __future__ import print_function
from __future__ import division
# modified from http://stackoverflow.com/a/29775654/2508324
# requires Linux Libertine fonts - get them at https://sourceforge.net/projects/linuxlibertine/files/linuxlibertine/5.3.0/
# requires dssim - get it at https://github.com/pornel/dssim
import PIL
import PIL.Image
import PIL.ImageFont
import PIL.ImageOps
import PIL.ImageDraw
import pathlib
import os
import subprocess
import sys
PIXEL_ON = 0 # PIL color to use for "on"
PIXEL_OFF = 255 # PIL color to use for "off"
def dssim_score(src_path, image_path):
out = subprocess.check_output(['dssim', src_path, image_path])
return float(out.split()[0])
def text_image(text_path):
"""Convert text file to a grayscale image with black characters on a white background.
arguments:
text_path - the content of this file will be converted to an image
"""
grayscale = 'L'
# parse the file into lines
with open(str(text_path)) as text_file: # can throw FileNotFoundError
lines = tuple(l.rstrip() for l in text_file.readlines())
# choose a font (you can see more detail in my library on github)
large_font = 20 # get better resolution with larger size
if os.name == 'posix':
font_path = '/usr/share/fonts/linux-libertine/LinLibertineO.otf'
else:
font_path = 'LinLibertine_DRah.ttf'
try:
font = PIL.ImageFont.truetype(font_path, size=large_font)
except IOError:
print('Could not use Libertine font, exiting...')
exit()
# make the background image based on the combination of font and lines
pt2px = lambda pt: int(round(pt * 96.0 / 72)) # convert points to pixels
max_width_line = max(lines, key=lambda s: font.getsize(s)[0])
# max height is adjusted down because it's too large visually for spacing
test_string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
max_height = pt2px(font.getsize(test_string)[1])
max_width = pt2px(font.getsize(max_width_line)[0])
height = max_height * len(lines) # perfect or a little oversized
width = int(round(max_width + 40)) # a little oversized
image = PIL.Image.new(grayscale, (width, height), color=PIXEL_OFF)
draw = PIL.ImageDraw.Draw(image)
# draw each line of text
vertical_position = 5
horizontal_position = 5
line_spacing = int(round(max_height * 0.8)) # reduced spacing seems better
for line in lines:
draw.text((horizontal_position, vertical_position),
line, fill=PIXEL_ON, font=font)
vertical_position += line_spacing
# crop the text
c_box = PIL.ImageOps.invert(image).getbbox()
image = image.crop(c_box)
return image
if __name__ == '__main__':
compare_dir = pathlib.PurePath(sys.argv[1])
corpus_dir = pathlib.PurePath(sys.argv[2])
images = []
scores = []
for txtfile in os.listdir(str(compare_dir)):
fname = pathlib.PurePath(sys.argv[1]).joinpath(txtfile)
if fname.suffix != '.txt':
continue
imgpath = fname.with_suffix('.png')
corpname = corpus_dir.joinpath(imgpath.name)
img = text_image(str(fname))
corpimg = PIL.Image.open(str(corpname))
img = img.resize(corpimg.size, PIL.Image.LANCZOS)
corpimg.close()
img.save(str(imgpath), 'png')
img.close()
images.append(str(imgpath))
score = dssim_score(str(corpname), str(imgpath))
print('{}: {}'.format(corpname, score))
scores.append(score)
print('Score: {}'.format(sum(scores)/len(scores)))
স্কোরিং প্রক্রিয়া:
- প্রতিটি কর্পাস চিত্রের জন্য জমা দিন,
.txt
কর্পস ফাইলের মতো একই স্টেমের সাথে ফাইলগুলিতে ফলাফল আউটপুট করে (ম্যানুয়ালি করা)। - 20-পয়েন্ট ফন্ট ব্যবহার করে প্রতিটি স্পেস ফাইলকে পিএনজি চিত্রে রূপান্তর করুন, শ্বেত স্পেস ক্রপ করুন।
- ল্যানকোস রিস্যাম্পলিং ব্যবহার করে ফলাফলের চিত্রটিকে মূল চিত্রের আকারের আকার দিন।
- প্রতিটি টেক্সট চিত্র ব্যবহার করে মূল চিত্রের সাথে তুলনা করুন
dssim
। - প্রতিটি পাঠ্য ফাইলের জন্য dssim স্কোর আউটপুট।
- গড় স্কোর আউটপুট।
স্ট্রাকচারাল সাদৃশ্য (মেট্রিক যার মাধ্যমে dssim
স্কোর গণনা করে) হ'ল একটি মেট্রিক যা মানুষের দৃষ্টিভঙ্গি এবং চিত্রগুলিতে অবজেক্ট সনাক্তকরণের উপর ভিত্তি করে। এটিকে স্পষ্টভাবে বলতে গেলে: দুটি চিত্র যদি মানুষের মতো হয় তবে তাদের (সম্ভবত) কম স্কোর থাকবে dssim
।
বিজয়ী জমাটি সর্বনিম্ন গড় স্কোর সহ জমা হবে।
.txt
ফাইলগুলিতে ফলাফল আউটপুট করে" আপনি কী বোঝাতে চেয়েছেন তা কি আপনি পরিষ্কার করতে পারেন ? প্রোগ্রাম আউটপুট পাঠ্য যা একটি ফাইলে পাইপ করা উচিত বা আমাদের সরাসরি কোনও ফাইল আউটপুট করা উচিত?