全國高校計算機能力挑戰賽(基於tensorflow+python+opencv)!

接著上一篇,這一篇把剩下兩個任務做完

  • 讀取圖片和圖片預處理;
  • 搭建VGG神經網絡;
  • 開始訓練和一些訓練技巧;
  • 製作新數據集和數據增強;
  • 模型融合;

生成驗證碼:

首先在 查字體網 (百度可以搜到~)查到我們需要的字體

全國高校計算機能力挑戰賽(基於tensorflow+python+opencv)!

全國高校計算機能力挑戰賽(基於tensorflow+python+opencv)!

然後下載TTF文件,放到我們的文件目錄下。

生成驗證碼:

調用 數據集.py 程序並輸入生成數量,生成驗證碼

代碼:

from PIL import ImageFont, ImageDraw, ImageFilter, Image

import random

import pandas as pd

import numpy as np

import os

import cv2

co = np.array(pd.read_csv('l.csv'))

k = []

num = int(input('請輸入生成數目並保存在/pic_data中: '))

for i in co:

k.append(tuple(i))

co = k

# 字體路徑

font_path = "RAVIE.TTF"

# 位數

numbers = 1

# 驗證碼大小

size = (120, 40)

# 背景顏色

bgcolor = (random.randint(0, 255), 0, 0)

# line 干擾線

draw_line = True

# 線數量範圍

line_numbers = (1, 4)

def bgfontrange():

global bgcolor

bgcolor = random.choice(co)

source1 = [str(x) for x in range(0, 10)] # 0-9之間

source2 = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l",

"m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]

source3 = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L",

"M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]

source = []

source.extend(source3)

source.extend(source1)

source.extend(source2)

# 隨機生成四個隨機數:

def make_text():

return "".join(random.sample(source, numbers)) # "",加上4個隨機數

# 隨機劃線

def make_line(draw, width, height):

begin = (random.randint(0, width), random.randint(0, height))

end = (random.randint(0, width), random.randint(0, height))

draw.line([begin, end], fill=(random.randint(170, 210), random.randint( 130, 170), random.randint(90, 130)), width=random.choice([2, 3])) # 繪線

def create_points(draw, point_chance, width, height):

chance = min(100, max(0, int(point_chance))) # 大小限制在[0, 100]

for w in range(width):

for h in range(height):

tmp = random.randint(0, 100)

if tmp > 100 - chance:

draw.point((w, h), fill=(random.randint(0, 200), 0, 0))

data = pd.DataFrame()

data1 = []

def rndChar():

return chr(random.randint(65, 122))

def rndColorChar():

return(random.randint(20, 110), random.randint(20, 110), random.randint(20, 110))

# 生成驗證碼

def make_codepng(index):

width, height = size # 圖片的寬度與高度

# RGBA是透明度

image = Image.new("RGB", (width, height), bgcolor) # 創建圖片

draw = ImageDraw.Draw(image) # 繪圖工具

text = make_text() # 生成隨機字符串

font = ImageFont.truetype(font_path, 29) # 定義字體大小

font_width, font_height = font.getsize(text) # 設置字體的寬度與高度

s = ''

for t in range(4):

s1 = make_text()

s = s + s1

bias = random.randint(-5, 5)

draw.text((25*t+10, (height-font_height)/2+bias),

s1, font=font, fill=rndColorChar())

text = s

data1.append(s)

if draw_line:

print("num : {}".format(index), end='\\r')

num = random.randint(1, 3)

for i in range(num):

make_line(draw, width, height)

create_points(draw, 6, width, height)

filename = r"./pic_data/"+text+".jpg"

# filename = text + '.jpg'

with open(filename, "wb") as file:

image.save(file, format='JPEG')

if not os.path.exists("./pic_data"):

os.makedirs("./pic_data")

for i in range(num):

bgfontrange() # 背景顏色隨機

make_codepng(i)

其中需要的文件是

全國高校計算機能力挑戰賽(基於tensorflow+python+opencv)!

全國高校計算機能力挑戰賽(基於tensorflow+python+opencv)!

(l.csv文件保存了對官方給出數據集的背景RGB值的取樣)

這樣就可以生成一模一樣的數據集啦~

全國高校計算機能力挑戰賽(基於tensorflow+python+opencv)!

模型融合:

一般來說,模型融合可以得到更好的測試集表現結果,當然前提是模型之間相關性越小越好、模型結構差距越大越好。我們這裡就使用Voting的方式進行融合,即對同一張圖片,使用不同的模型預測進行投票。

這裡我做了7個模型,放在了另一個文件夾裡:

全國高校計算機能力挑戰賽(基於tensorflow+python+opencv)!

不同模型採用了不同的預處理方式和網絡結構,子文件夾比如Net0,就存放了預處理方式和網絡結構及其模型。

全國高校計算機能力挑戰賽(基於tensorflow+python+opencv)!

由於後來官方改成了提交docker文件,程序改動比較大,這裡就不放出來啦,需要源碼的留下郵箱哦~

總結:

1、預處理很重要!

2、模型融合很重要!

3、調參數也是一個很重要的環節,這感覺更像一個需要經驗的地方,所以有時間不如選一個模型,嘗試一下怎麼把它的性能調到最高。

下期再見啦~

Ps:下一系列講一下SSD目標檢測算法及其實現,參考了Github上balance大神的SSD-tensorflow,但更多使用了Numpy而非tensorflow實現圖片的處理,而且由於balance大神寫的時候綜合考慮了模型的效率、應用性等等,代碼可能比較複雜;這裡的話就是使用了一個最簡單最直接的方法,參考論文復現的一個SSD-vgg網絡,效果如圖,儘快更新~

在宿舍隨手拍了一張圖(然後發現特徵很多,干擾也很多,正好適合測試一下目標檢測算法),然後第一張是balance大神的300×300的模型的結果,第二張是我們自己從頭搭建的模型的結果:

全國高校計算機能力挑戰賽(基於tensorflow+python+opencv)!

可以看到我們的模型對於小目標檢測效果似乎更好一點(比如桌子上的一些bottles),對遮擋目標的檢測也比較好(比如這個被衣服擋住的chair);

但是可能存在過擬合的現象,比如把左下角的盆當成了chair(盆:我冤枉啊!),也有把書包檢測成chair的情況(書包:我也冤枉啊!)。

先放一下文件目錄吧,下期再見~

全國高校計算機能力挑戰賽(基於tensorflow+python+opencv)!

源碼就不分享啦~需要諮詢的私信小編01獲取~


分享到:


相關文章: