Kết quả thực nghiệm

Một phần của tài liệu ỨNG DỤNG CÔNG NGHỆ học sâu để PHÂN LOẠI và KIỂM TRA CHẤT LƯỢNG THUỐC CHỮA BỆNH (Trang 100 - 123)

Sau khi tiến hành chạy thực nghiệm, nhóm thu được các kết quả sau:

o Tốc độ chụp và xử lý hình ảnh: 1giây/ sản phẩm;

o Năng suất hệ thống: 12 sản phẩm/ phút;

o Tỷ lệ nhận diện loại sản phẩm và nhận diện được các khuyết tật bề mặt đúng là 71% (với 120 lần thử).

KẾT LUẬN

Trong đồ án, nhóm thực hiện đã tiến hành phân tích, tính toán, lựa chọn các chi tiết, thành phần cho hệ thống cơ khí và hệ thống điều khiển. Sau khi tính toán, nhóm tiến hành xây dựng mô hình thực nghiệm kết nối các chi tiết cơ khí với nhau và với PLC. Sau khi tiến hành chạy thực nghiệm, nhóm thu được các kết quả như đã trình bày trong chương 5.

Qua đồ án này, nhóm được thực hiện thiết kế, chế tạo thực và điều khiển mô hình thực tế phân loại sản phẩm. Cũng qua đó nhóm được thực hành thực tế với PLC công nghiệp, hệ thống khí nén; tiếp xúc cơ bản với công nghệ xử lý ảnh, bổ sung kiến thức cơ bản về học mạng, học sâu, AI. Điều đó giúp cho các thành viên trong nhóm củng cố lại kiến thức đã học, áp dụng vào thực tế. Mặt khác, đồ án này cũng tạo cho nhóm kinh nghiệm thực tiễn về việc lựa chọn linh kiện, kinh nghiệm từ thiết kế, tính toán cho tới khâu gia công và lắp ráp. Đây là cơ sở cho những công việc sau khi tốt nghiệp của các thành viên trong nhóm.

Do thời gian nghiên cứu không được nhiều, cũng như việc va chạm với nhiều kiến thức mới mẻ của trong phần xử lý ảnh nên tiến độ làm của nhóm còn chậm, gặp nhiều khó khăn, hạn chế. Trong hệ thống cơ khí cần có hệ thống chiếu sáng tốt hơn để đối tượng được hiển thị rõ nét hơn, tránh hiện tượng bị mất chi tiết của hình ảnh do quá sáng, do phản quang; Camera vẫn chưa thể hiện rõ nét các hình ảnh nếu cho băng tải chạy liên tục (không dừng lại để chụp ảnh); Băng tải còn hoạt động không ổn định, đôi khi bị tăng giảm vận tốc bất ngờ; hệ thống điện còn chưa được tích hợp vào trong một tủ điện cho gọn, dây rợ còn loằng ngoằng, dễ dây ra nhầm lẫn, cháy nổ nếu không cẩn thận khi sử dụng; năng suất hệ thống còn chưa cao; phần xử lý ảnh còn chưa được vận dụng nhiều, chủ yếu vẫn là sử dụng các thư viện có sẵn.

Trong tương lai, mô hình có thể áp dụng để phân loại các đối tượng thuộc các lĩnh vực khác nhau. Do đó nhóm mong muốn đầu tư nâng cấp hệ thống cho chất lượng ảnh rõ nét hơn, thể hiện rõ được các đường nét, chi tiết của ảnh; thay thế hệ thống băng tải dây cao su bằng bộ đai răng để hạn chế sự trượt, góp phần chính xác hơn trong việc tính toán vị trí của đối tượng di chuyển trên băng tải; thay đổi động cơ băng tải để hoạt động đều đặn, tốc độ ổn định hơn. Về phần xử lý ảnh và PLC, nhóm muốn cải thiện code, tạo giao diện phần mềm để trực quan; cải thiện tối ưu thuật toán của PLC để tăng tốc độ xử lý, tăng năng suất cho hệ thống; kết nối với thiết bị HMI ngoài thực tế để tăng nhãn quan cho hệ thống; thiết kế tủ điện để đảm bảo an toàn khi vận hành

