在上一篇《如何通過直方圖判斷照片的曝光》中,我試圖以使用者對照片的評分作為評判標準,找出照片直方圖與其曝光好壞之間的關係,然而結果並不理想。一方面,曝光水平與最終的評分(點贊使用者數量)之間未必相關;另一方面,直方圖是對影像整體亮度水平的統計結果,這一粗略的統計損失了很多影像資訊(構圖、內容)等。此外,上一次收集了評分大於50的1w 張照片,結果發現評分的分佈存在較大偏差(實際上有75%以上的照片評分不足20),這也導致訓練樣本失衡。
為了更好地表徵影像資訊並,這次採用卷積神經網路對照片評分進行預測。而且這次評分的高低並不絕對代表照片的優劣,而是在人群中真實的評價分數。為了確保資料的完整,這次下載了全部 7.85w 張照片,約20G,雖然在最後訓練過程中為了節省時間不一定會全部用上,至少這次不會出現訓練樣本失衡的問題。同時這次也抓取了 6.97w 張照片的拍攝器材資訊(EXIF),因此在開始訓練之前,首先對這些資料進行一個描述性的統計分析。
問題
- 最流行的相機型號排名;
- 不同型號相機拍攝的照片所獲得的平均得分;
- 不同標籤的照片最常使用的相機型號分佈;
- 照片標籤之間的相互關聯關係。
首先來看格式化儲存的資料格式:
import pandas as pd
cameraDF = pd.read_pickle("cameraInfo.pkl")
cameraDF.head()複製程式碼
本文采用 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複製程式碼
繪製圖表:
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)複製程式碼
可以看出,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()複製程式碼
繪製圖表:
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)複製程式碼
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複製程式碼
繪製圖表:
當然這裡的標籤並不是相互獨立的,也許人像中有相當一部分也是美女照片,至於標籤之間的相互關係,我們通過下一個圖表來展示。
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)複製程式碼
總結
以上是對照片資訊(EXIF)的一個簡單統計,從中多多少少可以找到一些我們想要知道問題的答案。接下來就我下載了 20G 的照片真正想要做的————對照片進行評分,資料量不算特別大,但是要訓練起來也不會太快,讓我們拭目以待。
【原文連結】