日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

用python搭建一個花卉識別系統

瀏覽:25日期:2022-06-16 11:17:00
目錄一.開源神經網絡(AlexNet)1.獲取數據集2.神經網絡模型3.訓練神經網絡4.對模型進行預測二、花卉識別系統搭建(flask)1.構建頁面:2.調用神經網絡模型3.系統識別結果4.啟動系統:三、總結一.開源神經網絡(AlexNet)1.獲取數據集

使用步驟如下:* (1)在data_set文件夾下創建新文件夾'flower_data'* (2)點擊鏈接下載花分類數據集download.tensorflow.org/example_im…* (3)解壓數據集到flower_data文件夾下* (4)執行'split_data.py'腳本自動將數據集劃分成訓練集train和驗證集val

split_data.py

import osfrom shutil import copy, rmtreeimport random def mk_file(file_path: str): if os.path.exists(file_path):# 如果文件夾存在,則先刪除原文件夾在重新創建rmtree(file_path) os.makedirs(file_path) def main(): # 保證隨機可復現 random.seed(0) # 將數據集中10%的數據劃分到驗證集中 split_rate = 0.1 # 指向你解壓后的flower_photos文件夾 cwd = os.getcwd() data_root = os.path.join(cwd, 'flower_data') origin_flower_path = os.path.join(data_root, 'flower_photos') assert os.path.exists(origin_flower_path) flower_class = [cla for cla in os.listdir(origin_flower_path) if os.path.isdir(os.path.join(origin_flower_path, cla))] # 建立保存訓練集的文件夾 train_root = os.path.join(data_root, 'train') mk_file(train_root) for cla in flower_class:# 建立每個類別對應的文件夾mk_file(os.path.join(train_root, cla)) # 建立保存驗證集的文件夾 val_root = os.path.join(data_root, 'val') mk_file(val_root) for cla in flower_class:# 建立每個類別對應的文件夾mk_file(os.path.join(val_root, cla)) for cla in flower_class:cla_path = os.path.join(origin_flower_path, cla)images = os.listdir(cla_path)num = len(images)# 隨機采樣驗證集的索引eval_index = random.sample(images, k=int(num*split_rate))for index, image in enumerate(images): if image in eval_index:# 將分配至驗證集中的文件復制到相應目錄image_path = os.path.join(cla_path, image)new_path = os.path.join(val_root, cla)copy(image_path, new_path) else:# 將分配至訓練集中的文件復制到相應目錄image_path = os.path.join(cla_path, image)new_path = os.path.join(train_root, cla)copy(image_path, new_path) print('r[{}] processing [{}/{}]'.format(cla, index+1, num), end='') # processing barprint() print('processing done!') if __name__ == ’__main__’: main()2.神經網絡模型

model.py

import torch.nn as nnimport torch class AlexNet(nn.Module): def __init__(self, num_classes=1000, init_weights=False):super(AlexNet, self).__init__()# 用nn.Sequential()將網絡打包成一個模塊,精簡代碼self.features = nn.Sequential( # 卷積層提取圖像特征 nn.Conv2d(3, 48, kernel_size=11, stride=4, padding=2), # input[3, 224, 224] output[48, 55, 55] nn.ReLU(inplace=True), # 直接修改覆蓋原值,節省運算內存 nn.MaxPool2d(kernel_size=3, stride=2), # output[48, 27, 27] nn.Conv2d(48, 128, kernel_size=5, padding=2), # output[128, 27, 27] nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2), # output[128, 13, 13] nn.Conv2d(128, 192, kernel_size=3, padding=1), # output[192, 13, 13] nn.ReLU(inplace=True), nn.Conv2d(192, 192, kernel_size=3, padding=1), # output[192, 13, 13] nn.ReLU(inplace=True), nn.Conv2d(192, 128, kernel_size=3, padding=1), # output[128, 13, 13] nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2), # output[128, 6, 6])self.classifier = nn.Sequential( # 全連接層對圖像分類 nn.Dropout(p=0.5), # Dropout 隨機失活神經元,默認比例為0.5 nn.Linear(128 * 6 * 6, 2048), nn.ReLU(inplace=True), nn.Dropout(p=0.5), nn.Linear(2048, 2048), nn.ReLU(inplace=True), nn.Linear(2048, num_classes),)if init_weights: self._initialize_weights() # 前向傳播過程 def forward(self, x):x = self.features(x)x = torch.flatten(x, start_dim=1)# 展平后再傳入全連接層x = self.classifier(x)return x# 網絡權重初始化,實際上 pytorch 在構建網絡時會自動初始化權重 def _initialize_weights(self):for m in self.modules(): if isinstance(m, nn.Conv2d): # 若是卷積層nn.init.kaiming_normal_(m.weight, mode=’fan_out’, # 用(何)kaiming_normal_法初始化權重nonlinearity=’relu’)if m.bias is not None: nn.init.constant_(m.bias, 0) # 初始化偏重為0 elif isinstance(m, nn.Linear): # 若是全連接層nn.init.normal_(m.weight, 0, 0.01) # 正態分布初始化nn.init.constant_(m.bias, 0) # 初始化偏重為03.訓練神經網絡