Cuối cùng, nhóm rất mong nhận được các ý kiến đóng góp của các thầy/ cô để đồ án được hoàn thiện hơn.

TÀI LIỆU THAM KHẢO

[1]. PGS. TS. Trần Văn Địch, PGS. TS. Trần Xuân Việt, TS. Nguyễn Trọng Doanh, ThS. Lưu Văn Nhang, “Tự động hóa quá trình sản xuất”, Nhà xuất bản Khoa học và Kỹ thuật Hà Nội, 2001

[2]. Hồ Viết Bình, “Tự Động Hóa Quá Trình Sản Xuất”, Nhà xuất bản Khoa học và Kỹ thuật, 2009

[3]. Võ Anh Huy, “Cơ sở lý thuyết tính toán máng rung”, Bài giảng môn tự động hóa trường Đại học Bách Khoa TP.HCM

[4]. Phan Công Bình, “Nghiên cứu sự ảnh hưởng của các thông số kỹ thuật trong thiết bị cấp rung đến năng suất”, Luận văn thạc sĩ chuyên ngành công nghệ chế tạo máy, trường Đại học Bách Khoa TP.HCM, 2009

[5]. Bùi Tiến Hoàng, Nguyễn Đình Mạnh, “Hệ thống phân loại và kiểm tra chất lượng đai ốc ứng dụng trí tuệ nhân tạo trong xử lý ảnh”, Đồ án tốt nghiệp chuyên ngành Cơ điện tử, trường Đại học Bách Khoa Hà Nội, 2018

[6]. Elham Pishyar, Mehran Emadi, Investigation of Different Algorithms for Surface Defects of Steel Sheet for Quality, IJCA, 2016.

[7]. Công ty TNHH Kỹ thuật Ftech Việt Nam, http://kythuatthuykhi.com/xy-lanh-

cdj2b16-50-b, truy cập lần cuối 1/2019.

[8]. Github darkflow library, https://github.com/thtrieu/darkflow, truy cập lần cuối 11/2018.

[9]. Ngoc Nguyen Ba, learn-machine-learning-in-two-months,

https://github.com/bangoc123/learn-machine-learning-in-two-months, truy cập lần cuối 1/2019.

[10]. Do Minh Hai, [NN] Mạng nơ-ron nhân tạo - Neural Networks, https://dominhhai.github.io/vi/2018/04/nn-intro, truy cập lần cuối 1/2019.

[11]. Puzzledqs, BBox-Label-Tool, https://github.com/puzzledqs/BBox-Label-Tool, truy cập lần cuối 1/2019.

[12]. Markjay4k, YOLO-series, https://github.com/markjay4k/YOLO-series, truy cập lần cuối 1/2019.

[13]. Joseph Redmon, Ali Farhadi, YOLOv3: An Incremental Improvement, https://pjreddie.com/media/files/papers/YOLOv3.pdf, truy cập lần cuối 1/2019

[14]. Joseph Redmon, How computers learn to recognize objects instantly, https://www.youtube.com/watch?v=Cgxsv1riJhI, truy cập lần cuối 1/2019. [15]. Mark Jay, Image Detection with YOLO-v2,

https://www.youtube.com/watch?v=PyjBd7IDYZs, truy cập lần cuối 1/2019. [16]. Arden Dertat, Applied Deep Learning - Part 4: Convolutional Neural Networks, https://towardsdatascience.com/applied-deep-learning-part-4- convolutional-neural- networks-584bc134c1e2, truy cập lần cuối 1/2019.

[17]. Adam Geitgey, Machine Learning is Fun! Part 3: Deep Learning and Convolutional Neural Networks, https://medium.com/@ageitgey/machine-learning-

is-fun-part-3-deep-learning-and-convolutional-neural-networks-f40359318721, truy cập lần cuối 1/2019.

[18]. Tales Lima Fonseca, What’s happening inside the Convolutional Neural Network? The answer is Convolution, https://buzzrobot.com/whats-happening- inside-the-convolutional-neural-network-the-answer-is-convolution-2c22075dc68d, truy cập lần cuối 1/2019.

[19]. Karpathy, CS231n Convolutional Neural Networks for Visual Recognition,

