
import re
import os
import sys
import random

N = 7
scale = 'color'

def get_cluster_file(cluster):
	return 'clusters/%s/%s.jpg' % (N,cluster)

def average(cluster,files):
	cmd = 'convert %s -average clusters/%s/%s.jpg' % (' '.join(files),N,cluster)
	os.system(cmd)

def dist(file1,file2):
	cmd = "compare -metric mae %s %s /dev/null >/tmp/bk_face_dist" % (file1,file2)
	os.system(cmd)
	f = file('/tmp/bk_face_dist')
	s = f.read().strip()
	f.close()
	s = eval(s.split()[0])
	return s

os.system("ls scaled_faces/norm_%s/*.jpg >/tmp/bk_face_dir" % scale)
f = file('/tmp/bk_face_dir')
files = [line.strip() for line in f.readlines()]
f.close()

def init():
	global clusters
	clusters = [[]]*N
	for f in files:
		cluster = int(random.random() * N)
		clusters[cluster] = clusters[cluster]+[f]
	for i in range(N):
		average(i,clusters[i])

def iterate():
	global clusters
	clusters = [[]]*N
	for f in files:
		closest_i = 0
		closest = dist(f,get_cluster_file(0))
		for i in range(1,N):
			d = dist(f,get_cluster_file(i))
			if d < closest:
				closest_i = i
				closest = d
		clusters[closest_i] = clusters[closest_i] + [f]
	for i in range(N):
		average(i,clusters[i])

init()
for i in range(20):
	print i
	iterate()

f = file('clusters/%s/clusters.html' % N,'w')
f.write('<html><body>\n')
for i in range(N):
	f.write('%d - <img src="%s.jpg"><br />\n<hr />\n' % (i,i))
	for photo in clusters[i]:
		match = re.compile("scaled_faces/norm_%s/(.*).jpg" % scale).search(photo)
		f.write('<img src="../../cropped_faces/color/%s.jpg" />\n' % match.group(1))
	f.write('<hr />\n')
f.write('</body></html>')
f.close()