train.py

# 導入包import torchimport torch.nn as nnfrom torchvision import transforms, datasets, utilsimport matplotlib.pyplot as pltimport numpy as npimport torch.optim as optimfrom model import AlexNetimport osimport jsonimport time # 使用GPU訓練device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')with open(os.path.join('train.log'), 'a') as log: log.write(str(device)+'n') #數據預處理data_transform = { 'train': transforms.Compose([transforms.RandomResizedCrop(224), # 隨機裁剪,再縮放成 224×224 transforms.RandomHorizontalFlip(p=0.5), # 水平方向隨機翻轉,概率為 0.5, 即一半的概率翻轉, 一半的概率不翻轉 transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]), 'val': transforms.Compose([transforms.Resize((224, 224)), # cannot 224, must (224, 224) transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])} #導入、加載 訓練集# 導入訓練集#train_set = torchvision.datasets.CIFAR10(root=’./data’, # 數據集存放目錄# train=True, # 表示是數據集中的訓練集#download=True, # 第一次運行時為True,下載數據集,下載完成后改為False#transform=transform) # 預處理過程# 加載訓練集 #train_loader = torch.utils.data.DataLoader(train_set, # 導入的訓練集# batch_size=50, # 每批訓練的樣本數# shuffle=False, # 是否打亂訓練集# num_workers=0) # num_workers在windows下設置為0 # 獲取圖像數據集的路徑data_root = os.path.abspath(os.path.join(os.getcwd(), '../..')) # get data root path 返回上上層目錄image_path = data_root + '/jqsj/data_set/flower_data/' # flower data_set path # 導入訓練集并進行預處理train_dataset = datasets.ImageFolder(root=image_path + '/train', transform=data_transform['train'])train_num = len(train_dataset) # 按batch_size分批次加載訓練集train_loader = torch.utils.data.DataLoader(train_dataset,# 導入的訓練集 batch_size=32, # 每批訓練的樣本數 shuffle=True,# 是否打亂訓練集 num_workers=0)# 使用線程數,在windows下設置為0 #導入、加載 驗證集# 導入驗證集并進行預處理validate_dataset = datasets.ImageFolder(root=image_path + '/val',transform=data_transform['val'])val_num = len(validate_dataset) # 加載驗證集validate_loader = torch.utils.data.DataLoader(validate_dataset,# 導入的驗證集 batch_size=32, shuffle=True, num_workers=0) # 存儲 索引:標簽 的字典# 字典,類別:索引 {’daisy’:0, ’dandelion’:1, ’roses’:2, ’sunflower’:3, ’tulips’:4}flower_list = train_dataset.class_to_idx# 將 flower_list 中的 key 和 val 調換位置cla_dict = dict((val, key) for key, val in flower_list.items()) # 將 cla_dict 寫入 json 文件中json_str = json.dumps(cla_dict, indent=4)with open(’class_indices.json’, ’w’) as json_file: json_file.write(json_str) #訓練過程net = AlexNet(num_classes=5, init_weights=True) # 實例化網絡(輸出類型為5,初始化權重)net.to(device) # 分配網絡到指定的設備(GPU/CPU)訓練loss_function = nn.CrossEntropyLoss() # 交叉熵損失optimizer = optim.Adam(net.parameters(), lr=0.0002) # 優化器(訓練參數,學習率) save_path = ’./AlexNet.pth’best_acc = 0.0 for epoch in range(150): ########################################## train ############################################### net.train() # 訓練過程中開啟 Dropout running_loss = 0.0# 每個 epoch 都會對 running_loss 清零 time_start = time.perf_counter()# 對訓練一個 epoch 計時for step, data in enumerate(train_loader, start=0): # 遍歷訓練集,step從0開始計算images, labels = data # 獲取訓練集的圖像和標簽optimizer.zero_grad()# 清除歷史梯度outputs = net(images.to(device)) # 正向傳播loss = loss_function(outputs, labels.to(device)) # 計算損失loss.backward() # 反向傳播optimizer.step() # 優化器更新參數running_loss += loss.item()# 打印訓練進度(使訓練過程可視化)rate = (step + 1) / len(train_loader) # 當前進度 = 當前step / 訓練一輪epoch所需總stepa = '*' * int(rate * 50)b = '.' * int((1 - rate) * 50)with open(os.path.join('train.log'), 'a') as log: log.write(str('rtrain loss: {:^3.0f}%[{}->{}]{:.3f}'.format(int(rate * 100), a, b, loss))+'n')print('rtrain loss: {:^3.0f}%[{}->{}]{:.3f}'.format(int(rate * 100), a, b, loss), end='') print() with open(os.path.join('train.log'), 'a') as log: log.write(str(’%f s’ % (time.perf_counter()-time_start))+'n') print(’%f s’ % (time.perf_counter()-time_start)) ########################################### validate ########################################### net.eval() # 驗證過程中關閉 Dropout acc = 0.0 with torch.no_grad():for val_data in validate_loader: val_images, val_labels = val_data outputs = net(val_images.to(device)) predict_y = torch.max(outputs, dim=1)[1] # 以output中值最大位置對應的索引(標簽)作為預測輸出 acc += (predict_y == val_labels.to(device)).sum().item() val_accurate = acc / val_num# 保存準確率最高的那次網絡參數if val_accurate > best_acc: best_acc = val_accurate torch.save(net.state_dict(), save_path)with open(os.path.join('train.log'), 'a') as log: log.write(str(’[epoch %d] train_loss: %.3f test_accuracy: %.3f n’ % (epoch + 1, running_loss / step, val_accurate))+'n')print(’[epoch %d] train_loss: %.3f test_accuracy: %.3f n’ % (epoch + 1, running_loss / step, val_accurate))with open(os.path.join('train.log'), 'a') as log: log.write(str(’Finished Training’)+'n')print(’Finished Training’)