ĐỒ ÁN TỐT NGHIỆP GVHD: TS. Nguyễn Thành Hùng PHỤ LỤC [1]. Chương trình chụp và lưu ảnh #include <opencv2/opencv.hpp> #include <iostream> #include <stdio.h> #include <stdlib.h> #include <string> using namespace cv; using namespace std;

string itostr(long int num);

string folderName = "image";

string folderCreateCommand = "mkdir " + folderName;

int main(void) {

int num;

long int start_num;

cout << "Choose Camera (0 or 1): "; cin >> num;

cout << endl << "Index start: "; cin >> start_num;

system(folderCreateCommand.c_str()); //create a folder VideoCapture cam(num);

if (!cam.isOpened()) { // check if we succeeded

cout << "Cannot open the Camera" << endl;

return -1; }

cam.set(CV_CAP_PROP_FRAME_WIDTH, 1280); cam.set(CV_CAP_PROP_FRAME_HEIGHT, 720); namedWindow("IMAGE", WINDOW_FULLSCREEN); moveWindow("IMAGE", 350, 150);

while (waitKey(5) != 'q') {

Mat img; cam >> img;

imshow("IMAGE", img);

if (waitKey(1) == 's') {

string path = folderName; path.append("/");

path.append(itostr(start_num)); imwrite(path, img);

cout << "Image " << itostr(start_num) << " saved." <<

endl start_num++; }

}

return(0); }

string itostr(long int num) { string result = "0000.JPG"; if (num < 10) { result[3] = num + 48; } else if (num < 100) {

ĐỒ ÁN TỐT NGHIỆP GVHD: TS. Nguyễn Thành Hùng result[3] = num % 10 + 48; result[2] = num / 10 + 48; } else if (num < 1000) { result[3] = num % 10 + 48; num = num / 10; result[2] = num % 10 + 48; result[1] = num / 10 + 48; } else if (num < 10000) { result[3] = num % 10 + 48; num = num / 10; result[2] = num % 10 + 48; num = num / 10; result[1] = num % 10 + 48; result[0] = num / 10 + 48; } return result; }

[2]. Chương trình tạo đầu vào cho mạng nơ-ron #Modify outDir, xmlDir: 188 191

#Editor: Hinh Nguyen() #:  

#: 2018 11 29  1 48

from tkinter import *

from tkinter import filedialog from tkinter import messagebox from tkinter import ttk

from PIL import Image, ImageTk

import os import glob import random

from xml_util import createXMLAnnotation

# colors for the bboxes

COLORS = ['red', 'blue', 'yellow', 'pink', 'cyan', 'green', 'black']

# image sizes for the examples

SIZE = 256, 256

class LabelTool():

def init (self, master): # set up the main frame

self.parent = master

self.parent.title("LabelTool")

self.frame = Frame(self.parent)

self.frame.pack(fill=BOTH, expand=1)

self.parent.resizable(width = FALSE, height = FALSE)

# initialize global state

self.imageDir = '' self.imageList= [] self.egDir = '' self.egList = [] self.outDir = '' self.xmlDir = '' self.cur = 0 self.total = 0

ĐỒ ÁN TỐT NGHIỆP GVHD: TS. Nguyễn Thành Hùng self.category = 0 self.imagepath = '' self.imagename = '' self.labelfilename = '' self.xmlfilename = ''

self.tkimg = None

self.currentLabelclass = ''

self.cla_can_temp = []

self.classcandidate_filename = 'class.txt'

# initialize mouse state

self.STATE = {}

self.STATE['click'] = 0

self.STATE['x'], self.STATE['y'] = 0, 0

# reference to bbox

self.bboxIdList = []

self.bboxId = None

self.bboxList = []

self.hl = None

self.vl = None

# GUI stuff

# dir entry & load # input image dir button

self.srcDirBtn = Button(self.frame, text="Image input folder", command=self.selectSrcDir)

self.srcDirBtn.grid(row=0, column=0)

# input image dir entry

self.svSourcePath = StringVar()

self.entrySrc = Entry(self.frame, textvariable=self.svSourcePath)

self.entrySrc.grid(row=0, column=1, sticky=W+E)

self.svSourcePath.set(os.getcwd())

# load button

