用神經網路模型給你的照片打分(Part I)

雨神姥爺發表於2019-03-02

在上一篇《如何通過直方圖判斷照片的曝光》中,我試圖以使用者對照片的評分作為評判標準,找出照片直方圖與其曝光好壞之間的關係,然而結果並不理想。一方面,曝光水平與最終的評分(點贊使用者數量)之間未必相關;另一方面,直方圖是對影像整體亮度水平的統計結果,這一粗略的統計損失了很多影像資訊(構圖、內容)等。此外,上一次收集了評分大於50的1w 張照片,結果發現評分的分佈存在較大偏差(實際上有75%以上的照片評分不足20),這也導致訓練樣本失衡。

為了更好地表徵影像資訊並,這次採用卷積神經網路對照片評分進行預測。而且這次評分的高低並不絕對代表照片的優劣,而是在人群中真實的評價分數。為了確保資料的完整,這次下載了全部 7.85w 張照片,約20G,雖然在最後訓練過程中為了節省時間不一定會全部用上,至少這次不會出現訓練樣本失衡的問題。同時這次也抓取了 6.97w 張照片的拍攝器材資訊(EXIF),因此在開始訓練之前,首先對這些資料進行一個描述性的統計分析。

問題

  1. 最流行的相機型號排名;
  2. 不同型號相機拍攝的照片所獲得的平均得分;
  3. 不同標籤的照片最常使用的相機型號分佈;
  4. 照片標籤之間的相互關聯關係。

首先來看格式化儲存的資料格式:

import pandas as pd
cameraDF = pd.read_pickle("cameraInfo.pkl")
cameraDF.head()複製程式碼

用神經網路模型給你的照片打分(Part I)
Pasted\_Image\_07\_05\_2017\_\_2\_15\_PM.jpg

本文采用 Bokeh 對 Pandas 資料進行視覺化:

from bokeh.plotting import figure, show
from bokeh.io import output_notebook
from bokeh.models import HoverTool
output_notebook()複製程式碼

1. 最流行的相機型號 Top10

cameraCount = cameraDF.camera.value_counts().head(10).to_frame(`Count`)
cameraCount複製程式碼

用神經網路模型給你的照片打分(Part I)
images\_statistical\_analysis.jpg

繪製圖表:

from bokeh.charts import Bar
from bokeh.charts.attributes import cat
bar = Bar(cameraCount, label=cat(sort=False), values=`Count`, title="相機型號 Top10", legend=None)
bar.xaxis.axis_label = None
bar.yaxis.axis_label = None
bar.title.align = `center`
bar.width = 900
bar.tools = []
show(bar)複製程式碼

用神經網路模型給你的照片打分(Part I)
bokeh_plot.png

可以看出,Canon 和 Nikon 幾乎包攬前10,還有一個一騎絕塵的 SONY 微單 ILCE-7RM2。

2. 相機型號所拍照片平均得分

也許在大師手中任何器材都能拍出完美的照片,但是我們還是要看看在人群中,使用不同器材拍出的照片所獲得的平均評價:

cameraScores = cameraDF.groupby(`camera`) 
    .filter(lambda x: len(x) > 500) 
    .groupby(`camera`)[`favs`].mean() 
    .to_frame(`M`)
cameraScores.head()複製程式碼

用神經網路模型給你的照片打分(Part I)
IMAGE

繪製圖表:

from bokeh.charts.attributes import cat
box = Bar(cameraScores.sort_values(`M`, ascending=False),
          values=`M`,
          label=cat(sort=False),
          legend=None,
          title=`平均得分`)
box.title.align = `center`
show(box)複製程式碼

用神經網路模型給你的照片打分(Part I)
bokeh_plot.png

3. 不同標籤(型別)照片最常用裝置

和器材與評分的關係一樣,未必存在更適合特定場景的特定器材,但我們還是可以統計一下看看,對於不同型別照片最常使用的拍攝器材。

TOI = cameraDF.tag.unique()[:10]
tagOfInterest = cameraDF[cameraDF.tag.apply(lambda x: x in TOI)]

tagOfInterest = tagOfInterest.groupby([`tag`, `camera`])
    .count().reset_index()
    .sort_values([`tag`, `author`], ascending=False)
    .groupby(`tag`).head(3)
tagOfInterest[`total`] = tagOfInterest.author複製程式碼

繪製圖表:

用神經網路模型給你的照片打分(Part I)
bokeh_plot (1).png

當然這裡的標籤並不是相互獨立的,也許人像中有相當一部分也是美女照片,至於標籤之間的相互關係,我們通過下一個圖表來展示。

3. 照片標籤之間的關聯

為了更好地將照片按照評分進行歸類,一個更好的方案是按照不同的標籤(型別)進行區分。例如,人像和風光照片的評價標準可能存在較大差異,因此在評分之前可以先進行歸類。上面提到,不同標籤之間可能存在重疊(例如人像和美女),因此我們再來統計一下照片標籤之間的關聯。

TagRelationship = [] 
for i in range(len(cameraDF)):
    tag = cameraDF.loc[i, `tag`]
    other_tags = cameraDF.loc[i, `other_tags`]
    if tag in TOI:
        for o_t in other_tags.split("|"):
            if o_t != tag and o_t in TOI:
                TagRelationship.append({`main_tag`: tag, `rel_tag`: o_t, `value`: 1})

tagRelSum = TagRelationshipDF.groupby([`main_tag`, `rel_tag`])[`value`].sum() 
    .to_frame().reset_index()

from bokeh.charts import Chord
chd = Chord(tagRelSum, source=`main_tag`, target=`rel_tag`, value=`value`)
show(chd)複製程式碼

用神經網路模型給你的照片打分(Part I)
bokeh_plot (2).png

總結

以上是對照片資訊(EXIF)的一個簡單統計,從中多多少少可以找到一些我們想要知道問題的答案。接下來就我下載了 20G 的照片真正想要做的————對照片進行評分,資料量不算特別大,但是要訓練起來也不會太快,讓我們拭目以待。

原文連結

相關文章