訓練結果后,準確率是94%

訓練日志如下:

用python搭建一個花卉識別系統

4.對模型進行預測

predict.py

import torch

接著對其中一個花卉圖片進行識別,其結果如下:

用python搭建一個花卉識別系統

可以看到只有一個識別結果(daisy雛菊)和準確率1.0是100%(范圍是0~1,所以1對應100%)

為了方便使用這個神經網絡,接著我們將其開發成一個可視化的界面操作

二、花卉識別系統搭建(flask)1.構建頁面:

用python搭建一個花卉識別系統

2.調用神經網絡模型

main.py

# coding:utf-8 from flask import Flask, render_template, request, redirect, url_for, make_response, jsonifyfrom werkzeug.utils import secure_filenameimport osimport time ####################模型所需庫包import torchfrom model import AlexNetfrom PIL import Imagefrom torchvision import transformsimport matplotlib.pyplot as pltimport json # read class_indicttry: json_file = open(’./class_indices.json’, ’r’) class_indict = json.load(json_file)except Exception as e: print(e) exit(-1) # create modelmodel = AlexNet(num_classes=5)# load model weightsmodel_weight_path = './AlexNet.pth'#, map_location=’cpu’model.load_state_dict(torch.load(model_weight_path, map_location=’cpu’)) # 關閉 Dropoutmodel.eval() ###################from datetime import timedelta# 設置允許的文件格式ALLOWED_EXTENSIONS = set([’png’, ’jpg’, ’JPG’, ’PNG’, ’bmp’]) def allowed_file(filename): return ’.’ in filename and filename.rsplit(’.’, 1)[1] in ALLOWED_EXTENSIONS app = Flask(__name__)# 設置靜態文件緩存過期時間app.send_file_max_age_default = timedelta(seconds=1) #圖片裝換操作def tran(img_path): # 預處理 data_transform = transforms.Compose([transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]) # load image img = Image.open('pgy2.jpg') #plt.imshow(img) # [N, C, H, W] img = data_transform(img) # expand batch dimension img = torch.unsqueeze(img, dim=0) return img @app.route(’/upload’, methods=[’POST’, ’GET’]) # 添加路由def upload(): path='' if request.method == ’POST’:f = request.files[’file’]if not (f and allowed_file(f.filename)): return jsonify({'error': 1001, 'msg': '請檢查上傳的圖片類型,僅限于png、PNG、jpg、JPG、bmp'}) basepath = os.path.dirname(__file__) # 當前文件所在路徑path = secure_filename(f.filename)upload_path = os.path.join(basepath, ’static/images’, secure_filename(f.filename)) # 注意:沒有的文件夾一定要先創建,不然會提示沒有該路徑# upload_path = os.path.join(basepath, ’static/images’,’test.jpg’) #注意:沒有的文件夾一定要先創建,不然會提示沒有該路徑print(path) img = tran(’static/images’+path)###########################預測圖片with torch.no_grad(): # predict class output = torch.squeeze(model(img)) # 將輸出壓縮,即壓縮掉 batch 這個維度 predict = torch.softmax(output, dim=0) predict_cla = torch.argmax(predict).numpy() res = class_indict[str(predict_cla)] pred = predict[predict_cla].item() #print(class_indict[str(predict_cla)], predict[predict_cla].item())res_chinese = ''if res=='daisy': res_chinese='雛菊'if res=='dandelion': res_chinese='蒲公英'if res=='roses': res_chinese='玫瑰'if res=='sunflower': res_chinese='向日葵'if res=='tulips': res_chinese='郁金香' #print(’result:’, class_indict[str(predict_class)], ’accuracy:’, prediction[predict_class])##########################f.save(upload_path)pred = pred*100return render_template(’upload_ok.html’, path=path, res_chinese=res_chinese,pred = pred, val1=time.time()) return render_template(’upload.html’) if __name__ == ’__main__’: # app.debug = True app.run(host=’127.0.0.1’, port=80,debug = True)3.系統識別結果