self.ldBtn = Button(self.frame, text="Load Dir", command=self.loadDir)

self.ldBtn.grid(row=0, column=2, rowspan=2, columnspan=2, padx=2, pady=2, ipadx=5, ipady=5)

# label file save dir button

self.desDirBtn = Button(self.frame, text="Label output folder", command=self.selectDesDir)

self.desDirBtn.grid(row=1, column=0)

# label file save dir entry

self.svDestinationPath = StringVar()

self.entryDes = Entry(self.frame, textvariable=self.svDestinationPath)

self.entryDes.grid(row=1, column=1, sticky=W+E)

self.svDestinationPath.set(os.path.join(os.getcwd(),"Labels"))

# main panel for labeling

self.mainPanel = Canvas(self.frame, cursor='tcross')

self.mainPanel.bind("<Button-1>", self.mouseClick)

self.mainPanel.bind("<Motion>", self.mouseMove)

self.parent.bind("<Escape>", self.cancelBBox) # press <Espace> to cancel

current bbox

self.parent.bind("s", self.cancelBBox)

self.parent.bind("p", self.prevImage) # press 'p' to go backforward

self.parent.bind("n", self.nextImage) # press 'n' to go forward

self.mainPanel.grid(row = 2, column = 1, rowspan = 4, sticky = W+N)

# choose class

ĐỒ ÁN TỐT NGHIỆP GVHD: TS. Nguyễn Thành Hùng

self.classcandidate = ttk.Combobox(self.frame, state='readonly', textvariable=self.classname)

self.classcandidate.grid(row=2, column=2)

if os.path.exists(self.classcandidate_filename):

with open(self.classcandidate_filename) as cf:

for line in cf.readlines():

self.cla_can_temp.append(line.strip('\n'))

self.classcandidate['values'] = self.cla_can_temp

self.classcandidate.current(0)

self.currentLabelclass = self.classcandidate.get()

self.btnclass = Button(self.frame, text='Confirm Class', command=self.setClass)

self.btnclass.grid(row=2, column=3, sticky=W+E)

# showing bbox info & delete bbox

self.lb1 = Label(self.frame, text = 'Bounding boxes:')

self.lb1.grid(row = 3, column = 2, sticky = W+N)

self.listbox = Listbox(self.frame, width = 22, height = 12)

self.listbox.grid(row = 4, column = 2, sticky = N+S)

self.btnDel = Button(self.frame, text = 'Delete', command = self.delBBox)

self.btnDel.grid(row = 4, column = 3, sticky = W+E+N)

self.btnClear = Button(self.frame, text = 'ClearAll', command =

self.clearBBox)

self.btnClear.grid(row = 4, column = 3, sticky = W+E+S)

# control panel for image navigation

self.ctrPanel = Frame(self.frame)

self.ctrPanel.grid(row = 6, column = 1, columnspan = 2, sticky = W+E)

self.prevBtn = Button(self.ctrPanel, text='<< Prev', width = 10, command =

self.prevImage)

self.prevBtn.pack(side = LEFT, padx = 5, pady = 3)

self.nextBtn = Button(self.ctrPanel, text='Next >>', width = 10, command =

self.nextImage)

self.nextBtn.pack(side = LEFT, padx = 5, pady = 3)

self.progLabel = Label(self.ctrPanel, text = "Progress: / ")

self.progLabel.pack(side = LEFT, padx = 5)

self.tmpLabel = Label(self.ctrPanel, text = "Go to Image No.")

self.tmpLabel.pack(side = LEFT, padx = 5)

self.idxEntry = Entry(self.ctrPanel, width = 5)

self.idxEntry.pack(side = LEFT)

self.goBtn = Button(self.ctrPanel, text = 'Go', command = self.gotoImage)

self.goBtn.pack(side = LEFT)

# example pannel for illustration

self.egPanel = Frame(self.frame, border = 10)

self.egPanel.grid(row = 3, column = 0, rowspan = 5, sticky = N)

self.tmpLabel2 = Label(self.egPanel, text = "Examples:")

self.tmpLabel2.pack(side = TOP, pady = 5)

self.egLabels = []

for i in range(3):

self.egLabels.append(Label(self.egPanel))

