training
This commit is contained in:
parent
8b7aac315e
commit
f6c4f94b0c
5
.gitignore
vendored
5
.gitignore
vendored
@ -5,4 +5,7 @@
|
|||||||
__pycache__/
|
__pycache__/
|
||||||
|
|
||||||
#macOS
|
#macOS
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
|
||||||
|
#uczenie
|
||||||
|
dataset/
|
@ -1,5 +1,5 @@
|
|||||||
## Podprojekt Jakub Adamski
|
## Podprojekt Jakub Adamski
|
||||||
Wykrywanie rodzaju rośliny w danym polu, na którym znajduje się traktor.
|
Wykrywanie rodzaju rośliny na danym polu, w którym znajduje się traktor.
|
||||||
|
|
||||||
## Spis treści
|
## Spis treści
|
||||||
* [Wykorzystana technologia](#wykorzystana-technologia)
|
* [Wykorzystana technologia](#wykorzystana-technologia)
|
||||||
@ -11,19 +11,19 @@ Wykrywanie rodzaju rośliny w danym polu, na którym znajduje się traktor.
|
|||||||
|
|
||||||
## Wykorzystana technologia
|
## Wykorzystana technologia
|
||||||
W projekcie wykorzystuję sieć neuronową. Jest to klasyfikator obiektów, oparty na modelu MobileNetV2. MobileNet to wysoce zoptymalizowana struktura pozwalająca na rozpoznawanie obiektów. <br>
|
W projekcie wykorzystuję sieć neuronową. Jest to klasyfikator obiektów, oparty na modelu MobileNetV2. MobileNet to wysoce zoptymalizowana struktura pozwalająca na rozpoznawanie obiektów. <br>
|
||||||
Składa się z warstw: CNN - convolutional neural network do wyodrębnienia cech charakterystycznych z obrazka oraz jednej warstwy dense, złozonej z duzej ilosci neuronow, które produkują finalny wynik na podstawie wyniku z CNN.
|
Składa się z warstw: CNN - convolutional neural network do wyodrębnienia cech charakterystycznych z obrazka oraz jednej warstwy dense, złozonej z 4 neuronow (ilosc obiektow w moim projekcie), które produkują finalny wynik na podstawie wyniku z CNN.
|
||||||
|
|
||||||
## Dane
|
## Dane
|
||||||
Trenowanie klasyfikatorów od zera jest bardzo czasochłonne. Zazwyczaj zajmuje nawet kilka dni, nie wspominając o zgromadzeniu bardzo duzej ilosci zdjęć - najlepiej klika milionów. <br>
|
Zgromadzone zdjecia dostepne sa tutaj: [link](). Dane zbierałem za pomocą wyszukiwarki google, następnie pogrupowałem według klas. Ostatnie 20 warstw sieci jest wytrenowana w pliku net_training.py, pierwsze warstwy są uczone na zbiorze danych imagenet - zmienna base_model. <br>
|
||||||
Z tego powodu wykorzystuję, gotową, wytrenowaną sieć na zbiorze danych imagenet. Do uruchomienia urzywam pakietu keras dostępnego w bibliotece tensorflow. Tensorflow to rozbudowany zestaw narzędzi do machine learningu, keraz to nakładka ułatwijąca uzywanie tego frameworku.
|
Do uruchomienia uzywam pakietu keras dostępnego w bibliotece tensorflow. Tensorflow to rozbudowany zestaw narzędzi do machine learningu, keraz to nakładka ułatwijąca uzywanie tego frameworku.
|
||||||
|
|
||||||
## Kod
|
## Kod
|
||||||
Klasyfikator działa w głównej pętli while w pliku main.py. Uruchamia się gdy traktor (niebieski kwadrat) zmieni swoją lokalizację. Zdjęcia przypisane do danej kratki są dobierane losowo. W finalnej wersji zdjęć będzie więcej - folder imgs/. <br>
|
Klasyfikator działa w głównej pętli while w pliku main.py. Uruchamia się gdy traktor (niebieski kwadrat) zmieni swoją lokalizację. Zdjęcia przypisane do danej kratki są dobierane losowo. W finalnej wersji zdjęć będzie więcej - folder imgs/. <br>
|
||||||
Gdy klasyfikator zakończy swoje działanie, w konsoli pojawia się najbardziej prawdopodobny obiekt znajdujący się na zdjęciu. Zdjęcie pojawia się w osobnym oknie. Po zamknięciu okna mozemy kontynuować sterowanie traktorem za pomocą strzałek.
|
Gdy klasyfikator zakończy swoje działanie, w konsoli pojawia się najbardziej prawdopodobny obiekt znajdujący się na zdjęciu. Zdjęcie pojawia się w osobnym oknie. Po zamknięciu okna mozemy kontynuować sterowanie traktorem za pomocą strzałek.
|
||||||
|
|
||||||
## Działanie
|
## Działanie
|
||||||
W finalnej wersji łączącej wszytkie podprojekty mozna dodatkowo dołączyć walidację otrzymanego wyniku na podstawie nazwy zdjęcia. <br>
|
![uczenie]("./ss/adamski2.png") <br>
|
||||||
![ss]("./ss/adamski1.png")
|
![dzialanie]("./ss/adamski1.png")
|
||||||
|
|
||||||
|
|
||||||
## Uruchomienie
|
## Uruchomienie
|
||||||
@ -34,9 +34,7 @@ https://docs.anaconda.com/mkl-optimizations/
|
|||||||
|
|
||||||
## Notatki
|
## Notatki
|
||||||
Lista obiektów:
|
Lista obiektów:
|
||||||
- pumpkin/dynia ok - spaghetti_squash
|
- pumpkin/dynia
|
||||||
- cabbage/kapusta ok - head_cabbage
|
- cabbage/kapusta
|
||||||
- mushchroom/grzyb ok - mushroom
|
- mushroom/grzyb
|
||||||
- cauliflower/kalafior ok - cauliflower
|
- cauliflower/kalafior
|
||||||
- ziemniak NIE ROZPOZNAL
|
|
||||||
- marchewka NIE ROZPOZNAL
|
|
||||||
|
BIN
imgs/cabbage.jpg
BIN
imgs/cabbage.jpg
Binary file not shown.
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 120 KiB |
6
main.py
6
main.py
@ -4,6 +4,7 @@ import dijkstra as di
|
|||||||
|
|
||||||
import matplotlib.pyplot as plt
|
import matplotlib.pyplot as plt
|
||||||
from tensorflow.keras.preprocessing import image
|
from tensorflow.keras.preprocessing import image
|
||||||
|
from tensorflow.keras.models import load_model
|
||||||
from tensorflow.keras.applications import MobileNetV2
|
from tensorflow.keras.applications import MobileNetV2
|
||||||
from tensorflow.keras.applications.mobilenet import preprocess_input, decode_predictions
|
from tensorflow.keras.applications.mobilenet import preprocess_input, decode_predictions
|
||||||
import numpy as np
|
import numpy as np
|
||||||
@ -49,7 +50,7 @@ class Game(object):
|
|||||||
imgs.append(img_dir + '/' + random.choice(os.listdir(img_dir)))
|
imgs.append(img_dir + '/' + random.choice(os.listdir(img_dir)))
|
||||||
|
|
||||||
#model do rozpoznawania
|
#model do rozpoznawania
|
||||||
model = MobileNetV2(input_shape=None, alpha=1.0, include_top=True, weights="imagenet", input_tensor=None, pooling=None, classes=1000)
|
model = load_model('moj_model.h5')
|
||||||
|
|
||||||
#inicjalizacja
|
#inicjalizacja
|
||||||
pygame.init()
|
pygame.init()
|
||||||
@ -138,8 +139,7 @@ class Game(object):
|
|||||||
#detektor roslin, 5 rezultatow
|
#detektor roslin, 5 rezultatow
|
||||||
plt.imshow(img)
|
plt.imshow(img)
|
||||||
preds = model.predict(x)
|
preds = model.predict(x)
|
||||||
decoded = decode_predictions(preds, top=1)
|
print("kapusta, kalafior, grzyb, dynia\n {}\n".format(preds) )
|
||||||
print(decoded)
|
|
||||||
plt.show()
|
plt.show()
|
||||||
|
|
||||||
|
|
||||||
|
BIN
moj_model.h5
Normal file
BIN
moj_model.h5
Normal file
Binary file not shown.
36
net_training.py
Normal file
36
net_training.py
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
import matplotlib.pyplot as plt
|
||||||
|
from tensorflow.keras.preprocessing.image import ImageDataGenerator
|
||||||
|
from tensorflow.keras.applications import MobileNetV2
|
||||||
|
from tensorflow.keras.applications.mobilenet import preprocess_input, decode_predictions
|
||||||
|
from tensorflow.keras.layers import Dense
|
||||||
|
from tensorflow.keras.models import Model
|
||||||
|
import numpy as np
|
||||||
|
import os, random
|
||||||
|
|
||||||
|
#podstawa modelu
|
||||||
|
base_model = MobileNetV2(include_top=False, weights="imagenet", pooling='avg')
|
||||||
|
|
||||||
|
#model
|
||||||
|
x=base_model.output
|
||||||
|
preds=Dense(4,activation='softmax')(x)
|
||||||
|
model=Model(inputs=base_model.input,outputs=preds)
|
||||||
|
|
||||||
|
#tylko ostatnie 20 warstw uczymy
|
||||||
|
for layer in model.layers[:20]:
|
||||||
|
layer.trainable=False
|
||||||
|
for layer in model.layers[20:]:
|
||||||
|
layer.trainable=True
|
||||||
|
|
||||||
|
#generator obrazkow
|
||||||
|
train_datagen=ImageDataGenerator(preprocessing_function=preprocess_input)
|
||||||
|
|
||||||
|
train_generator=train_datagen.flow_from_directory('./dataset', target_size=(224,224), color_mode='rgb', batch_size=32, class_mode='categorical', shuffle=True)
|
||||||
|
|
||||||
|
|
||||||
|
#uczenie //to dzielenie i podloga
|
||||||
|
model.compile(optimizer='Adam',loss='categorical_crossentropy',metrics=['accuracy'])
|
||||||
|
step_size_train=train_generator.n//train_generator.batch_size
|
||||||
|
model.fit_generator(generator=train_generator, steps_per_epoch=step_size_train, epochs=10)
|
||||||
|
|
||||||
|
#zapis
|
||||||
|
model.save('moj_model.h5')
|
BIN
ss/adamski1.png
BIN
ss/adamski1.png
Binary file not shown.
Before Width: | Height: | Size: 976 KiB After Width: | Height: | Size: 1.2 MiB |
BIN
ss/adamski2.png
Normal file
BIN
ss/adamski2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 204 KiB |
Loading…
Reference in New Issue
Block a user