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