self.egLabels[-1].pack(side = TOP)

# display mouse position

self.disp = Label(self.ctrPanel, text='')

self.disp.pack(side = RIGHT)

self.frame.columnconfigure(1, weight = 1)

self.frame.rowconfigure(4, weight = 1)

def selectSrcDir(self):

path = filedialog.askdirectory(title="Select image source folder", initialdir=self.svSourcePath.get())

ĐỒ ÁN TỐT NGHIỆP GVHD: TS. Nguyễn Thành Hùng

return

def selectDesDir(self):

path = filedialog.askdirectory(title="Select label output folder", initialdir=self.svDestinationPath.get())

self.svDestinationPath.set(path)

return def loadDir(self):

self.parent.focus()

#self.category = int(s) # get image list

#self.imageDir = os.path.join(r'./Images', '%03d' %(self.category))

self.imageDir = self.svSourcePath.get()

if not os.path.isdir(self.imageDir):

messagebox.showerror("Error!", message = "The specified dir doesn't exist!")

return

extlist = ["*.JPEG", "*JPG", "*.PNG", "*.BMP"]

for e in extlist:

filelist = glob.glob(os.path.join(self.imageDir, e))

self.imageList.extend(filelist)

#self.imageList = glob.glob(os.path.join(self.imageDir, '*.JPEG'))

if len(self.imageList) == 0:

print('No .JPEG images found in the specified dir!')

return

# default to the 1st image in the collection

self.cur = 1

self.total = len(self.imageList)

# set up output dir

self.outDir = os.path.join(r'./NG4c_img_txt')

#self.outDir = self.svDestinationPath.get() #self.xmlDir = self.svDestinationPath.get()

self.xmlDir = os.path.join(r'./NG4c_img_xml')

if not

os.path.exists(self.outDir):

os.mkdir(self.outDir)

if not os.path.exists(self.xmlDir):

os.mkdir(self.xmlDir)

# load example bboxes

#self.egDir = os.path.join(r'./Examples', '%03d' %(self.category))

self.egDir = os.path.join(os.getcwd(), "Examples/")

if not os.path.exists(self.egDir):

return

filelist = glob.glob(os.path.join(self.egDir, '*.JPEG'))

self.tmp = []

self.egList = []

random.shuffle(filelist)

for (i, f) in enumerate(filelist):

if i == 1:

break

im = Image.open(f)

r = min(SIZE[0] / im.size[0], SIZE[1] / im.size[1]) new_size = int(r * im.size[0]), int(r * im.size[1])

self.tmp.append(im.resize(new_size, Image.ANTIALIAS))

self.egList.append(ImageTk.PhotoImage(self.tmp[-1]))

self.egLabels[i].config(image = self.egList[-1], width = SIZE[0], height = SIZE[1])

self.loadImage()

ĐỒ ÁN TỐT NGHIỆP GVHD: TS. Nguyễn Thành Hùng

def loadImage(self):

# load image

imagepath = self.imageList[self.cur - 1]

self.img = Image.open(imagepath) size = self.img.size

self.factor = 1

#self.factor = max(size[0]/1000, size[1]/1000., 1.)

self.img = self.img.resize((int(size[0]/self.factor),

int(size[1]/self.factor)))

self.tkimg = ImageTk.PhotoImage(self.img) self.mainPanel.config(width = max(self.tkimg.width(), 400), height =

max(self.tkimg.height(), 400))

self.mainPanel.create_image(0, 0, image = self.tkimg, anchor=NW)

self.progLabel.config(text = "%04d/%04d" %(self.cur, self.total))

# load labels

self.clearBBox()

#self.imagename = os.path.split(imagepath)[-1].split('.')[0]

fullfilename = os.path.basename(imagepath)

self.imagename, _ = os.path.splitext(fullfilename) labelname = self.imagename + '.txt'

xmlname = self.imagename + '.xml'

self.labelfilename = os.path.join(self.outDir, labelname)

self.xmlfilename = os.path.join(self.xmlDir, xmlname) bbox_cnt = 0

if os.path.exists(self.labelfilename):

with open(self.labelfilename) as f:

for (i, line) in

enumerate(f): if i == 0:

bbox_cnt = int(line.strip())

