众包算法
1.简言
在收集完用户的手绘数据之后,我们就要想办法得出最后的分类。在之前的文章中我们已经提出一种解决方法,即通过em算法,迭代,得到我们的分类结果,为了防止算法的效果不好,我们采用了第二套算法,划分等价类。
2.算法简介
众包算法中包含的思想就是混合人和机器的工作流程。首先用机器去做一个预处理,可以用前面的某个相似度函数,如Jaccard ;但这次我们不去寻找那些相似度较高的图片,而是排除那些相似度太低,也就是小于一定的阈值,我们认为已经不可能是同一类的这样的图片。
然后将剩下的部分交给人去进行识别。相应的,也可以使用前面提到的基于对的HIT 和基于簇的HIT。基于对的HIT 可能没有太多的问题,但是基于簇的HIT 还是有很多方面的东西需要考虑。
3.算法实现
首先基于上篇文章的图片相似度算法,先用程序进行简单初步的分类,然后将任务下分给用户,最后得出等价类
我们将分类问题转化为图的划分。收集用户对于图中两点之间的相似度,超过某个阈值则认为他们属于一个连通分量。
def runAllImageSimilaryFun(para1, para2):
# 均值、差值、感知哈希算法三种算法值越小,则越相似,相同图片值为0
# 三直方图算法和单通道的直方图 0-1之间,值越大,越相似。 相同图片为1
# 通过imread方法直接读取物理路径
img1 = cv2.imread(para1)
img2 = cv2.imread(para2)
hash1 = aHash(img1)
hash2 = aHash(img2)
n1 = cmpHash(hash1, hash2)
hash1 = dHash(img1)
hash2 = dHash(img2)
n2 = cmpHash(hash1, hash2)
hash1 = pHash(img1)
hash2 = pHash(img2)
n3 = cmpHash(hash1, hash2)
n4 = classify_hist_with_split(img1, img2)
n5 = calculate(img1, img2)
return float((n1 + n2 + n3 + n4 + n5) / 5)