用python搭建一個花卉識別系統

<!DOCTYPE html><html lang='en'><head> <meta charset='UTF-8'> <title>李運辰-花卉識別系統v1.0</title> <script src='https://www.xxx.com.cn/static/js/locales/zh.js'></script> </head><body> <h1 align='center'>李運辰-花卉識別系統v1.0</h1><div align='center'> <form action='' enctype=’multipart/form-data’ method=’POST’><input type='file' name='file' data-show-preview='false' /><br><input type='submit' value='上傳' /> </form><p style='size:15px;color:blue;'>識別結果:{{res_chinese}}</p></br><p style='size:15px;color:red;'>準確率:{{pred}}%</p> <img src='https://www.xxx.com.cn/bcjs/{{ ’./static/images/’+path }}' alt=''/></div></body></html>4.啟動系統:

python main.py

用python搭建一個花卉識別系統

接著在瀏覽器在瀏覽器里面訪問

http://127.0.0.1/upload

出現如下界面:

用python搭建一個花卉識別系統

最后來一個識別過程的動圖

用python搭建一個花卉識別系統

三、總結

ok,這個花卉系統就已經搭建完成了,是不是超級簡單,我也是趁著修了這個機器視覺這么課,才弄這么一個系統,回顧一下之前的知識,哈哈哈。