continue

#tmp = [int(t.strip()) for t in line.split()]

tmp = line.split()

tmp[0] = int(int(tmp[0])/self.factor) tmp[1] = int(int(tmp[1])/self.factor) tmp[2] = int(int(tmp[2])/self.factor) tmp[3] = int(int(tmp[3])/self.factor)

self.bboxList.append(tuple(tmp))

color_index = (len(self.bboxList)-1) % len(COLORS)

tmpId = self.mainPanel.create_rectangle(tmp[0], tmp[1], \ tmp[2], tmp[3], \ width = 2, \ outline = COLORS[color_index]) COLORS[(len(self.bboxList)-1) % len(COLORS)]) self.bboxIdList.append(tmpId) #outline = self.listbox.insert(END, '%s : (%d, %d) -> (%d, %d)' %(tmp[4], tmp[0], tmp[1], tmp[2], tmp[3]))

self.listbox.itemconfig(len(self.bboxIdList) - 1, fg = COLORS[color_index])

#self.listbox.itemconfig(len(self.bboxIdList) - 1, fg = COLORS[(len(self.bboxIdList) - 1) % len(COLORS)])

def saveImage(self):

if self.labelfilename == '':

return

with open(self.labelfilename, 'w') as f: f.write('%d\n' %len(self.bboxList))

for bbox in self.bboxList:

ĐỒ ÁN TỐT NGHIỆP GVHD: TS. Nguyễn Thành Hùng

int(int(bbox[0])*self.factor),

int(int(bbox[1])*self.factor),

int(int(bbox[2])*self.factor),

int(int(bbox[3])*self.factor), bbox[4])) imagepath = self.imageList[self.cur - 1]

im = Image.open(imagepath)

#print("Factor: %f" %self.factor)

createXMLAnnotation(os.path.split(imagepath)[-1], self.bboxList, im.size,

self.xmlfilename, self.factor)

print('Image No. %d saved' %(self.cur))

def mouseClick(self, event):

if self.STATE['click'] == 0:

self.STATE['x'], self.STATE['y'] = event.x, event.y

else:

x1, x2 = min(self.STATE['x'], event.x), max(self.STATE['x'], event.x) y1, y2 = min(self.STATE['y'], event.y), max(self.STATE['y'], event.y)

self.bboxList.append((x1, y1, x2, y2, self.currentLabelclass))

self.bboxIdList.append(self.bboxId)

self.bboxId = None

self.listbox.insert(END, '%s : (%d, %d) -> (%d, %d)' %(self.currentLabelclass, x1, y1, x2, y2))

self.listbox.itemconfig(len(self.bboxIdList) - 1, fg = COLORS[(len(self.bboxIdList) - 1) % len(COLORS)])

self.STATE['click'] = 1 - self.STATE['click']

def mouseMove(self, event):

self.disp.config(text = 'x: %d, y: %d' %(event.x, event.y))

if self.tkimg:

if self.hl:

self.mainPanel.delete(self.hl)

self.hl = self.mainPanel.create_line(0, event.y, self.tkimg.width(),

event.y, width = 2)

if self.vl:

self.mainPanel.delete(self.vl)

self.vl = self.mainPanel.create_line(event.x, 0, event.x,

self.tkimg.height(), width = 2)

if 1 == self.STATE['click']:

if self.bboxId:

self.mainPanel.delete(self.bboxId)

COLOR_INDEX = len(self.bboxIdList) % len(COLORS)

self.bboxId = self.mainPanel.create_rectangle(self.STATE['x'],

self.STATE['y'], \

COLORS[len(self.bboxList) % len(COLORS)])

def cancelBBox(self, event):

if 1 == self.STATE['click']:

if self.bboxId:

self.mainPanel.delete(self.bboxId)

self.bboxId = None

self.STATE['click'] = 0

def delBBox(self):

sel = self.listbox.curselection()

if len(sel) != 1 :

return

idx = int(sel[0])

self.mainPanel.delete(self.bboxIdList[idx])

event.x, event.y, \ width = 2, \ outline =

ĐỒ ÁN TỐT NGHIỆP GVHD: TS. Nguyễn Thành Hùng

self.bboxIdList.pop(idx)

self.bboxList.pop(idx)

self.listbox.delete(idx)

def clearBBox(self):

for idx in range(len(self.bboxIdList)):

self.mainPanel.delete(self.bboxIdList[idx])

self.listbox.delete(0, len(self.bboxList))

self.bboxIdList = []

self.bboxList = []

def prevImage(self, event = None):

self.saveImage()

if self.cur > 1:

self.cur -= 1

self.loadImage()

def nextImage(self, event = None):

self.saveImage()

if self.cur < self.total:

self.cur += 1

self.loadImage()

def gotoImage(self):

idx = int(self.idxEntry.get())

if 1 <= idx and idx <= self.total:

self.saveImage()

self.cur = idx

self.loadImage()

def setClass(self):

self.currentLabelclass = self.classcandidate.get()

print('set label class to : %s' % self.currentLabelclass)

if name == ' main ': root = Tk()

tool = LabelTool(root)

root.resizable(width = True, height = True) root.mainloop()

[3]. Chương trình xử lý ảnh và kết nối với PLC

import sys

from darkflow.net.build import TFNet

import cv2 as cv import numpy as np import snap7.client as c from snap7.util import *

from snap7.snap7types import *

import time

global tfnet, tfnet_err

def tfnet_init(net):

if net == 'DRUG': options = { 'pbLoad': 'built_graph/yolov2-tiny-voc-3c.pb', 'metaLoad': 'built_graph/yolov2-tiny-voc-3c.meta', 'threshold': 0.1, 'gpu': 0.75, }

ĐỒ ÁN TỐT NGHIỆP GVHD: TS. elif net == 'NG': options = { 'pbLoad': 'built_graph/yolov2-tiny-voc-4c.pb', 'metaLoad': 'built_graph/yolov2-tiny-voc-4c.meta', 'threshold': 0.1, 'gpu': 0.75, } tfnet = TFNet(options) return tfnet

def ReadMemory(plc,byte,bit,datatype):

result = plc.read_area(areas['MK'],0,byte,datatype)

if datatype==S7WLBit:

return get_bool(result,0,bit)

elif datatype==S7WLByte or datatype==S7WLWord:

return get_int(result,0)

elif datatype==S7WLReal:

return get_real(result,0)

elif datatype==S7WLDWord:

return get_dword(result,0)

else:

return None

def WriteMemory(plc,byte,bit,datatype,value):

result = plc.read_area(areas['MK'],0,byte,datatype)

if datatype==S7WLBit:

set_bool(result,0,bit,value)

elif datatype==S7WLByte or datatype==S7WLWord: set_int(result,0,value)

elif datatype==S7WLReal: set_real(result,0,value)

elif datatype==S7WLDWord: set_dword(result,0,value)

plc.write_area(areas["MK"],0,byte,result)

def Predictions(dst):

results = tfnet.return_predict(dst) print(results)

#Get one result

if len(results) > 1: max_con = -1.0 idx = -1 for i in range(len(results)): result = results[i]

con = result['confidence']

if con > max_con: idx = i max_con = con result1 = results[idx] print(result1) elif len(results) == 1: result1 = results[0] else: result1 = [] return(result1)

def VideoCapture(num):

# Input is the camera

cap = cv.VideoCapture(num)

# Check if camera opened

successfully if (cap.isOpened() ==

False):

print("Error opening camera!")

ĐỒ ÁN TỐT NGHIỆP GVHD: TS. Nguyễn Thành Hùng

print("Camera Opened!")

while(cap.isOpened()):

cap.set(cv.CAP_PROP_FRAME_WIDTH, 1280) cap.set(cv.CAP_PROP_FRAME_HEIGHT, 720)

# Capture frame-by-frame ret, img = cap.read()

cv.imshow('Live Stream',img)

if not ret: break cv.waitKey(1) k = ReadMemory(plc,300,0,S7WLReal) # Capturing: if k == 1:

cv.imwrite("C:/Users/nguye/Desktop/Shot/Capture.JPG", img)

break

# # Press Q on keyboard to exit # elif k & 0xFF == ord('q'): # break

# When everything done, release the video capture object