以上就是用python搭建一個花卉識別系統的詳細內容,更多關于python 花卉識別系統的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
伊人精品一区| 久久精品官网| 久久av在线| 亚洲午夜在线| 亚洲午夜久久| 国产精品美女午夜爽爽| 色乱码一区二区三区网站| 成人久久一区| 久久国产精品99国产| 日韩av影院| 91综合网人人| 国产亚洲一区在线| 国产三级一区| 久久九九精品| 亚洲开心激情| 欧美成a人片免费观看久久五月天| 精品资源在线| 一区免费在线| 日韩 欧美一区二区三区| 国产日韩免费| 久久美女性网| 亚洲精品在线a| 免费在线观看一区| 欧美日韩在线观看视频小说| 日日摸夜夜添夜夜添国产精品| 国产精品日韩精品中文字幕| 久久中文字幕av| 国产日韩免费| 不卡在线一区二区| 日韩va亚洲va欧美va久久| 伊伊综合在线| 日韩不卡在线观看日韩不卡视频| 日韩精品1区| 视频一区日韩精品| 福利一区二区三区视频在线观看| 樱桃成人精品视频在线播放| 国产精品一区亚洲| 亚洲欧美日韩国产| 97欧美在线视频| 日韩激情网站| 亚洲午夜在线| 欧美精品1区| 午夜宅男久久久| 福利在线免费视频| 亚州av日韩av| 日韩三级精品| 香蕉精品999视频一区二区| 99精品视频精品精品视频| 日韩国产在线| 天堂网av成人| 国产视频一区在线观看一区免费| 成人国产精品久久| 黑人精品一区| 亚洲一本视频| 亚洲播播91| 日韩高清不卡一区二区| 麻豆mv在线观看| 国产精品www.| 日产欧产美韩系列久久99| 精品中文一区| 激情视频网站在线播放色| 国产一精品一av一免费爽爽| 免费观看久久久4p| 国产夫妻在线| 国产剧情在线观看一区| 亚洲一区二区日韩| 亚洲欧洲午夜| 国产精品91一区二区三区| 国产传媒在线| 久久免费精品| 国产精品1区| 国产精品一卡| 国产精品中文字幕亚洲欧美| 亚欧洲精品视频在线观看| 久久亚洲国产精品一区二区| 好看的av在线不卡观看| 91精品国产调教在线观看| 高清日韩中文字幕| 国产精品久久久久久妇女| 日韩精品欧美大片| 最新国产精品久久久| 亚洲自拍另类| 久久xxxx| 中文一区一区三区免费在线观 | 91精品韩国| 都市激情国产精品| 国产精品伦理久久久久久| а√天堂8资源在线| 黄毛片在线观看| 国产麻豆久久| 欧美a级一区| 欧美精品自拍| 亚洲在线一区| 亚洲精品自拍| 欧美日一区二区在线观看| 国产精品白丝久久av网站| 久久精品天堂| 五月天av在线| 亚洲精品1区| 亚欧成人精品| 国产精品3区| 麻豆精品蜜桃| 亚洲专区一区| 欧美一级二级三级视频| 久久的色偷偷| 极品av在线| 成人在线网站| 国产综合精品一区| 图片区亚洲欧美小说区| 日韩中文字幕亚洲一区二区va在线| 中文无码日韩欧| 欧美偷窥清纯综合图区| 国产精品草草| 日本久久成人网| 天堂成人免费av电影一区| 国产亚洲观看| 日韩一区二区在线免费| 99日韩精品| 国产精品中文| 亚洲va中文在线播放免费| 美女精品在线| 日韩不卡在线观看日韩不卡视频 | 亚洲午夜视频| 日本精品一区二区三区在线观看视频| 国产精品香蕉| 999国产精品999久久久久久| 蜜臀av性久久久久蜜臀aⅴ流畅 | 国产亚洲人成a在线v网站| 国模精品一区| 国产模特精品视频久久久久| 国产精品一区三区在线观看| 天堂中文在线播放| 亚洲永久精品唐人导航网址| 欧美国产极品| 亚洲激情国产| 麻豆中文一区二区| 9国产精品视频| 国产精品白浆| 羞羞答答国产精品www一本| 精品99在线| 亚洲人妖在线| 久久狠狠婷婷| 亚洲精品进入| 91精品久久久久久久久久不卡| 日本精品久久| 一区免费视频| 成人污污视频| 日韩国产一二三区| 婷婷综合激情| 国产精品毛片久久| **爰片久久毛片| 99riav国产精品| a国产在线视频| 欧美亚洲专区| 久久先锋影音| 久久久久蜜桃| 国产精品二区影院| 午夜在线观看免费一区| 日韩一区二区中文| 国产精品tv| 日韩在线黄色| 欧美特黄一区| 成人久久一区| 日韩.com| 国产伦理久久久久久妇女| 亚洲一区二区三区高清| 日韩在线欧美| 精品国产乱码久久久久久樱花| 亚洲精品乱码| 一区在线视频观看| 999国产精品999久久久久久| 久久久亚洲欧洲日产| 亚洲免费影视| 亚洲一级黄色| 久久青青视频| 精品美女在线视频| 国产九一精品| 少妇高潮一区二区三区99| 亚洲精品一区二区在线看| 日韩欧美不卡| 日韩黄色大片网站| 精品一区不卡| 久久精品国产久精国产爱| 欧美1区2区3| 国产精品久久久久久妇女| 欧美在线观看天堂一区二区三区| 亚洲香蕉视频| 亚洲激情黄色| 日韩视频一区二区三区在线播放免费观看| 国产高清不卡| 激情黄产视频在线免费观看| 国产精品1区在线| 国产日本精品| 国产精品久久久久久久久久白浆 | 亚洲一区av| 鲁大师成人一区二区三区| 精品91久久久久| 成人av动漫在线观看| 午夜av一区| 99日韩精品|