cap.release() return img "============================ MAIN =================================" if name == " main ": "========= Init =========" # Color colorBoxNG = (0,0,255) #RED colorBoxOK = (255,255,255) #WHITE colorTxt = (255,0,0) #BLUE # Connect PLC plc = c.Client() plc.connect('192.168.0.100',0,1) "========= NHAN DANG =========" #===============NG or OK===============# # Create the Net via options

tfnet = tfnet_init('DRUG') tfnet_err = tfnet_init('NG')

# Check

while True:

# Capturing an image

now = time.time()

num = 1 #Choose Camera

img = VideoCapture(num) #img = cv.imread('2.JPG',cv.IMREAD_COLOR) # cv.imshow("Snapshot", img) img = cv.GaussianBlur(img,(5,5),0) #Bộ lọc dst = img.copy() result1 = Predictions(dst)

ĐỒ ÁN TỐT NGHIỆP GVHD: TS. Nguyễn Thành Hùng # Check OK or NG ok = 1 results_err = tfnet_err.return_predict(dst) if len(results_err) > 0:

print(str(len(results_err))+' Cracks detected!') ok = 0

#Show result

if result1 == []: #0: Cannot detect anything

print("Cannot detect anything")

else:

#Draw errors

for result in results_err:

tl = (result['topleft']['x'], result['topleft']['y']) br = (result['bottomright']['x'], result['bottomright']['y']) label = result['label']

con = result['confidence']

dst = cv.rectangle(dst, tl, br, colorBoxNG, 2, cv.LINE_AA) dst = cv.putText(dst, label + ':' + str(int(con*100)) + '%', tl,

cv.FONT_HERSHEY_COMPLEX, 0.5, colorTxt, 1, cv.LINE_AA)

#Type

tl = (result1['topleft']['x'], result1['topleft']['y'])

br = (result1['bottomright']['x'], result1['bottomright']['y']) label = result1['label']

con = result1['confidence']

if label == 'P.MOL.TAB':

if ok == 0:

dst = cv.rectangle(dst, tl, br, colorBoxNG, 2, cv.LINE_AA) dst = cv.putText(dst, label + ' - NG' + ': ' + str(int(con*100)) + '%', tl, cv.FONT_HERSHEY_COMPLEX, 0.75, colorTxt, 1, cv.LINE_AA)

print('Detected:' + label + '- NG') WriteMemory(plc,100,0,S7WLReal,1) #1: NG

else:

dst = cv.rectangle(dst, tl, br, colorBoxOK, 2, cv.LINE_AA) dst = cv.putText(dst, label + ' - OK' + ': ' + str(int(con*100)) + '%', tl, cv.FONT_HERSHEY_COMPLEX, 0.75, colorTxt, 1, cv.LINE_AA)

print('Detected:' + label + '- Pass') WriteMemory(plc,100,0,S7WLReal,2) #2: Tron

print (ReadMemory(plc,100,0,S7WLReal))

elif label == 'P.DOL.EXTRA':

if ok == 0:

dst = cv.rectangle(dst, tl, br, colorBoxNG, 2, cv.LINE_AA) dst = cv.putText(dst, label + ' - NG' + ': ' + str(int(con*100)) + '%', tl, cv.FONT_HERSHEY_COMPLEX, 0.75, colorTxt, 1, cv.LINE_AA)

print('Detected:' + label + '- NG') WriteMemory(plc,100,0,S7WLReal,1) #1: NG

else:

dst = cv.rectangle(dst, tl, br, colorBoxOK, 2, cv.LINE_AA) dst = cv.putText(dst, label + ' - OK' + ': ' + str(int(con*100)) + '%', tl, cv.FONT_HERSHEY_COMPLEX, 0.75, colorTxt, 1, cv.LINE_AA)

ĐỒ ÁN TỐT NGHIỆP GVHD: TS. Nguyễn Thành Hùng WriteMemory(plc,100,0,S7WLReal,3) #3: Dai

Một phần của tài liệu ỨNG DỤNG CÔNG NGHỆ học sâu để PHÂN LOẠI và KIỂM TRA CHẤT LƯỢNG THUỐC CHỮA BỆNH (Trang 100 - 123)

Tải bản đầy đủ (DOCX)

(123 trang)
w